Can I safely assume my processes won't end if I don't use nohup
Нет. Если терминал зависает и у него есть интерактивная оболочка в качестве лидера сеанса, оболочка получит SIGHUP и повторно отправит его своим заданиям, которые не были отклонены.
Если оболочка завершает работу добровольно, она отправляет SIGHUP своим заданиям, если включена опция
huponexit
.Если оболочка завершается добровольно и есть остановленные собственные задания, bash уничтожит их с помощью SIGTERM (не уверен, что это стандартное поведение ).
Если оболочка добровольно завершает работу и есть остановленные отмененные задания, драйвер терминала уничтожит их с помощью SIGHUP (это определенно стандарт -обязательно ).
Таким образом, вы все еще можете быть убиты с помощью SIGHUP в различных сценариях.
Тем не менее, глядя на исходный код nohup в http://src.gnu-darwin.org/src/usr.bin/nohup/nohup.c.html, он кажется более или менее выполнимым в чистой оболочке:
nohup_sh() ( set -e if [ -t 1]; then exec >> nohup.out || exec >> "$HOME/nohup.out" fi if [ -t 0 ]; then exec 0&1 fi trap '' HUP #ignore SIGHUP (inheritable) set -m || : #to prevent SIGINT and SIGQUIT from being ignored #(probably not needed, but the nohup binary won't ignore them, unlike # & without set -m) command "$@" & )
Возможно, вам не понадобятся дополнительные данные за пределами
trap '' HUP
, хотя задание получит SIGPIPE, если оно попытается записать на отключенный терминал (, что предотвращается перенаправлением ).