UNIX: PID, PPID и nohup

Автор: | 18/08/2013
 

unix-logoКратко, схема процессов в Linux (да и любой другой UNIX-like системе) выглядит как дерево. Первым всегда запускается процесс init с номером 1, который порождает все остальные процессы.

Запущенный в обычном режиме процесс получает собственный PID (Process ID), а в качестве PPID (Parent Process IDID родительского процесса) – получает номер процесса, “от которого” он был запущен. При завершении работы родительского процесса – процесс-потомок так же прекратит свою работу, т.к. его “родительский процесс” отправит команду на завершение работы всех своих “потомков”.

Рассмотрим на примере:

# ps al
UID   PID  PPID CPU PRI NI    VSZ    RSS MWCHAN STAT  TT     TIME COMMAND
...
0  1332  1170   0  23  0  10832   2560 wait   Ss     3  0:00.53 /usr/local/bin/bash
0  1333  1332   0  21  0   9944   1868 select S+     3  0:00.14 top

Тут мы видим запущенный процесс интерпретатора bash, в котором выполняется программа top. Процесс bash имеет PID 1332. А процесс topPID 1333 и PPID – 1332, т.к. bash является для него “родителем”.

Теперь – завершим выполнение bash:

# kill -9 1332

# ps al | grep top
0  1341  1172   0  23  0    464    280 -      RL+    2  0:00.01 grep top

Сам процесс top так же был уничтожен.

Что бы избежать этого – достаточно запустить процесс с помощью команды nohup, о которой уже упоминалось в статье Linux&FreeBSD: команды kill, nohup — сигналы и управление процессами.

Посмотрим, как это работает.

# nohup ping ya.ru &
[2] 1578

Мы запускаем фоновую задачу ping с помощью nohup.

Подробнее о работе с фоновыми задачами можно прочитать в статье Linux: управление фоновыми процессами.

Проверим её PID и PPID:

# ps al | grep ping
4     0  1576  1567  20   0   4544   920 -      S    pts/1      0:00 ping ya.ru

PPID для ping 1567, который является процессом:

# ps al | grep 1567
4     0  1567  1563  20   0   5224  1720 -      S    pts/1      0:00 bash

Теперь – уничтожим процесс-родитель:

# kill -9 1567

И проверим, что стало с нашим процессом ping:

# ps al | grep ping
4     0  1576     1  20   0   4544   920 -      S    pts/1      0:00 ping ya.ru

Он продолжает работать, но вместо уничтоженного bash его “родителем” стал процесс init, у котрого PID всегда равен 1:

# ps aux | grep init
root         1  0.0  0.1   2844  1132 ?        Ss   05:34   0:01 /sbin/init