我有一个每天在 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
Run Code Online (Sandbox Code Playgroud)
每天当我检查日志文件时,消息ffmpeg is not installed!
都在日志中,因此工作尚未执行。如果我which
在 shell 中运行测试一切正常,当我执行脚本时一切正常。
cron 是否有内在的东西阻止它正确使用which
命令?
在 crontab 文件的顶部放置 SHELL 和 PATH 声明,如:
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
Run Code Online (Sandbox Code Playgroud)
有关更多详细信息,请参阅此 SE 帖子。
cron 的默认 SHELL 和 PATH 是SHELL=/bin/sh
, PATH=/usr/bin:/bin
(来自man 5 crontab
手册页)。
由于它是从 cron 运行的,因此它可能不会选择您的路径。有几种方法可以让它知道我发现的最简单的路径就是硬编码路径。
做一个:
locate which
Run Code Online (Sandbox Code Playgroud)
我的返回这个:
[user@server ~]$ locate which |grep bin
/usr/bin/which
Run Code Online (Sandbox Code Playgroud)
然后更改您的脚本以执行以下操作:
if [ $(/usr/bin/which ffmpeg | grep -c "ffmpeg") -eq 0 ]; then
echo "error: ffmpeg is not installed!" | tee -a "$log"
exit 1
fi
Run Code Online (Sandbox Code Playgroud)
另一种选择是在 crontab 中设置环境和路径:
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
Run Code Online (Sandbox Code Playgroud)