SCREEN에서 애플리케이션이 즉시 실행되지 않는 이유는 무엇입니까?

SCREEN에서 애플리케이션이 즉시 실행되지 않는 이유는 무엇입니까?

애플리케이션을 실행 screen하고 screen종료 시 계속 실행해야 한다고 가정해 보겠습니다. 다음 명령은 작업을 수행하지만 sleep 1""가 추가된 경우에만 해당됩니다. "" 없이는 왜 작동하지 않나요 sleep 1?

screen -d -m -L sh -c 'DISPLAY=:0 nohup zenity --info --text test >/dev/null 2>/dev/null &'

답변1

이는 타이밍 문제인 것 같습니다. 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버전에서는 그렇지 않습니다 . 작업 제어를 사용하는 경우 SIGHUP에서 백그라운드 작업을 보호하는 명령이 bash있지만 disown그렇지 않더라도 프로세스 실행을 nohup종료하지 않고도 작동하므로 필요하지 않은 것 같습니다.screen

screen -d -m -L sh -cm 'zenity --info --text test >&/dev/null </dev/null & echo'

답변2

nohupas catch-all 명령을 사용하는 nohup.out것은 모든 출력을 억제하지 않고 제거하는 것을 허용하지 않기 때문에 불가능하며, 캐리지 리턴이 유지되지 않기 때문에 nohup.out대신 사용할 screenlog.0수 없습니다 .nohup.out

nohupshell 을 사용하는 대신 trapOP의 명령은 다음과 같습니다.

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

관련 정보