我每分钟运行一个 cron 作业,它启动一个 bash shell 脚本:
# Automatically reboot the server if it goes down
* * * * * /root/auto-restart.sh
我可以手动运行该脚本,但每当我尝试通过 cron 作业运行它时,它都不会运行。我调试了一下,发现这个命令是罪魁祸首:
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 作业,但在其他方面被认为已关闭,那么看门狗就不会跳闸。)