nohup 없이 내 애플리케이션이 종료되는 이유는 무엇입니까?

nohup 없이 내 애플리케이션이 종료되는 이유는 무엇입니까?

/etc/init.d/rc.local에서 스크립트를 호출하여 작동하는 간단한 시스템(Debian에서 실행)이 있습니다.

rc.local 하단에서 myScript.sh를 호출하여 몇 가지 사항을 설정한 후 다음과 같은 바이너리를 실행합니다.

./myBinary > /dev/null 2>&1 &

잠시 동안은 잘 작동하지만 잠시 후 myBinary가 종료됩니다. 그러나 이를 수행하도록 스크립트를 수정하면 다음과 같습니다.

nohup ./myBinary > /dev/null 2>&1 &

잘 작동합니다(약 8시간 동안 테스트했습니다).

내 이해에 따르면 SIGHUP프로세스를 제어하는 ​​터미널이 닫힐 때 전송되며 nohup으로 인해 신호가 무시됩니다.

내 소프트웨어가 SIGHUP을 보내는 것 같지만 그 이유를 이해할 수 없습니다. 누군가 이것을 설명할 수 있나요?

편집: 실제 스크립트는 다음과 같습니다.

#!/bin/bash
clear
/home/pi/hdmi-switcher/hdmi-switcher version
/home/pi/hdmi-switcher/update.sh
printf "Starting switching daemon..."
cd /home/pi/hdmi-switcher
./hdmi-switcher > /dev/null 2>&1 &
printf "\tOK\n"
printf "Starting video... "
sleep 5
printf "\tOK\n"
omxplayer --loop --no-osd -b -o both /home/pi/hdmi-switcher/video.mp4 > /dev/null 2>&1
clear

죽은 것들은 hdmi-switcher. omxplayer에는 문제가 없습니다.

답변1

에서 바이너리를 호출하면 로 호출된다는 /etc/rc.local점에 유의하세요 . 즉, 스크립트에서 테스트되지 않은 명령이 실패하면 스크립트가 즉시 종료됩니다. 백그라운드에서 바이너리를 호출하고 있으며 스크립트의 다른 명령이 0이 아닌 종료 코드로 종료될 수 있습니다. 이로 인해 바이너리가 날아가게 됩니다.rc.local/bin/sh -e-e

맨페이지에 따르면 테스트되지 않은 명령은 다음과 같습니다.

명령의 종료 상태는 if, elif, while 또는 Until을 제어하는 ​​데 사용되거나 명령이 "&&" 또는 "||"의 왼쪽 피연산자 연산자인 경우 명시적으로 테스트된 것으로 간주됩니다.

$ command                   # untested
$ command || echo failed    # tested
$ if [ command ]; then...   # tested, also while and until loops
$ [ command ] && echo ...   # tested

게다가 rc.local파일이 잘못된 위치에 있으므로 더 이상 사용해서는 안 되며 더 이상 사용되지 않습니다. 대신 시스템 시작 구성 메커니즘을 사용해야 합니다. Debian을 사용하고 있으므로 SysV-init 스타일입니다. 이를 깔끔하게 수행하려면 바이너리/데몬/작업을 시작하고 중지하기 위해 /etc/init.d/최소한 start및 인수를 허용하는 스크립트를 작성하십시오 . 먼저 스크립트를 작성 stop하기 위한 템플릿으로 사용할 수 있는 뼈대 스크립트가 있습니다 ./etc/init.d/skeleton

관련 정보