инструменты для запуска многих фоновых процессов и их корректного закрытия по сигналу

Это похоже на проблему синхронизации, поскольку 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'
0
13.03.2021, 12:19
1 ответ

тупой -инициализация

https://github.com/Yelp/dumb-init

  • упаковано в Debian (apt install тупой -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 как обычно

1
18.03.2021, 22:25

Теги

Похожие вопросы