我有一个每天在 Linux 服务器上运行一次的 cron 作业,它执行的脚本中有一个测试:
# Validate ffmpeg is installed
if [ $(which ffmpeg | grep -c "ffmpeg") -eq 0 ]; then
echo "error: ffmpeg is not installed!" | tee -a "$log"
exit 1
fi
每天当我检查日志文件时,消息ffmpeg is not installed!
都在日志中,因此工作尚未执行。如果我which
在 shell 中运行测试,一切都会正常,当我执行脚本时,一切都会正常。
cron 中是否存在一些内在因素导致它无法正确使用命令which
?
答案1
在 crontab 文件的顶部放置 SHELL 和 PATH 声明,例如:
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
看这篇 SE 帖子更多细节。
cron 的默认 SHELL 和 PATH 是SHELL=/bin/sh
,PATH=/usr/bin:/bin
(来自man 5 crontab
手册页)。
答案2
它可能不会获取您的路径,因为它是从 cron 运行的。有几种方法可以让它知道路径,我发现最简单的方法就是对路径进行硬编码。
做一个:
locate which
我的返回结果如下:
[user@server ~]$ locate which |grep bin
/usr/bin/which
然后更改脚本以执行以下操作:
if [ $(/usr/bin/which ffmpeg | grep -c "ffmpeg") -eq 0 ]; then
echo "error: ffmpeg is not installed!" | tee -a "$log"
exit 1
fi
另一个选择是在 crontab 中设置环境和路径:
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin