在 cronjob 中找不到 bash 函数命令

在 cronjob 中找不到 bash 函数命令

在我的 crontab 中,我设置了以下 bash 函数并将其应用于我的工作。表示要在日志中添加时间戳。

adddate() {
    while IFS= read -r line; do
        printf '%s %s\n' "$(date)" "$line";
    done
}

30 06 * * * root $binPath/zsh/test.zsh | adddate 1>>$logPath/log.csv 2>>$errorLogPath/error.txt

但是当我看到error.txt bash 功能不能很好地工作时。

/bin/bash: adddate: command not found

这一切的根本原因在哪里呢?

如果有人有意见,请告诉我。

谢谢

答案1

Cron 不接受 shell 函数,创建一个类似的脚本

#!/bin/bash
adddate() {
    while IFS= read -r line; do
        printf '%s %s\n' "$(date)" "$line";
    done
}
$binPath/zsh/test.zsh | adddate 1>>$logPath/log.csv 2>>$errorLogPath/error.txt

并将其放入 cron 中。

(我假设您在这里使用了$binPathand$logPath来解决这个问题。如果不是这种情况,您必须在脚本中设置它们)

设置SHELL=/bin/bash在你的crontab 可能是使用 shell 函数的一种方式。
(我没有尝试过,如果它有效的话我会感到惊讶)。但即使它有效,我也肯定不会建议它。

答案2

您可以使用别名代替函数:

在您的主目录中添加 .profile 或 .bashrc 文件:

alias adddate="while IFS= read -r line; do printf '%s %s\n' "$(date)" "$line"; done"

然后在你的 crontab 中:

30 06 * * * shopt -s expand_aliases; root $binPath/zsh/test.zsh | adddate 1>>$logPath/log.csv 2>>$errorLogPath/error.txt

通常 crontab (换句话说,非交互式 shell)也不允许使用别名,但您可以通过 激活它shopt -s expand_aliases

相关内容