Este parece ser um problema de tempo, em que nohup
não tem tempo suficiente para desabilitar sinais antes de ser sinalizado por um dos pais. Você pode ver isso adicionando strace -o /tmp/s -ff
na frente do comando screen
e, em seguida, em um dos arquivos de log /tmp/s.*
que você vê
...
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 +++
Você pode simplificar a inicialização. Isso funciona para mim sem a necessidade de &
.
DISPLAY=:0 screen -d -m -L nohup zenity --info --text test
Outra solução parece ser pedir ao shell pai para usar o controle de tarefa. Isso parece fazer com que desabilite o SIGHUP para o plano de fundo ou espere que a criança nohup
esteja mais adiantada antes de sair. Usar sh -cm
em vez de sh -c
no seu comando original deve funcionar melhor. Por exemplo, isso funciona para mim
screen -d -m -L sh -cm 'nohup zenity --info --text test >&/dev/null & echo'
enquanto o -c
verson não. bash
tem um comando disown
que protege um trabalho em segundo plano de SIGHUP, se estiver usando controle de tarefa, mas parece que você não precisa mesmo sem nohup
, pois isso também funciona, sem deixar um processo screen
em execução:
screen -d -m -L sh -cm 'zenity --info --text test >&/dev/null </dev/null & echo'