我的场景:
我在树莓派上有一些 python 脚本。它们的行为就像一项服务,它们永远运行而无需退出和处理信号。它们旨在在后台运行,将一些值写入 MariaDB。它们在无人看管的情况下运行,没有登录用户。
但是,有时它们会崩溃。我不知道为什么,对我来说似乎很难找出发生了什么(随机崩溃,没有模式,没有线索,有时它们会运行数月,有时它们每天都会崩溃)。
由于此脚本处理的信号并不重要,因此我只想:
- 编写一个shell脚本,杀死所有正在运行的python脚本并重新启动它们
- 每天使用 crontab 运行此脚本两次,因此如果发生崩溃,我不会丢失太多数据,也不必关心检查和重新启动它们
我已经编写了 shell 脚本“restart.sh”并在 bash 中执行它效果很好:
#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
kill $(pgrep python3)
sleep 2
nohup python3 script1.py &
sleep 2
nohup python3 script2.py &
sleep 2
nohup python3 script3.py &
sleep 2
exit
我还用 修改了我的 crontab sudo crontab -e
,其中包含:
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
0 9 * * * /home/pi/restart.sh
0 15 * * * /home/pi/restart.sh
我的问题:
测试 crontab,我可以看到它restart.sh
已执行,但只有第一个命令,即kill
命令,有效。所有正在运行的 python3 脚本都被杀死,但不会再次启动。
我尝试添加PATH
and SHELL
,因为这似乎是常见问题,但这并没有改变任何东西。
我也尝试先编辑crontab -e
没有sudo
,同样的问题。
我在这里想念什么?如果我在终端中手动运行,为什么nohup
命令不像它们那样执行?./restart.sh
我可以做些什么来让这个脚本开始使用 crontab?