- How to get pid of just started process
- 8 Answers 8
- You can use sh -c and exec to get the command’s PID even before it runs.
- How it works:
- Parts of that command could occasionally be omitted, but not usually.
- Как узнать PID процесса в Linux
- Как узнать pid процесса Linux
- 1. ps
- 2. pgrep
- 3. pidof
- 4. pstree
- Как узнать PID скрипта
- Каким процессом занят файл Linux
- Кто использовал файл в Linux
- Какой процесс использует порт в Linux
- Выводы
- How to Find the PID and PPID of a Process in Linux
- Linux process basics
- What is a PID?
- What is a PPID?
- Getting the PID of a process
- Getting PPID from a child process’s PID
- Checking the PID and PPID of the currently running process
- Wrapping up
How to get pid of just started process
Is there any simpler solution? I would be happy to execute myCommand and get its PID as a result of one line command.
8 Answers 8
What can be simpler than echo $! ? As one line:
in a bash script, in a loop which starts programs, $! is not accurate. Sometimes it returns pid of the script itself, sometimes of grep or awk run from the script any solution to specifically get the pid of the process just launched in this scenario? something like pid= myprogram would have been awesome
NB that this requires you to start the command using a & as the previous line, otherwise the echo basically returns blank.
This doesn’t work if you don’t explicitly background the process! For instance, your process may background itself after it has done something you need to wait for before continuing.
You can use sh -c and exec to get the command’s PID even before it runs.
To start myCommand , so that its PID is printed before it begins to run, you can use:
sh -c 'echo $$; exec myCommand'
How it works:
This starts a new shell, prints the PID of that shell, and then uses the exec builtin to replace the shell with your command, ensuring it has the same PID. When your shell runs a command with the exec builtin, your shell is actually becoming that command, rather than the more common behavior of forking a new copy of itself, which has its own separate PID and which then becomes the command.
I find this to be much simpler than alternatives involving asynchronous execution (with & ), job control, or searching with ps . Those approaches are fine, but unless you have a specific reason to use them—for example, perhaps the command is already running, in which case searching for its PID or using job control would make sense—I suggest considering this way first. (And I would certainly not consider writing a complex script or other program to achieve this).
This answer includes an example of this technique.
Parts of that command could occasionally be omitted, but not usually.
Even if the shell you’re using is a Bourne-style and thus supports the exec builtin with these semantics, you generally shouldn’t try to avoid using sh -c (or equivalent) to create a new, separate shell process for this purpose, because:
- Once the shell has become myCommand , there’s no shell waiting to run subsequent commands. sh -c ‘echo $$; exec myCommand; foo would not be able to attempt to run foo after replacing itself with myCommand . Unless you’re writing a script that runs this as its last command, you can’t just use echo $$; exec myCommand in a shell where you are running other commands.
- You cannot use a subshell for this. (echo $$; exec myCommand) may be syntactically nicer than sh -c ‘echo $$; exec myCommand’ , but when you run $$ inside ( ) , it gives the PID of the parent shell, not of the subshell itself. But it is the subshell’s PID that will be the PID of the new command. Some shells provide their own non-portable mechanisms for finding the subshell’s PID, which you could use for this. In particular, in Bash 4, (echo $BASHPID; exec myCommand) does work.
Finally, note that some shells will perform an optimization where they run a command as if by exec (i.e., they forgo forking first) when it is known that the shell will not need to do anything afterward. Some shells try to do this anytime it is the last command to be run, while others will only do it when there are no other commands before or after the command, and others will not do it at all. The effect is that if your forget to write exec and just use sh -c ‘echo $$; myCommand’ then it will sometimes give you the right PID on some systems with some shells. I recommend against ever relying on such behavior, and instead always including exec when that’s what you need.
Как узнать PID процесса в Linux
Каждый процесс в операционной системе имеет свой уникальный идентификатор, по которому можно получить информацию об этом процессе, а также отправить ему управляющий сигнал или завершить.
В Linux такой идентификатор называется PID, и узнать его можно несколькими способами. В этой статье мы рассмотрим, как узнать PID процесса в Linux, а также зачем это может вам понадобиться.
Как узнать pid процесса Linux
1. ps
Самый распространённый способ узнать PID Linux — использовать утилиту ps:
ps aux | grep имя_процесса
Кроме нужного нам процесса, утилита также выведет PID для grep, ведь процесс был запущен во время поиска. Чтобы его убрать, добавляем такой фильтр:
ps aux | grep имя_процесса | grep -v grep
Например, узнаём PID всех процессов, имя которых содержит слово «Apache»:
ps aux | grep apache | grep -v grep
2. pgrep
Если вам не нужно видеть подробную информацию о процессе, а достаточно только PID, то можно использовать утилиту pgrep:
По умолчанию утилита ищет по командной строке запуска процесса, если нужно искать только по имени процесса, то надо указать опцию -f:
3. pidof
Эта утилита ищет PID конкретного процесса по его имени. Никаких вхождений, имя процесса должно только совпадать с искомым:
С помощью опции -s можно попросить утилиту выводить только один PID:
4. pstree
Утилита pstree позволяет посмотреть список дочерних процессов для определённого процесса, также их pid-идентификаторы. Например, посмотрим дерево процессов Apache:
Как узнать PID скрипта
Когда вы запускаете скрипт в оболочке, например Bash запускается процесс известный как подоболочка и выполняет последовательно все команды скрипта. Чтобы узнать PID процесса подоболочки Bash, запущенной для скрипта, обратитесь к специальной переменной $$. Эта переменная доступна только для чтения, поэтому вы не сможете ее редактировать:
#!/bin/bash
echo «PID этого скрипта: $$»
Каким процессом занят файл Linux
Выше мы рассмотрели, как получить PID процесса Linux по имени, а теперь давайте узнаем PID по файлу, который использует процесс. Например, мы хотим удалить какой-либо файл, а система нам сообщает, что он используется другим процессом.
С помощью утилиты lsof можно посмотреть, какие процессы используют директорию или файл в данный момент. Например, откроем аудио-файл в плеере totem, а затем посмотрим, какой процесс использует её файл:
В начале строки мы видим название программы, а дальше идёт её PID. Есть ещё одна утилита, которая позволяет выполнить подобную задачу — это fuser:
Здесь будет выведен только файл и PID процесса. После PID идёт одна буква, которая указывает, что делает этот процесс с файлом или папкой:
- c — текущая директория;
- r — корневая директория;
- f — файл открыт для чтения или записи;
- e — файл выполняется как программа;
- m — файл подключен в качестве библиотеки.
Кто использовал файл в Linux
Узнать процесс, который сейчас занимает файл, достаточно просто. Но как узнать, какой процесс обращается к файлу не надолго, например, выполняет его как программу или читает оттуда данные? Эта задача уже труднее, но вполне решаема с помощью подсистемы ядра auditd. В CentOS набор программ для работы с этой подсистемой поставляется по умолчанию, в Ubuntu же его придётся установить командой:
Теперь создаём правило для мониторинга. Например, отследим, кто запускает утилиту who:
auditctl -w /usr/bin/who -p x -k who_exec
Здесь -w — адрес файла, который мы будем отслеживать, —p — действие, которое нужно отслеживать, —k — произвольное имя для правила. В качестве действия могут использоваться такие варианты:
Теперь выполним один раз who и посмотрим, что происходит в логе с помощью команды ausearch:
sudo ausearch -i -k who_exec
Здесь в секции SYSCALL есть PID процесса, под которым была запущена программа, а также PPID — программа, которая запустила нашу who. Копируем этот PID и смотрим информацию о нём с помощью ps:
Становиться понятно, что это bash.
Какой процесс использует порт в Linux
Иногда необходимо узнать PID Linux-программы, которая использует сетевой порт, например 80. Для этого можно использовать утилиту ss:
Мы видим, что это несколько процессов Apache. Использовав опцию dport, можно узнать, какой процесс отправляет данные на указанный порт:
Выводы
В этой статье мы рассмотрели, как узнать PID процесса в Linux по различным условиям: имени или файлу. Как видите, всё достаточно просто, и в считанные минуты можно можно понять, что происходит с вашей операционной системой, и какой процесс за это отвечает.
Обнаружили ошибку в тексте? Сообщите мне об этом. Выделите текст с ошибкой и нажмите Ctrl+Enter.
How to Find the PID and PPID of a Process in Linux
Knowing the PID and PPID of a process can be helpful if you need to manage or interact with a process running on your system.
There are numerous ways to get the PID (Process ID) and PPID (Parent Process ID) of a given process in Linux.
Command | Description |
---|---|
pidof process_name | Works with exact process name |
pgrep process_name | Returns PID of all matches |
ps -o ppid= -p PID | Get the PPID from PID |
$$ | PID of current process/shell |
$ | PID of current process’s parent |
I’ll explain these commands in detail but before that a quick recap of process, PID and PPID.
Linux process basics
Everything that runs on your system is ran via something known as a process, with that simply being the running instance of a program.
All the processes that run on your system are assigned identifiers. These can be helpful if you want to monitor the process (for example, such as to see how much memory or CPU it is using), or maybe if you want to end it if it starts to hang or just act a bit funky.
The identifiers that get attached to all these processes are known as PIDs and PPIDs.
What is a PID?
PID stands for «process ID». Again, this is simply the identifier that gets attached to a program when it starts running, and can be helpful if you need to interact with the process in one way or another.
What is a PPID?
PPID is quite closely related to a PID. PPID stands for «parent process ID», and if you didn’t get it already, it simply stands for the process that created the process you are checking.
For example, let’s say that we have two processes. One is named «spawner», and has a process ID (or PID) of 7234. Our second process, «email client», has a process ID of 7456 when we create it. Our spawner program starts our email client, resulting in our email client having a PID of 7456, and a PPID of 7234, since the spawner (which had the PID of 7234) is what spawned the email client.
Now that you have brushed up your basic, let’s see how to get the process ID in Linux.
Getting the PID of a process
The important thing here is to know the name of the process whose PID you want to find.
If you know the exact process name, you can get its process ID using the pidof command:
Easier said than done because you may not always know the exact process name. Good thing here is that pidof command works with tab completion so if you know the starting few letters of the process name, you can hit tab to get matching suggestions.
However, that may not always work if the process name doesn’t match to what you think it is called. For example, the process for Edge browser on Linux is called msedge . It doesn’t start with ‘edge’ and the tab completion won’t work if you focus on ‘edge’.
So, what you can do is to resort to the ps command in Linux to list all the running processes from all users and then use grep on the output to filter the result.
ps aux | grep -i partial_process_name
There is a dedicated command that combines the features ps and grep command and it is unsurprisingly called pgrep:
pgrep partial_or_exact_process_name
The default output shows only the PIDs without any information on the process. This could be troublesome if there is more than one process IDs returned for your searched term.
Hence, I suggest using the listing feature to make sure that you are getting the PID of the desired process.
pgrep -l partial_or_exact_process_name
You may also use the top command to get the process information but it cannot be used in scripts.
You can use the pstree command to get the PIDs of all running process on your Linux system: pstree -p -a
Getting PPID from a child process’s PID
Once you know the PID of a process, it is effortless to find the PPID for that process.
You can simply run the following command, replacing PID with the current process (child) ID:
In a shell, the above command and $ should both return the same output:
And that’s about everything there is to finding PIDs and PPIDs!
Checking the PID and PPID of the currently running process
If you’re in a shell such as Bash, it’s extremely easy to find the PID and PPID of the calling process (which will usually be the shell).
Bash stores the PID’s value under the $$ variable, and the PPID under the $ variable:
And it’s that easy! Finding the PIDs and PPIDs of other processes isn’t much harder either.
Wrapping up
You should now know everything you need to find both PIDs and PPIDs for running processes on your system.
If you need any help getting something working, or just got some remaining questions, feel free to leave that and anything else in the comments below.