【问题标题】:cron script won't reboot as it shouldcron 脚本不会重新启动
【发布时间】:2018-08-26 00:55:09
【问题描述】:

我有一个通过 openvpn 连接到 VPN 的 Raspberry Pi。连接会定期断开,因此我使用以下脚本:

#!/bin/bash
ps -ef | grep -v grep | grep openvpn
if [ $? -eq 1 ] ; then
        /sbin/shutdown -r now
fi

我将它添加到 crontab(使用sudo crontab -e),我希望脚本每 5 分钟执行一次:

*/5 * * * * /etc/openvpn/check.sh

脚本不起作用,但似乎仍然每五分钟执行一次:

tail /var/log/syslog | grep CRON

给予:

Mar 16 21:15:01 raspberrypi CRON[11113]: (root) CMD (/etc/openvpn/check.sh)
...

此外,当我使用 sudo ./check.sh 手动运行脚本时,Pi 会正常重启。

我真的不明白这里发生了什么?

编辑

按照建议,我添加了完整路径名,然后从重启 Pi 到重启 openvpn:

#!/bin/bash
if ! /bin/ps -ef | /bin/grep '[o]penvpn'; then
        cd /etc/openvpn/
        /usr/sbin/openvpn --config /etc/openvpn/config.ovpn
fi

该脚本仍然无法运行,尽管我自己执行它时它运行良好。脚本的权限是755,应该没问题吧?

【问题讨论】:

  • 考虑使用killall -0 openvpn。如果该过程存在,您将获得 $?等于零。也许是权限问题,所以您编辑的 crontab 的用户不允许执行关机操作。尝试将bash -x /etc/openvpn/check.sh 2>&1 | logger -t OPENVPNCHECK 放入 crontab。
  • 您可能需要在 check.sh 中设置路径,因为 cron 不使用用户 PATH 运行,或者使用绝对路径。
  • @frist 我用了sudo crontab -e (对不起,应该已经在问题中澄清了),所以我认为应该没有任何权限问题?
  • 为什么要重启?!不能只是重新连接 vpn 吗?
  • 在脚本中,添加二进制文件的完整路径,如 /bin/ps 等(使用 'which grep' 等命令获取它们)。

标签: bash cron cron-task


【解决方案1】:

脚本的路径名与最终的grep 匹配,因此它找到了自己,并且很满意。

这没有以交互方式发生的原因是您没有使用完整路径运行它。

这是一个非常常见的常见问题解答。

实际上,您的脚本包含两个非常常见的反模式。你对pidof 的改造很糟糕,你正在明确地检查$?。除非您特别要求退出代码为 1,否则您应该只是这样做

if ! ps -ef | grep -q '[o]penvpn'; then

因为if目的是运行一个命令并检查它的退出代码;并注意使用与自身不匹配的正则表达式的技巧。但是使用pidof 还可以让您轻松检查二进制可执行文件的文件名,而不是其路径。

【讨论】:

  • 进程死亡时重新启动似乎也过于残酷。您是否有理由不简单地重新启动它?
  • 实际上,没有真正的原因,我只是认为这样会更容易。谢谢,我回家后改剧本
【解决方案2】:

我终于明白为什么脚本不起作用了。由于它位于/etc/openvpn 下,因此条件if ! ps -ef | grep -q '[o]penvpn' 不会返回true,因为正在执行脚本。当我将 crontab 行更改为:

*/5 * * * * /etc/openvpn/check.sh >/home/pi/output 2>/home/pi/erroutput

output 文件显示正在运行的 /etc/openvpn/check.sh 脚本。


现在的脚本是:

#!/bin/bash
if ! pidof openvpn; then
        cd /etc/openvpn/
        /usr/sbin/openvpn --config /etc/openvpn/config.ovpn
fi

这很好用。谢谢大家。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-07
    • 1970-01-01
    • 1970-01-01
    • 2012-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多