Фон, зомби, демон и без ctty - эти понятия связаны?


8

Как эти понятия процесса связаны вместе - 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них взят

Процесс переднего плана, безусловно, может быть зомби, хотя, как правило, не в течение какого-либо заметного периода времени - обычный способ для оболочки (или другой программы) запустить подпроцесс на переднем плане - fork()отключить свою копию, использовать exec()в этой копии заменить его тем, что вы хотите запустить, и использовать wait()в исходном экземпляре программы (а не в той копии, которая была запущена exec()). За очень короткий промежуток времени между wait()выходом ребенка и получением статуса выхода (удаление его из таблицы процессов и возвращение вызывающей стороне) у вас появляется зомби.
Чарльз Даффи

@CharlesDuffy можно ли отправить родителя на задний план, оставив ребенка на переднем плане?
анатолий техтоник

В типичном контроле работы оболочка даже не знает, что внук вообще отделен от своего прямого потомка; он просто ждет, когда его ребенок уйдет, и если ребенок ждет выхода внука, ну, это дело ребенка. То есть, с точки зрения оболочки, которая породила родителя, она имеет дело только с одной единицей.
Чарльз Даффи

Ответы:


10

Короче плюс ссылки.

живой мертвец

процесс, который завершился / завершился, но родитель которого еще не подтвердил завершение (используя wait()системные вызовы). Мертвые процессы хранятся в таблице процессов, так что их родитель может быть проинформирован о том, что их дочерний процесс завершает дочерний процесс, и о своем статусе выхода. Обычно программа разветвления детей также будет читать их статус выхода при выходе, поэтому вы увидите зомби, только если родитель остановлен или глючит.

Видеть:

управляющий терминал, сеанс, передний план, фон

