在 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/date
、basename
如/usr/bin/basename
、traceroute
如/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 任务中找不到命令