Обычно я запускаю долго работающий скрипт оболочки:
% (nohup ./script.sh </dev/null >script.log 2>&1 & )
Перенаправления закрывают stdin
и открывают stdout
и stderr
; nohup
останавливает HUP, достигающий процесса при выходе из процесса владения (я понимаю, что 2>&1
несколько избыточен, так как nohup
делает что-то подобное в любом случае); а фоном в подоболочке является двойная вилка, которая означает, что родительский процесс ./script.sh
завершился, пока он еще работает, поэтому он получает процесс init в качестве родительского.
Это не полностью работа, однако, потому что, когда я выхожу из оболочки, из которой я это вызывал (обычно, конечно, я делаю это на удаленной машине), она не выходит чисто. Я могу сделать ^C
для выхода, и это нормально - процесс продолжается в фоновом режиме, как и предполагалось. Однако я не могу понять, что / не происходит, требует ^C
, и это меня раздражает.
Вышеуказанные действия, кажется, отмечают большинство полей в unix FAQ (вопрос 1.7), за исключением , что я ничего не делаю, чтобы отсоединить этот процесс от управляющего терминала или сделать его лидером сеанса. Вызов setsid (2) существует во FreeBSD, но отсутствует команда setsid
; и, насколько я понимаю, нет очевидной замены этой команде. Конечно, то же самое верно и для macOS.
Итак, вопросы:
- Есть ли на этой платформе абонент с другим именем
setsid
, что я отсутствует? - Что именно происходит, когда я выхожу из вызывающей оболочки, которую я убиваю с помощью
^C
? Может ли это как-то меня укусить?
Похожие вопросы (например, 1 , 2 ) либо отвечают на несколько другой вопрос, либо предполагают наличие команда setsid
.
(Этот вопрос раздражал меня годами, но поскольку то, что я здесь делаю, на самом деле не работает, я никогда прежде не удосужился заняться расследованиями, получить тупик и спросить о это).