通过 bash 脚本将 bash 脚本添加到 crontab

Posted

技术标签:

【中文标题】通过 bash 脚本将 bash 脚本添加到 crontab【英文标题】:add bash script to crontab via bash script 【发布时间】:2022-01-20 10:48:20 【问题描述】:

我想将带有文件名的日期添加到我的 bash 脚本中,该脚本将通过脚本添加到 crontab 文件中。问题是 crontab 文件中的条目已经附加了日期。但我的要求是在 crontab 中有 date 命令。

crontab -l > "$FILENAME"
if grep -i cron "$FILENAME"; then
    echo "Cron Job already present in User's crontab file"
else
    echo "*/5 * * * * bash -x /home/cronjob/cron.sh > /home/cronjob/myjob_`date +\%Y\%m\%dT\%H\%M\%S`.log 2>&1 " >> mycron
    crontab mycron
    echo "Crontab added to User's Crontab"
fi

实际:

*/5 * * * * bash -x /home/cronjob/cron.sh > /home/cronjob/myjob_20211217053830.log 2>&1

要求:

*/5 * * * * bash -x /home/cronjob/cron.sh > /home/cronjob/myjob_`date +%Y%m%d%H%M%S`.log 2>&1

我也尝试添加转义字符,但似乎没有用

【问题讨论】:

这是个糟糕的主意。只需让/home/cronjob/cron.sh 计算日期并执行exec > /home/cronjob/myjob_$(date ...) 2>&1 【参考方案1】:

使用猫

cat << '==CRONTAB_LINE==' >> mycron
*/5 * * * * bash -x /home/cronjob/cron.sh > /home/cronjob/myjob_$(date +%Y%m%dT%H%M%S).log 2>&1 
==CRONTAB_LINE==

结果

crontab -e
*/5 * * * * bash -x /home/cronjob/cron.sh > /home/cronjob/myjob_$(date +%Y%m%dT%H%M%S).log 2>&1

【讨论】:

【参考方案2】:

您的 crontab 条目似乎已关闭。由于 % 是 crontab 文件中的特殊(换行符)字符,因此转义它们应该会得到所需的结果:

*/5 * * * * bash -x /home/cronjob/cron.sh > /home/cronjob/myjob_`date +\%Y\%m\%d\%H\%M\%S`.log 2>&1

实现这一点的回声线是:

echo "*/5 * * * * bash -x /home/cronjob/cron.sh > /home/cronjob/myjob_\`date +\\%Y\\%m\\%dT\\%H\\%M\\%S\`.log 2>&1 " >> mycron

我验证这在 Ubuntu 中有效。

此外,将SHELL=/bin/bash 行添加到 crontab 文件(条目上方)可确保 bash 解释 crontab 条目。虽然在这种情况下您可能不需要它,但它会带来更多可能性。

【讨论】:

【参考方案3】:

要插入你必须替换的命令输出

`date +\%Y\%m\%dT\%H\%M\%S` 

$(date +\%Y\%m\%dT\%H\%M\%S)

【讨论】:

以上是关于通过 bash 脚本将 bash 脚本添加到 crontab的主要内容,如果未能解决你的问题,请参考以下文章

将 bash 脚本添加到路径

Bash脚本函数溢出到其他脚本中

bash 脚本从 bash 脚本添加 git 凭据

如何在没有注销/登录的情况下将用户添加到组 - Bash 脚本

将小 bash 脚本添加到 cloudbuild.yaml

使用 Bash 脚本添加到 Crontab(如果不存在)