/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