Введение
Сиротский процесс — это компьютерный процесс, родительский процесс которого завершился или был остановлен, но сам процесс продолжает выполняться.
Unix-подобный
В операционной системе, подобной Unix, любой осиротевший процесс будет немедленно усыновлен системным процессом, определённым реализацией: ядро устанавливает родительский процесс для этого процесса. Эта операция называется переусыновлением и происходит автоматически. Даже если технически процесс имеет системный процесс в качестве родителя, он всё ещё называется осиротевшим, поскольку процесс, который первоначально его создал, больше не существует. В других системах осиротевшие процессы немедленно завершаются ядром. Большинство Unix-систем исторически использовали `init` в качестве системного процесса, к которому переусыновляются осиротевшие процессы, но в современных DragonFly BSD, FreeBSD и Linux осиротевший процесс может быть переусыновлен процессом "subreaper" вместо `init`. Процесс может стать осиротевшим непреднамеренно, например, когда родительский процесс завершается или аварийно прекращает работу. Механизм групп процессов в большинстве Unix-подобных операционных систем может быть использован для защиты от случайного осиротения, когда в координации с оболочкой пользователя предпринимается попытка завершить все дочерние процессы сигналом "hangup" (SIGHUP), а не позволять им продолжать работу как осиротевшие. Более точно, в рамках управления заданиями, когда оболочка завершается, поскольку она является "лидером сессии" (её идентификатор сессии равен идентификатору процесса), соответствующая сессия входа завершается, и оболочка отправляет SIGHUP всем своим заданиям (внутреннее представление групп процессов). Иногда желательно намеренно осиротить процесс, обычно для того, чтобы позволить длительно выполняющемуся заданию завершиться без дальнейшего вмешательства пользователя, или запустить постоянно работающий сервис или агент; такие процессы (без связанной сессии) известны как демоны, особенно если они работают непрерывно. Низкоуровневый подход заключается в двойном `fork`, запуске желаемого процесса во внуке и немедленном завершении дочернего процесса. Процесс-внук теперь осиротел и будет усыновлен не дедушкой, а `init`. Альтернативы более высокого уровня обходят обработку сигнала hangup оболочкой, либо инструктируя дочерний процесс игнорировать SIGHUP (с помощью `nohup`), либо удаляя задание из таблицы заданий, либо сообщая оболочке не отправлять SIGHUP при завершении сессии (с помощью `disown` в любом случае). В любом случае, идентификатор сессии (идентификатор процесса лидера сессии, оболочки) не изменяется, и идентификатор процесса сессии, которая завершилась, остаётся в использовании до тех пор, пока все осиротевшие процессы не завершатся или не изменят идентификатор сессии (начав новую сессию через `setsid(2)`). Для упрощения администрирования системы часто желательно использовать обёртку для сервисов, чтобы процессы, не предназначенные для использования в качестве сервисов, правильно реагировали на системные сигналы. Альтернативным способом поддержания работы процессов без их осиротения является использование мультиплексора терминалов и запуск процессов в отсоединённой сессии (или сессии, которая становится отсоединённой), чтобы сессия не завершалась, а процесс не осиротел. Процесс сервера также считается осиротевшим, когда клиент, инициировавший запрос, неожиданно завершается после отправки запроса, оставляя серверный процесс работающим. Эти осиротевшие процессы расходуют ресурсы сервера и потенциально могут привести к нехватке ресурсов. Однако существует несколько решений проблемы осиротевших процессов: Завершение – наиболее часто используемый метод; в этом случае осиротевший процесс уничтожается. Реинкарнация – это метод, при котором машины периодически пытаются найти родителей любых удалённых вычислений; в этот момент осиротевшие процессы уничтожаются. Истечение времени – это метод, при котором каждому процессу выделяется определённое количество времени для завершения перед уничтожением. При необходимости процесс может "попросить" больше времени для завершения до истечения выделенного времени.
Termination is the most commonly used technique; in this case the orphan is killed. Reincarnation is a technique in which machines periodically try to locate the parents of any remote computations; at which point orphaned processes are killed. Expiration is a technique where each process is allotted a certain amount of time to finish before being killed. If need be a process may "ask" for more time to finish before the allotted time expires.