Они связаны с управлением заданиями в контексте оболочки, запущенной на терминале. Пользователь входит в систему, сеанс запускается, привязывается к терминалу (управляющему терминалу) и запускается оболочка. Затем оболочка запускает процессы и отправляет их на передний план и фон по желанию пользователя (используя &при запуске процесса, останавливая его ^Z, используя fgи bg). Процессы в фоновом режиме останавливаются при чтении или записи с терминала; процессы на переднем плане получают сигнал прерывания, если ^Cего ударили по терминалу. (Это драйвер терминала ядра, который обрабатывает эти сигналы, оболочка контролирует, какой процесс (группа) отправляется на передний план или в фон.

Видеть:

демон

Процесс, работающий как демон, обычно не должен быть привязан к какому-либо конкретному терминалу (или сеансу входа в систему, или оболочке). У него не должно быть управляющего терминала, так что он не будет принимать сигналы, если терминал закрывается, и обычно он не хочет, чтобы он также выполнял ввод-вывод на терминале. Запуск демона из командной строки требует разрыва всех связей с терминалом, то есть запуска нового сеанса (в смысле управления заданиями выше), чтобы избавиться от управляющего терминала, и закрытия файловых дескрипторов для терминала. Конечно, что-то, начатое из initsystemd или аналогичного за пределами сеанса входа в систему, не будет иметь этих связей для начала.

Поскольку у демона нет управляющего терминала, он не подлежит управлению заданиями, и нахождение на «переднем плане» или «фоне» в смысле управления заданиями неприменимо. Кроме того, демоны, как правило, переопределяют, initчто очищает их при выходе, поэтому вы обычно не видите их как зомби.

Видеть:


4

Зомби на самом деле не имеет отношения к другим; это просто процесс, который завершился, но его родительский процесс еще не прочитал свой статус завершения с waitpid()или подобный. Вы не должны видеть их, если процесс не глючит или не останавливается.

Демон это программа , которая работает без управляющего терминала. Обычно, когда вы запускаете программу, она fork()sсама и родитель покидают ее, поэтому оболочка думает, что команда завершилась, и дочерний процесс отсоединяется от терминала и выходит из сеанса входа в систему. Поскольку родительский процесс завершен, его идентификатор родительского процесса становится равным 1, что традиционно является initпрограммой или в наши дни systemd. Этот процесс гарантирует, что его дети пожнут, когда они умрут, чтобы вы не заполнились зомби.

Процесс может быть связан с управляющим терминалом , откуда он обычно получает свой вход и отправляет свой выход. Терминал также может отправлять сигналы процессам, прикрепленным к нему, и идентифицирует группу процессов как группу переднего плана . Процессам, входящим в группу переднего плана , разрешено считывать ввод с терминала, и отправляются сигналы SIGINT и SIGSUSP при нажатии клавиш Ctrl-C и Ctrl-Z. Любой процесс, не входящий в группу переднего плана, который пытается прочитать с терминала, приостанавливается с помощью SIGTSTP.

Оболочка создает различные группы процессов для каждой команды конвейера, которую вы просите ее выполнить, и смещает, какая из них является группой переднего плана для перемещения заданий между передним планом и фоном. Когда вы запускаете команду, обычно оболочка создает новую группу процессов и делает эту группу приоритетной . Если вы добавляете суффикс к нему, &то оболочка просто покидает группу переднего плана, где она была, и поэтому новая группа находится в фоновом режиме. Нажатие Ctrl-Z отправляет SIGSUSP в группу переднего плана, что приводит к приостановке большинства команд, но вместо приостановки оболочка заменяет активную группу переднего плана на себя, чтобы она могла запросить у вас новую команду.

Команда bgотправляет SIGCONT группе процессов, чтобы он мог продолжить работу в фоновом режиме после того, как был приостановлен с помощью SIGSUSP. fgизменяет группу переднего плана на одну из существующих групп, уже работающих в фоновом режиме, переводя ее на передний план.


4

Хорошо, вот мое объяснение с акцентом на различия между этими типами процессов (короткий, но информативный):

  • zombie- процесс, который только что вышел (завершил свое выполнение), но все еще имеет запись в таблице процессов. Примечание : у зомби- процесса все еще есть родительский процесс, и обычно весь смысл его существования состоит в том, чтобы сообщить этому родительскому процессу о результате выполнения дочернего процесса (код завершения и т. Д.).
  • disowned process(без управления терминалом) - процесс, который был либо явно disown'отредактирован пользователем, либо предназначен для отделения от родительского дерева процессов. Он все равно будет работать, даже если родительский процесс завершит выполнение. Например, пользователь sshперешел на удаленный компьютер, запустил что-то вроде веб-сервера, затем запустил disownего и вышел из sshсеанса. Процесс все еще будет работать, так как он больше не является частью родительского дерева процессов. Процесс также можно отрицать, запустив его nohup.
  • background process- работает в фоновом режиме - не разделяет вывод на tty пользователя. Либо был запущен &в конце, либо разветвился на задний план. Другой вариант отправить процесс в фоновый режим - запустить его и нажать ctrl+z. Тем не менее, когда родительский процесс завершится, дочерний процесс, работающий в фоновом режиме, также завершит работу ( обратите внимание , @psusi - предыдущий факт верен только для процессов, запущенных пользователем из терминала; в противном случае дочерний процесс становится «слоном» и получает Процесс инициализации (pid 1) как родитель).
    • daemon- очень похоже на фоновый процесс. Также работает в фоновом режиме, но, скорее всего, был неявно разветвлен (по замыслу). Обычно он спокойно сидит в фоновом режиме, ожидая какого-то события, и только тогда выполняет реальную работу (входящее соединение и т. Д.). На самом деле, демон может быть как отречён (более вероятно), так и от фонового процесса в зависимости от его дизайна.

Надеюсь, что это объяснение поможет различить эти типы процессов.


Ницца. Таблица процессов принадлежит родителю? Так зомби умирают без своего хозяина?
анатолий техтоник

Таблица не правильное слово. Это скорее процесс tree. Да, конечно, родитель не должен завершаться после завершения дочернего процесса (но это может быть сделано, если он ожидает, пока дочерний процесс завершит обработку какого-либо рода вещей). Но если родитель прекратит работу, то ребенок обязательно прекратит работу. Вы можете запустить topиз своего терминала и затем нажать, shift-vчтобы увидеть деревья процессов в дикой природе.
Днемад

1
Завершение родителя не убивает его детей. У детей-сирот идентификатор родительского процесса был изменен на init (1).
Псуси

@psusi ты прав, я забыл, что так только с процессами, запущенными в терминале. Я исправлю свой ответ.
Днемад

Я бы просто убрал предложение «это скоро исчезнет из таблицы». Предполагается, что через некоторое время он автоматически исчезает, но это не так; «Исчезновение» - это очень конкретное событие.
AnoE
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.