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

/ sbin и Исторически в / usr / sbin хранились статически связанные двоичные файлы. / sbin для команд уровня администратора, необходимых на уровне инициализации 1 (однопользовательский режим) и / usr / sbin для более общих команд администратора, необходимых на уровне инициализации 3 (полностью сетевой, удаленный вход включен, включен NFS). К сожалению, Linux больше не поддерживает эту модель.

8
21.03.2017, 11:30
3 ответа

Вкратце, плюс ссылки.

zombie

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

См .:

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

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

См .:

daemon

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

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

См .:

10
27.01.2020, 20:09

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

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

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

4
27.01.2020, 20:09

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

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

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

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

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

4
27.01.2020, 20:09

Теги

Похожие вопросы