我正在尝试设置一个 cron 作业来每天重启设备。如果由于某种原因重启挂起(问题在于 SSH 被终止,设备永远不会重启,因此它会丢失,并且需要昂贵的人工干预才能重启),则使用安全回调到 SysRq 重置。
曾经有效运行过一段时间的脚本:
5 5 * * * root /sbin/reboot -f; sleep 30; /bin/echo `date -u +'\%Y-\%m-\%dT\%H:\%M:\%SZ'` >> /var/log/player-reboot.error.log; echo 1 > /proc/sys/kernel/sysrq; sync; echo b > /proc/sysrq-trigger
然而,它非常残酷(硬重启 -f),我们的一些设备最近无法恢复(每天有几千台)。
不确定是什么挂起了(看起来文件从未被写入所以我想说要么是重新启动本身要么是回显挂起了?
希望使用 & 符号来永不“锁定”并确保最终会发生正确的重置,但是它似乎根本不起作用(不再重新启动):
5 5 * * * root /sbin/shutdown -r +2 &; sleep 240; /bin/echo `date -u +'\%Y-\%m-\%dT\%H:\%M:\%SZ'` >> /var/log/player-reboot.error.log &; echo 1 > /proc/sys/kernel/sysrq; sleep 1; echo b > /proc/sysrq-trigger
我可以在 cron 脚本中使用 & 符号吗?您知道另一种更聪明的方法来实现所需的结果吗?谢谢!
答案1
更简单的方法是安排其他检查是否正常运行时间超过 24 小时(即 25 小时)。如果检查结果为真,则显然重新启动时出现了问题,因此必须通过 重新启动机器SysRq
。
为了获得最大的可靠性,您的定期检查不应依赖于crond
(挂起的进程可能会终止shutdown
)。相反,使用轮询方案;类似这样的方案:
#!/bin/bash
max_uptime=$((25*3600)) #max 25h
sleep_time=3600 #1h sleeps
while true; do
current_uptime=`grep -o "^[[:digit:]]\+" /proc/uptime`
echo "current uptime: $current_uptime seconds"
if [ $current_uptime -gt $max_uptime ]; then
echo "reboot!"
echo 1 > /proc/sys/kernel/sysrq; sync; echo b > /proc/sysrq-trigger
else
echo "not now!"
fi
echo "sleeping..."
sleep $sleep_time
done
@reboot
crond
您可以首先使用一个条目或与和朋友一起启动上述脚本rc.local
。