Этот вопрос старый, и я до сих пор не понимаю, почему.
Оригинальный вопрос в 2014 году:
На вкладке Терминал Gnome я запустил
$ nohup chromium-browser &
Но когда я закрываю вкладку терминала, chromium-browser
тоже выходит. Не nohup
должно ли это предотвратить? Жиль сказал:
Можно сказать, что nohup и disown подавляют SIGHUP, но по-разному. nohup заставляет программу изначально игнорировать сигнал (программа может изменить это). nohup также пытается устроить так, чтобы программа не имела управляющего терминала, чтобы ядро не отправляло SIGHUP, когда терминал закрыт. отречение является чисто внутренним для оболочки; это заставляет оболочку не отправлять SIGHUP, когда это завершается.
Так что же, nohup заставляет браузер chromium игнорировать SIGHUP?
Я вижу это и на других исполняемых файлах, таких как Emacs (режим GUI). Но не на xeyes.
Это происходит в Ubuntu 12.04, 32-битном, когда вопрос был опубликован.
Обновление в 2015 году,
Сейчас я использую Ubuntu 14.04, google-chrome
вместо chromium-browser
установленного. То же самое, что происходило с Chromium-браузером раньше, также происходит и с Google-Chrome. nohup google-chrome 2>/dev/null &
не сохраняет его от закрытия, когда вкладка терминала закрыта. /usr/bin/google-chrome
это ссылка на Баш скрипт /opt/google/chrome/google-chrome
. Почему nohup
применяется к сценарию bash не работает? Как мы можем заставить его работать на скриптах bash? А как насчет скриптов Python?
xeyes
.Ответы:
Когда вы закрываете окно терминала GNOME, в оболочку, в которой он работал, отправляется SIGHUP. Оболочка обычно отправляет SIGHUP каждой группе процессов, которую она знает, даже если она была запущена,
nohup
и затем завершается. Если оболочка естьbash
, она пропустит отправку SIGHUP любой группе процессов, помеченной пользователемdisown
.Запуск команды с
nohup
заставляет игнорировать SIGHUP, но процесс может изменить это. Когда расположение SIGHUP для процесса является значением по умолчанию, то, если оно получает SIGHUP, процесс будет остановлен.Linux предоставляет некоторые инструменты для проверки настроек сигналов запущенного процесса.
Сценарий оболочки chromium-browser выполняет
exec
скомпилированное приложение, поэтому его идентификатор процесса остается прежним. Поэтому, чтобы увидеть настройки сигнала, я побежал,nohup chromium-browser &
а затем посмотрел,/proc/$!/status
чтобы увидеть расположение сигнала.Это шестнадцатеричные числа. Это показывает, что SIGHUP не перехватывается и не игнорируется. Только SIGPIPE (13-й бит в SigIgn) игнорируется. Я проследил это до следующего кода :
Несмотря на комментарий, игнорируемые родителем сигналы не игнорируются. Вздох убьет хром.
Обходной путь должен сделать то, на что указывает @ xx4h: используйте
disown
команду в вашем bash, чтобы, если bash должен выйти, он не отправлял SIGHUP группеchromium-browser
процессов. Вы можете написать функцию для этого:источник
trap "" 1
, это заставило бы оболочку (и ее дочерние элементы) игнорировать SIGHUP. Я уточню это.trap
команды в сценарии оболочки обертка не препятствует этому, и бегущаяnohup
не могут предотвратить это. Я пересмотрю свой ответ, чтобы отразить это.Если
chromium-browser
что-то похожее,google-chrome
то я думаю, что наиболее вероятная проблема заключается в том, чтоchromium-browser
это неchromium
оболочка оболочки, которая инициализирует состояние, а затемexec
schromium
.В моей
google-chrome
установке бинарный файл фактически находится,/opt/google/chrome
а обертка/usr/bin
- это всего лишь сценарий оболочки, который настраивает множество сред, касающихсяxdg-*
значений по умолчанию и абсолютных путей и аналогичных перед заменой самого бинарного файла.В этот момент любые сигналы, которые
nohup
могли быть изначально проигнорированы от имени скрипта, который он назвал своим дочерним элементом, перестанут иметь значение, и если скрипт-обертка не соблюдает правила, иначе (не так) наследуется ctty.Попробуйте
file /usr/bin/chromium-browser
проверить, является ли это сценарий оболочки, я думаю, что это так. Если это так, подумайте над тем, чтобы переписать его так, чтобы он вам больше подходил.Я могу сказать, что только выполнение делает
google-chrome 2>/dev/null &
это открытым для меня, но я не могу вспомнить, является ли это вероятным результатом изменений, которые я сделал в сценарии - это было более года назад.источник
chromium-browser
раньше, также происходит иgoogle-chrome
сейчас. Я неchromium-browser
установил.nohup google-chrome 2>/dev/null &
не сохраняет его от закрытия, когда вкладка терминала закрыта.google-chrome
это Баш скрипт/opt/google/chrome/google-chrome
. Почему nohup, примененный к bash-скрипту, не работает? Как мы можем заставить его работать на скриптах bash? А как насчет скриптов Python?chrome
двоичным.exec
на самом делеchrome
двоичный файл? Как мне изменить скрипт тогда? Вот мой/opt/google/chrome/google-chrome
exec -a "$0" "$HERE/chrome" ... || exec -a "$0" "$HERE/chrome"
... Вверху$HERE
установлено значениеreadlink $0
(для которого вы устанавливаете путьgoogle-chrome
), но/opt/google/chrome/chrome
это двоичный файл, которым скрипт заменяет себя.exec
вероятно. Вы получите дополнительный pid (больше, чем 1000 других) и ожидающий процесс оболочки, но я думаю, что это предел. Или вы могли бы заменитьexec
ж /nohup
может быть. Все зависит главным образом от того, чтоchrome
будет терпеть - но это должно работать так.Хром кажется особенным.
nohup chromium-browser & disown
должно работать в этом случае. Смотрите также: /programming/11421810/nohup-doesnt-work-with-chromiumисточник
nohup chromium-browser &
не работает?