Это похоже на проблему синхронизации, поскольку nohup
не имеет достаточно времени для отключения сигналов до того, как об этом подаст сигнал один из родителей. Вы можете увидеть это, добавив strace -o /tmp/s -ff
перед командой screen
, а затем в одном из файлов журнала /tmp/s.*
вы увидите
...
access("/bin/nohup", X_OK) = 0
stat("/bin/nohup", {st_mode=S_IFREG|0755, st_size=36696,...}) = 0
--- SIGHUP {si_signo=SIGHUP, si_code=SI_KERNEL} ---
+++ killed by SIGHUP +++
Вы можете упростить запуск. Это работает для меня без необходимости &
.
DISPLAY=:0 screen -d -m -L nohup zenity --info --text test
Другое решение, похоже, состоит в том, чтобы попросить родительскую оболочку использовать управление заданиями. Похоже, это заставляет его либо отключить SIGHUP в фоновом режиме, либо иным образом ждать, пока дочерний элемент nohup
будет дальше, прежде чем выйти из себя. Использование sh -cm
вместо sh -c
в исходной команде должно работать лучше. Например, это работает для меня
screen -d -m -L sh -cm 'nohup zenity --info --text test >&/dev/null & echo'
, а версия -c
— нет. bash
имеет команду disown
, которая защищает фоновое задание от SIGHUP, если используется управление заданиями, но, похоже, вам это не нужно даже без nohup
, так как это тоже работает, не оставляя процесс screen
запущенным:
screen -d -m -L sh -cm 'zenity --info --text test >&/dev/null </dev/null & echo'
https://github.com/Yelp/dumb-init
пример конфигурации, создайте "./start" и задайте для него содержимое:
#!/usr/bin/dumb-init /bin/sh
./foo & # launch a process in the background
./bar &
./baz # launch another process in the foreground
не забудьте chmod +x./start
затем запустить/выйти с помощью ./start
и ^C как обычно