Кратко, схема процессов в 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




