Я прочитал ответ от пользователя, который утверждал, что работает
foo 2>&1 >& output.log &
приведет к foo
продолжению работы, даже когда они выходят из системы. По словам этого пользователя, это даже работало через соединения SSH.
Я действительно не верил в это, поскольку у меня сложилось впечатление, что в случае отключения от SSH или завершения TTY оболочка и, следовательно, ее процессы получат SIGHUP, что приведет к их завершению. Это, по моему предположению, было единственной причиной для использования nohup
в таких случаях, или tmux
, screen
и др.
Затем я посмотрел в руководство glibc :
Этот сигнал также используется, чтобы сообщить о завершении процесса управления на терминале заданиям, связанным с этим сеансом; это завершение эффективно отключает все процессы в сеансе от управляющего терминала.
Кажется, это подтверждает мои мысли. Но, глядя дальше, он говорит :
Если процесс является лидером сеанса, у которого есть управляющий терминал, то сигнал SIGHUP отправляется каждому процессу в задании переднего плана, и управляющий терминал отсоединяется от этого сеанса.
Таким образом, это означает, что задания, помещенные в фоновом режиме, не получат SIGHUP?
К моему дальнейшему замешательству, я запустил интерактивный сеанс Zsh, запустил yes >& /dev/null &
и набрал exit
текст, когда Zsh предупредил меня о том, что у меня выполняются задания, и после exit
повторного набора текста сказал, что он SIGHUPed одно задание. То же самое в Bash оставляет работу запущенной ...
logout
иyes
все еще работает.Ответы:
Bash, кажется, отправляет
SIGHUP
только если он сам получил aSIGHUP
, что, например, происходит, когда виртуальный терминал закрыт или когда соединение SSH прервано. Из документации :Поэтому, если вы напечатаете
exit
или нажмете Ctrl+, Dвсе фоновые процессы останутся, так как это не отправит сигнал зависания в Bash.Вы можете заставить Bash предупредить вас о том, что все еще работают фоновые процессы с
Существует возможность отправить при
SIGHUP
выходе, если вы находитесь в интерактивной оболочке ( см. Здесь ). Но это не работает на моей машине с Bash 4.2.25. Может быть, это работает для васисточник
SIGHUP
отправляется, иначе, с чистым выходом, задания продолжают выполняться? Это объясняет, что я видел.huponexit
«действует только для интерактивных оболочек входа»