Как эти понятия процесса связаны вместе - background
, zombie
, daemon
и without controlling terminal
?
Я чувствую, что они как-то близки, особенно благодаря концепции controlling terminal
, но у меня все еще не так много информации, чтобы рассказать историю, например, если вам нужно что-то объяснить ребенку, читающему статью о Linux, не лгая слишком много.
ОБНОВЛЕНИЕ № 1: Например (я не знаю, правда ли это)
background
-zombie
- процесс переднего плана не может статьzombie
, потому чтоzombie
это фоновый процесс , который был оставлен без родителейdaemon
-without ctty
- всеdaemons
бежать безctty
, но не все процессы , неctty
являютсяdaemons
background
-daemon
-background process
можно получить, чтобы снова запустить в интерактивном режиме,daemon is not
zombie
-without ctty
-zombie
безразлично, есть лиctty
к нему привязанный или нетbackground
-without ctty
-processes
отправляются на задний план, пока они естьctty
, и становятся демонами или умирают, если уctty
них взят
background-process
daemon
job-control
zombie-process
controlling-terminal
анатолий техтоник
источник
источник
fork()
отключить свою копию, использоватьexec()
в этой копии заменить его тем, что вы хотите запустить, и использоватьwait()
в исходном экземпляре программы (а не в той копии, которая была запущенаexec()
). За очень короткий промежуток времени междуwait()
выходом ребенка и получением статуса выхода (удаление его из таблицы процессов и возвращение вызывающей стороне) у вас появляется зомби.Ответы:
Короче плюс ссылки.
живой мертвец
процесс, который завершился / завершился, но родитель которого еще не подтвердил завершение (используя
wait()
системные вызовы). Мертвые процессы хранятся в таблице процессов, так что их родитель может быть проинформирован о том, что их дочерний процесс завершает дочерний процесс, и о своем статусе выхода. Обычно программа разветвления детей также будет читать их статус выхода при выходе, поэтому вы увидите зомби, только если родитель остановлен или глючит.Видеть:
waitpid(2)
управляющий терминал, сеанс, передний план, фон
Они связаны с управлением заданиями в контексте оболочки, запущенной на терминале. Пользователь входит в систему, сеанс запускается, привязывается к терминалу (управляющему терминалу) и запускается оболочка. Затем оболочка запускает процессы и отправляет их на передний план и фон по желанию пользователя (используя
&
при запуске процесса, останавливая его^Z
, используяfg
иbg
). Процессы в фоновом режиме останавливаются при чтении или записи с терминала; процессы на переднем плане получают сигнал прерывания, если^C
его ударили по терминалу. (Это драйвер терминала ядра, который обрабатывает эти сигналы, оболочка контролирует, какой процесс (группа) отправляется на передний план или в фон.Видеть:
демон
Процесс, работающий как демон, обычно не должен быть привязан к какому-либо конкретному терминалу (или сеансу входа в систему, или оболочке). У него не должно быть управляющего терминала, так что он не будет принимать сигналы, если терминал закрывается, и обычно он не хочет, чтобы он также выполнял ввод-вывод на терминале. Запуск демона из командной строки требует разрыва всех связей с терминалом, то есть запуска нового сеанса (в смысле управления заданиями выше), чтобы избавиться от управляющего терминала, и закрытия файловых дескрипторов для терминала. Конечно, что-то, начатое из
init
systemd или аналогичного за пределами сеанса входа в систему, не будет иметь этих связей для начала.Поскольку у демона нет управляющего терминала, он не подлежит управлению заданиями, и нахождение на «переднем плане» или «фоне» в смысле управления заданиями неприменимо. Кроме того, демоны, как правило, переопределяют,
init
что очищает их при выходе, поэтому вы обычно не видите их как зомби.Видеть:
daemon(7)
.источник
Зомби на самом деле не имеет отношения к другим; это просто процесс, который завершился, но его родительский процесс еще не прочитал свой статус завершения с
waitpid()
или подобный. Вы не должны видеть их, если процесс не глючит или не останавливается.Демон это программа , которая работает без управляющего терминала. Обычно, когда вы запускаете программу, она
fork()s
сама и родитель покидают ее, поэтому оболочка думает, что команда завершилась, и дочерний процесс отсоединяется от терминала и выходит из сеанса входа в систему. Поскольку родительский процесс завершен, его идентификатор родительского процесса становится равным 1, что традиционно являетсяinit
программой или в наши дниsystemd
. Этот процесс гарантирует, что его дети пожнут, когда они умрут, чтобы вы не заполнились зомби.Процесс может быть связан с управляющим терминалом , откуда он обычно получает свой вход и отправляет свой выход. Терминал также может отправлять сигналы процессам, прикрепленным к нему, и идентифицирует группу процессов как группу переднего плана . Процессам, входящим в группу переднего плана , разрешено считывать ввод с терминала, и отправляются сигналы SIGINT и SIGSUSP при нажатии клавиш Ctrl-C и Ctrl-Z. Любой процесс, не входящий в группу переднего плана, который пытается прочитать с терминала, приостанавливается с помощью SIGTSTP.
Оболочка создает различные группы процессов для каждой команды конвейера, которую вы просите ее выполнить, и смещает, какая из них является группой переднего плана для перемещения заданий между передним планом и фоном. Когда вы запускаете команду, обычно оболочка создает новую группу процессов и делает эту группу приоритетной . Если вы добавляете суффикс к нему,
&
то оболочка просто покидает группу переднего плана, где она была, и поэтому новая группа находится в фоновом режиме. Нажатие Ctrl-Z отправляет SIGSUSP в группу переднего плана, что приводит к приостановке большинства команд, но вместо приостановки оболочка заменяет активную группу переднего плана на себя, чтобы она могла запросить у вас новую команду.Команда
bg
отправляет SIGCONT группе процессов, чтобы он мог продолжить работу в фоновом режиме после того, как был приостановлен с помощью SIGSUSP.fg
изменяет группу переднего плана на одну из существующих групп, уже работающих в фоновом режиме, переводя ее на передний план.источник
Хорошо, вот мое объяснение с акцентом на различия между этими типами процессов (короткий, но информативный):
zombie
- процесс, который только что вышел (завершил свое выполнение), но все еще имеет запись в таблице процессов. Примечание : у зомби- процесса все еще есть родительский процесс, и обычно весь смысл его существования состоит в том, чтобы сообщить этому родительскому процессу о результате выполнения дочернего процесса (код завершения и т. Д.).disowned process
(без управления терминалом) - процесс, который был либо явноdisown
'отредактирован пользователем, либо предназначен для отделения от родительского дерева процессов. Он все равно будет работать, даже если родительский процесс завершит выполнение. Например, пользовательssh
перешел на удаленный компьютер, запустил что-то вроде веб-сервера, затем запустилdisown
его и вышел изssh
сеанса. Процесс все еще будет работать, так как он больше не является частью родительского дерева процессов. Процесс также можно отрицать, запустив егоnohup
.background process
- работает в фоновом режиме - не разделяет вывод на tty пользователя. Либо был запущен&
в конце, либо разветвился на задний план. Другой вариант отправить процесс в фоновый режим - запустить его и нажатьctrl+z
. Тем не менее, когда родительский процесс завершится, дочерний процесс, работающий в фоновом режиме, также завершит работу ( обратите внимание , @psusi - предыдущий факт верен только для процессов, запущенных пользователем из терминала; в противном случае дочерний процесс становится «слоном» и получает Процесс инициализации (pid 1) как родитель).daemon
- очень похоже на фоновый процесс. Также работает в фоновом режиме, но, скорее всего, был неявно разветвлен (по замыслу). Обычно он спокойно сидит в фоновом режиме, ожидая какого-то события, и только тогда выполняет реальную работу (входящее соединение и т. Д.). На самом деле, демон может быть как отречён (более вероятно), так и от фонового процесса в зависимости от его дизайна.Надеюсь, что это объяснение поможет различить эти типы процессов.
источник
tree
. Да, конечно, родитель не должен завершаться после завершения дочернего процесса (но это может быть сделано, если он ожидает, пока дочерний процесс завершит обработку какого-либо рода вещей). Но если родитель прекратит работу, то ребенок обязательно прекратит работу. Вы можете запуститьtop
из своего терминала и затем нажать,shift-v
чтобы увидеть деревья процессов в дикой природе.