- Как получить Родительский PID данного процесса в GNU / Linux из командной строки?
- 9 ответов
- How to find the Process ID of a program in Linux
- What is process ID (PID)?
- What is parent process ID (PPID)?
- 1) Finding a process ID (PID) with pidof command
- 2) How to search a process ID (PID) in Linux, using pgrep command?
- 3) locating a process ID (PID) with pstree
- 4) How to find a process ID (PID) using ps command?
- 5) Finding a process ID (PID) using ss command
- 6) Finding a process ID (PID) with netstat command
- 7) How to find a process ID (PID) in Linux, using lsof command?
- 8) Searching a process ID (PID) using fuser command
- 9) How to find a process ID (PID) in Linux, using systemctl command?
- Conclusion
- Linux get pid parent
- 6.2. Использование getpid() и getppid()
- 6.3. Порождение процесса
- 6.4. Замена образа процесса
Как получить Родительский PID данного процесса в GNU / Linux из командной строки?
решено перед вопросом: cat /proc/1111/status | grep PPid
9 ответов
если для функции или скрипта не указан PID, по умолчанию они показывают PPID текущего процесса.
для использования псевдонима необходимо указать PID.
Это одна из тех вещей, которые я узнал, забыть, вспомнить, повторить. Но это действительно полезно. Флаг ‘s ‘ команды pstree показывает дерево с листом в N:
Родительский pid находится в переменной оболочки PPID, поэтому
напечатает ID родителей ( PPID ) всех процессов.
для одиночного процесса, как раз пройдите PID, как: ps j 1234 .
извлечь только значение, выходной фильтр awk , например:
перечислить PIDs всех родителей, а затем использовать pstree , например:
чтобы получить Родительский PID текущего процесса, используйте echo $$ .
Read/proc/$PID / status. Можно легко написать сценарий:
немного более сложный пример, проверяющий команду родителя, запустившего текущий процесс Измените comm= на cmd=, чтобы увидеть full command
вот быстрое решение, которое также должно работать:
Run top с любыми вариантами вы хотите, как -u username and -p PID .
и А top работает клавишу f , оно показывает список опций, которые вы хотите отобразить в top выход, и показанные параметры будут показаны в прописных буквах и параметрах которые или не показ будет показан в маленьких буквах.
таким образом, введя букву перед параметром вы можете включить или отключить его. Для ID родительского процесса необходимо ввести b а затем нажмите Enter , оно покажет PPID в верхнем выходе.
Источник
How to find the Process ID of a program in Linux
When working on a Linux system, sometimes you need to figure out what processes are running and which PID or PPID is tied to it. It can be used for several purposes.
Basically, we search for a PID in Linux to kill an unresponsive program, which can be done by the GUI task manager, but CLI is the most efficient way to handle unresponsive programs.
This is better than the GUI, because sometimes GUI-based tools may not show the still running hidden process.
In this tutorial, we will show you how to find the process ID (PID) of a program running in many ways in Linux.
What is process ID (PID)?
PID refers to process ID, which is commonly used by most operating system kernels, such as Linux, Unix, MacOS and Windows.
This is a unique ID that is automatically assigned to each process when it is created. A process is a running instance of a program.
What is parent process ID (PPID)?
A parent process is a process that has created one or more child processes. Each child process is given a Parental Process ID (PPID), and the parent process kills the child when it completes their operation.
You may be interested to read the below articles, as these are related to this topic.
Each time the process ID is changed for all processes except init. The init process is always the first process in the system and the ancestor of all other processes, it holds PID 1.
The default maximum value of PIDs is 32768 on 32-bit machine. And you can set the value higher on 64-bit systems up to 2^22 (approximately 4 million). This can be verified by running the following command on your machine:
You may ask, why do we need such large number of PIDs? This is because PIDs cannot be reused immediately and also to prevent potential errors.
You can find the PID of processes running on the system using the below nine command.
- pidof: pidof – find the process ID of a running program.
- pgrep: pgre – look up or signal processes based on name and other attributes.
- ps: ps – report a snapshot of the current processes.
- pstree: pstree – display a tree of processes.
- ss: ss is used to dump socket statistics.
- netstat: netstat is displays a list of open sockets.
- lsof: lsof – list open files.
- fuser: fuser – list process IDs of all processes that have one or more files open
- systemctl: systemctl – Control the systemd system and service manager
To prove this, we are going to find the Apache process ID. Make sure to enter your process name instead of ours.
1) Finding a process ID (PID) with pidof command
The pidof command is used to find the process ID of the running program. It prints those IDs into the standard output. To demonstrate this, we will be finding the ‘Apache2’ process id in the system.
In the above output you may have difficulties identifying the process ID because it displays all PIDs (including parent and child) against the process name.
So we need to find the Parent Process PID (PPID), which is what we are looking for. This will be the first number. In my case it is 3754 and it is sorted in descending order.
2) How to search a process ID (PID) in Linux, using pgrep command?
The pgrep command looks at the processes currently running, and lists the process IDs that match the selection criteria.
The above output is similar to the ‘pidof’ command output, but it sorted the results in ascending order, which clearly shows that the parent process PID is standing at last.In my case it is 3754 .
Note: Identifying the parent process ID can be problematic when using the ‘pidof’ & ‘pgrep’ command, as each process comes with a single PPID and multiple PIDs which doesn’t show a clear demarcation between them. Hence please exercise caution while looking at the results.
3) locating a process ID (PID) with pstree
The pstree command shows running processes as a tree-like format which is very convenient way to display the process hierarchy and makes the output more visually appealing. If a user name is specified in the pstree command then it shows all the processes owned by the respective user.
pstree visually merges identical branches by putting them in square brackets and prefixing them with the repetition count.
To get only the parent process, use the following format.
‘pstree’ command is much better than the ‘pidof’ & ‘pgrep’ commands, because it separates parent from the child processes which is not possible by them.
4) How to find a process ID (PID) using ps command?
The ps command displays information about a selection of the active processes which includes the process ID (pid=PID), terminal associated with the process (tname=TTY), cumulated CPU time in [DD-]hh:mm:ss format (time=TIME), and executable name (ucmd=CMD). Output is unsorted by default.
The Parent Process ID (PPID) can be easily identified based on the process start date from the above output. In our case the ‘Apache2’ process started on December 11th , which is the parent process and the others are the child processes. The PID of Apache2 is 3754 .
5) Finding a process ID (PID) using ss command
The ss command is used to dump socket statistics. It allows showing information similar to netstat. It can display more TCP and state information than other tools.
It can display stats for all kind of sockets such as PACKET, TCP, UDP, DCCP, RAW, Unix domain, etc.
6) Finding a process ID (PID) with netstat command
The netstat command is used to print network connections, routing tables, interface statistics, masquerade connections, and multicast memberships. By default, netstat displays a list of open sockets.
If you don’t specify any address families, then the active sockets of all configured address families will be printed. This program is obsolete. Replacement for netstat is ss.
7) How to find a process ID (PID) in Linux, using lsof command?
The lsof command is used to list open files. The Linux lsof command lists information about files that are open by processes running on the system.
8) Searching a process ID (PID) using fuser command
The fuser utility shall write to standard output, the process IDs of processes running on the local system that have one or more named files open.
9) How to find a process ID (PID) in Linux, using systemctl command?
The systemctl command is used to control the systemd service manager. This is a replacement for the old SysVinit system management, and most of the modern Linux operating systems have been moved to the systemd.
Conclusion
We have shown you several command to find out the PIDs of a specific running program in Linux.
If you have questions, feel free to leave a comment below.
Источник
Linux get pid parent
Эта глава открывает большую и очень важную для Linux-программиста тему многозадачности. Описать все сразу не получится, поэтому мы будем неоднократно возвращаться к многозадачности в последующих главах книги. Пристегните ремни покрепче!
Наберите в своей оболочке следующую команду:
На экран будут выведен список всех работающих в системе процессов. Если хотите посчитать количество процессов, наберите что-нибудь, набодобие этого:
Первое число — это количество работающих в системе процессов. Пользователи KDE могут воспользоваться программой kpm, а пользователи Gnome — программой gnome-system-monitor для получения информации о процессах. На то он и Linux, чтобы позволять пользователю делать одно и то же разными способами.
Возникает вопрос: «Что такое процесс?». Процессы в Linux, как и файлы, являются аксиоматическими понятиями. Иногда процесс отождествляют с запущенной программой, однако это не всегда так. Будем считать, что процесс — это рабочая единица системы, которая выполняет что-то. Многозадачность — это возможность одновременного сосуществования нескольких процессов в одной системе.
Linux — многозадачная операционная система. Это означает что процессы в ней работают одновременно. Естественно, это условная формулировка. Ядро Linux постоянно переключает процессы, то есть время от времени дает каждому из них сколько-нибудь процессорного времени. Переключение происходит довольно быстро, поэтому нам кажется, что процессы работают одновременно.
Одни процессы могут порождать другие процессы, образовывая древовидную структуру. Порождающие процессы называются родителями или родительскими процессами, а порожденные — потомками или дочерними процессами. На вершине этого «дерева» находится процесс init, который порождается автоматически ядром в процесссе загрузки системы.
К каждому процессу в системе привязана пара целых неотрицательных чисел: идентификатор процесса PID (Process IDentifier) и идентификатор родительского процесса PPID (Parent Process IDentifier). Для каждого процесса PID является уникальным (в конкретный момент времени), а PPID равен идентификатору процесса-родителя. Если ввести в оболочку команду ps -ef, то на экран будет выведен список процессов со значениями их PID и PPID (вторая и третья колонки соотв.). Вот, например, что творится у меня в системе:
Надо отметить, что процесс init всегда имеет идентификатор 1 и PPID равный 0. Хотя в реальности процесса с идентификатором 0 не существует. Дерево процессов можно также пресставить в наглядном виде при помощи опции —forest программы ps:
Если вызвать программу ps без аргументов, то будет выведен список процессов, принадлежащих текущей группе, то есть работающих под текущим терминалом. О том, что такое терминалы и группы процессов, будет рассказано в последующих главах.
6.2. Использование getpid() и getppid()
Процесс может узнать свой идентификатор (PID), а также родительский идентификатор (PPID) при помощи системных вызовов getpid() и getppid().
Системные вызовы getpid() и getppid() имеют следующие прототипы:
Для использования getpid() и getppid() в программу должны быть включены директивой #include заголовочные файлы unistd.h и sys/types.h (для типа pid_t). Вызов getpid() возвращает идентификатор текущего процесса (PID), а getppid() возвращает идентификатор родителя (PPID). pid_t — это целый тип, размерность которого зависит от конкретной системы. Значениями этого типа можно оперировать как обычными целыми числами типа int.
Рассмотрим теперь простую программу, которая выводит на экран PID и PPID, а затем «замирает» до тех пор, пока пользователь не нажмет .
Проверим теперь, как работает эта программа. Для этого откомпилируем и запустим ее:
Теперь, не нажимая , откроем другое терминальное окно и проверим, правильность работы системных вызовов getpid() и getppid():
6.3. Порождение процесса
Как уже говорилось ранее, процесс в Linux — это нечто, выполняющее программный код. Этот код называют образом процесса (process image). Рассмотрим простой пример, когда вы находитесь в оболочке bash и выполняете команду ls. В этом случае происходит следующее. Образ программы-оболочки bash выполняется в процессе #1. Затем вы вводите команду ls, и оболочка определяет, что нужно запустить внешнюю программу (/bin/ls). Тогда процесс #1 создает свою почти точную копию, процесс #2, который выполняет тот же самый программный код. После этого процесс #2 заменяет свой текущий образ (оболочку) другим образом (программой /bin/ls). В итоге получаем отдельный процесс, выполняющий отдельную программу.
«К чему такая путаница?» — спросите вы. Зачем сначала «клонировать» процесс, а затем заменять в нем образ? Не проще ли все делать одной-единственной операцией? Ответы на подобные вопросы дать тяжело, но, как правило, с опытом прихоидит понимание того, что подобная схема является одной из граней красоты Unix-систем.
Попробуем все-таки разобраться, почему в Unix-системах порождение процесса отделено от запуска программы. Для этого выясним, что же происходит с данными при «клонировании» процесса. Итак, каждый процесс хранит в своей памяти различные данные (переменные, файловые дескрипторы и проч.). При порождении нового процесса, потомок получает точную копию данных родителя. Но как только новый процесс создан, родитель и потомок уже распоряжаются своими копиями по своему усмотрению. Это позволяет распараллелить программу, заставив ее выполнять какой-нибудь трудоемкий алгоритм в отдельном процессе.
Может быть кто-то из вас слышал про то, что в Linux есть потоки, которые позволяют в одной программе реализовывать параллельное выполнение нескольких функций. Опять же возникает вопрос: «Если есть потоки, зачем вся эта головомойка с клонированиями и заменой образов?». А дело в том, что потоки работают с общими данными и выполняются в одной программе. Если в потоке произошло что-то страшное, то это, как правило, отражается на всей программе в целом. Хотя технически потоки реализованы в Linux на базе процессов, но процесс все же является более независимой единицей. Крах дочернего процесса никак не отражается на работе родителя, если сам родитель этого не пожелает.
По правде сказать, программисты редко прибегают к методике распараллеливания одной программы при помощи процессов. Но суть в том, что в Unix-системах программист обладает полной свободой выбора стратегии многозадачности. И это здорово!
Разберемся теперь с тем, как на практике происходит «клонирование» процессов. Для этого используется простой системный вызов fork(), прототип которого находится в файле unistd.h:
Если fork() завершается с ошибкой, то возвращается -1. Это редкий случай, связанный с нехваткой памяти или превышением лимита на количество процессов. Но если разделение произошло, то программе нужно позаботиться об идентификации своего «Я», то есть определении того, где родитель, а где потомок. Это делается очень просто: в родительский процесс fork() возвращает идентификатор потомка, а потомок получает 0. Следующий пример демонстрирует то, как это происходит.
Проверяем, что получилось:
Обратите внимание, что поскольку после вызова fork() программу выполняли уже два независимых процесса, то сообщение родителя вполне могло бы появиться первым.
6.4. Замена образа процесса
Итак, теперь мы умеем порождать процессы. Научимся теперь заменять образ текущего процесса другой программой. Для этих целей используется системный вызов execve(), который объявлен в заголовочном файле unistd.h вот так:
Все очень просто: системный вызов execve() заменяет текущий образ процесса программой из файла с именем path, набором аргументов argv и окружением envp. Здесь следует только учитывать, что path — это не просто имя программы, а путь к ней. Иными словами, чтобы запустить ls, нужно в первом аргументе указать «/bin/ls».
Массивы строк argv и envp обязательно должны заканчиваться элементом NULL. Кроме того, следует помнить, что первый элемент массива argv (argv[0]) — это имя программы или что-либо иное. Непосредственные аргументы программы отсчитываются от элемента с номером 1.
В случае успешного завершения execve() ничего не возвращает, поскольку новая программа получает полное и безвозвратное управление текущим процессом. Если произошла ошибка, то по традиции возвращается -1.
Рассмотрим теперь пример программы, которая заменяет свой образ другой программой.
Итак, данная программа выводит свой PID и передает безвозвратное управление программе cat без аргументов и без окружения. Проверяем:
Программа вывела идентификатор процесса и замерла в смиренном ожидании. Откроем теперь другое терминальное окно и проверим, что же творится с нашим процессом:
Итак, мы убедились, что теперь процесс 30150 выполняет программа cat. Теперь можно вернуться в исходное окно и нажатием Ctrl+D завершить работу cat.
И, наконец, следующий пример демонстрирует запуск программы в отдельном процессе.
Обратите внимание, что поскольку execve() не может возвращать ничего кроме -1, то для обработки возможной ошибки вовсе не обязательно создавать ветвление. Иными словами, если вызов execve() возвратил что-то, то это однозначно ошибка.
Источник