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

Posted

技术标签:

【中文标题】在 crontab 中运行脚本--reboot:找不到命令【英文标题】:Running script in crontab--reboot: command not found 【发布时间】:2017-11-27 15:13:54 【问题描述】:

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

但是,尽管reboot 在 root 用户的路径中,但我得到了一个 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 用户 crontab:

$ 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 这似乎有效。 crontab 中带有which reboot 的脚本没有输出(表示未找到),而which /sbin/reboot 有输出/sbin/reboot,正如预期的那样。知道为什么 reboot 本身不起作用吗? 因为cron 不知道reboot 命令在哪里,所以你必须给出位置。在cron 中,仅使用名称就可以调用某些命令,因此您通常需要为其提供绝对路径。 @l'L'l:我不确定我是否理解。我可以在 root 用户 crontab 中使用其他脚本,这些脚本具有按名称而不是完整路径调用的命令(date/bin/datebasename/usr/bin/basenametraceroute/usr/sbin/traceroute)。 reboot 有什么特别之处? 见戈登的回答... 【参考方案1】:

cron 作业在非常基本的环境设置下运行;除其他外,默认 PATH 只是 /usr/bin:/bin。它确实使用用户的常规外壳设置。有几种方法可以解决这个问题:

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

【讨论】:

这似乎 100% 是正在发生的事情。也验证了,将echo $PATH > cron_path_log设置为job。

以上是关于在 crontab 中运行脚本--reboot:找不到命令的主要内容,如果未能解决你的问题,请参考以下文章

在从 crontab 运行的 sh 脚本中找不到命令 [重复]

[Shell]crontab 运行任务调用shell脚本,相对路径无法找到

(shell 脚本文件)pm2:在 crontab 任务中找不到命令

CentOS 中 crontab 定时任务找不到命令问题

Python 脚本在 docker 容器中找不到使用 CRON 运行的 ENV 变量

尽管脚本在手动运行时有效,但 Crontab 没有在 macOS 中运行我的 python 脚本