bash 쉘 스크립트를 시작하는 cron 작업을 매분 실행합니다.
# Automatically reboot the server if it goes down
* * * * * /root/auto-restart.sh
스크립트를 수동으로 실행할 수 있지만 크론 작업을 통해 실행하려고 하면 실행되지 않습니다. 조금 디버깅한 결과 다음 명령이 원인이라는 것을 알았습니다.
pgrep -fcl auto-restart.sh
전체적으로 수동으로 실행하면 명령이 올바른 값을 반환하고 auto-restart.sh는 스크립트가 현재 실행 중인 경우에만 나열됩니다.
그러나 cron 작업이 시작되면 다음과 같은 출력이 표시됩니다 pgrep -fl auto-restart.sh
(실행 시).
3110 sh
3111 auto-restart.sh
이것은 내가 사용하는 코드입니다:
scriptcheck=`pgrep -fcl auto-restart.sh`
if [ $scriptcheck -gt 1 ]; then
echo "auto-restart.sh script already in use. Terminating.."
#cron job debugging..
echo "[DEBUG] scriptcheck returning greater than 1" > /tmp/debug.output
echo "[DEBUG] Value of scriptcheck: ${scriptcheck}" >> /tmp/debug.output
echo "[DEBUG] contents:" >> /tmp/debug.output
pgrep -fl auto-restart.sh >> /tmp/debug.output
exit
fi
전체 스크립트는 여기에 있습니다:https://pastebin.com/bDyzxFXq
답변1
cron
실행하면 다음을 사용하여 실행됩니다 /root/auto-restart.sh
. 옵션을 사용했기 때문에 실행 중인 프로세스의 명령줄 어디에서나 일치하므로 일치합니다. 후자는 의 출력에서 정상적으로 나타납니다.sh
sh -c /root/auto-restart.sh
-f
pgrep
pgrep
auto-restart.sh
auto-restart.sh
sh -c /root/auto-restart.sh
sh
pgrep -l
pgrep -c auto-restart.sh
당신이 원하는 행동을 줄 것입니다. ( -l
말이 안 되니까 포기했어요 -c
.)
(귀하의 서버에는감시 타이머, 이것이 더 적절할 수 있습니다. 비록 서버가 cron 작업을 실행할 수 있을 만큼 충분히 잘 실행되고 있지만 다른 방법으로는 다운된 것으로 간주된다면 감시 장치가 작동하지 않을 것이라고 상상합니다. )