Кратко, схема процессов в Linux (да и любой другой UNIX-like системе) выглядит как дерево. Первым всегда запускается процесс init
с номером 1, который порождает все остальные процессы.
Запущенный в обычном режиме процесс получает собственный PID (Process ID)
, а в качестве PPID
(Parent Process ID
– ID родительского процесса) – получает номер процесса, “от которого” он был запущен. При завершении работы родительского процесса – процесс-потомок так же прекратит свою работу, т.к. его “родительский процесс” отправит команду на завершение работы всех своих “потомков”.
Рассмотрим на примере:
# 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. А процесс top
– PID
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