在crontab中运行脚本--重启:找不到命令

4

我在我的根crontab中设置了一个脚本,该脚本应使用reboot命令重新启动我的计算机。

然而,尽管reboot在根用户的路径中,但我收到了reboot: command not found的错误提示。

$ sudo su
$ which reboot
/sbin/reboot
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/go/bin

我的脚本:

#!/bin/bash

ping 8.8.8.8 -c 1 > /dev/null 2>&1; exit_code=$?
time_stamp=$(date +"%Y%m%d-%H%M")

if [ $exit_code -ne 0 ]; then
    (1>&2 echo "$time_stamp: failed with exit code $exit_code; restarting now")
    reboot
else
    echo "$time_stamp: ok"
fi

root用户的定时任务表:

$ sudo crontab -l
58 * * * * /home/pi/github/ping-restart/ping-restart.sh >> /home/pi/github/ping-restart/cron.log 2>&1
$ sudo su
58 * * * * /home/pi/github/ping-restart/ping-restart.sh >> /home/pi/github/ping-restart/cron.log 2>&1

......是的,这只是一个临时解决方法,我正在研究为什么网络会不断掉线。


也许尝试使用绝对路径/sbin/reboot... - l'L'l
@l'L'l 这似乎是有效的。在 crontab 中带有 which reboot 的脚本没有输出(表示未找到),而带有 which /sbin/reboot 的脚本则输出了 /sbin/reboot,正如预期的那样。你有什么想法为什么单独使用 reboot 无法工作? - ning
因为cron不知道重启命令的位置,所以你必须提供它的路径。在cron中,只有特定的命令可以使用名称调用,因此通常需要提供绝对路径。 - l'L'l
1
@l'L'l:我不确定我理解了。我能够在根用户的crontab中使用其他脚本,这些脚本具有通过名称调用而不是完整路径(例如date表示/bin/datebasename表示/usr/bin/basenametraceroute表示/usr/sbin/traceroute)的命令。reboot有什么特别之处? - ning
请参考Gordon的回答... - l'L'l
1个回答

7

cron jobs在非常基本的环境设置下运行;默认的PATH只有/usr/bin:/bin。它不使用用户的常规shell设置。有几种解决方法:

  • 在脚本中使用完整路径(例如/sbin/reboot)。
  • 在使用reboot之前,在脚本中设置PATH(即PATH=/usr/bin:/bin:/usr/sbin:/sbin)。
  • 在您的脚本条目之前在crontab中设置PATH(语法与脚本相同)。

1
这似乎百分之百是正在发生的事情。我也进行了验证,将echo $PATH > cron_path_log设置为作业。 - ning

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接