在 cron 作业中使用“which”命令

Nea*_*ley 3 bash ffmpeg path

我有一个每天在 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命令?

Jon*_*ham 7

在 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手册页)。


J B*_*ron 6

由于它是从 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)

  • 您也可以使用相当幽默的“which which”。 (2认同)