Por que o aplicativo não é executado a partir do SCREEN sem atraso?

1

Suponha que precisamos executar o aplicativo em screen e mantê-lo em execução quando screen sair. O seguinte comando faz o trabalho, mas somente se " sleep 1 " for anexado a ele. Por que não funciona sem " sleep 1 "?

screen -d -m -L sh -c 'DISPLAY=:0 nohup zenity --info --text test >/dev/null 2>/dev/null &'
    
por Igor Liferenko 05.09.2018 / 05:43

2 respostas

1

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'
    
por 09.09.2018 / 18:02
0

Usar nohup como comando abrangente é impossível porque não permite se livrar de nohup.out sem suprimir toda a saída, e usar nohup.out em vez de screenlog.0 é impossível porque nohup.out não preservar o retorno de carro.

Em vez de usar nohup , use trap do shell. Então, o comando no OP se torna:

screen -d -m -L sh -c 'trap "" HUP; DISPLAY=:0 zenity --info --text test >/dev/null 2>/dev/null &'
    
por 18.09.2018 / 10:49