在 cron 任务中使用 'which' 命令

在 cron 任务中使用 'which' 命令

我有一个每天在 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/shPATH=/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

相关内容