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

Posted

技术标签:

【中文标题】使用 Bash 脚本添加到 Crontab(如果不存在)【英文标题】:Add To Crontab (if not already exists) Using Bash Script 【发布时间】:2021-12-27 05:32:19 【问题描述】:

bash 脚本将作业添加到 crontab 的正确方法是什么,例如

不会有重复的工作 不会使用 crontab 文件 (可选)接近单线

遇到了下面这个解决方案,但是不影响运行crontab -l的输出。

grep 'some_user python /mount/share/script.py' /etc/crontab || echo '*/1 *  *  *  * some_user python /mount/share/script.py' >> /etc/crontab

尝试将其转换为影响crontab -l

(crontab -l | grep '/mount/share/script.py') ||  crontab -l; '*/1 * * * * some_user python /mount/share/script.py >> /root/foo/logs/foo.cron.log 2>&1';  | crontab -

但是运行这个命令会报错:

-bash: */1 * * * * some_user python /mount/share/script.py >> /root/foo/logs/foo.cron.log 2>&1: No such file or directory

【问题讨论】:

【参考方案1】:

但是运行这个命令会报错:

-bash: */1 * * * * some_user python /mount/share/script.py >> /root/foo/logs/foo.cron.log 2>&1: No such file or directory

代码:

(crontab -l | grep '/mount/share/script.py') ||  crontab -l; '*/1 * * * * some_user python /mount/share/script.py >> /root/foo/logs/foo.cron.log 2>&1';  | crontab -

将尝试执行/运行:

'*/1 * * * * some_user python /mount/share/script.py >> /root/foo/logs/foo.cron.log 2>&1'

如果grep 失败。


在其前面添加回显或 printf,因为 crontab 期待来自 stdin 的输入,就像您在第一个示例/代码中所做的那样,类似于:

(crontab -l | grep '/mount/share/script.py') ||  crontab -l; echo '*/1 * * * * some_user python /mount/share/script.py >> /root/foo/logs/foo.cron.log 2>&1';  | crontab -

这是一个替代方案,它是一个完整的脚本。

#!/usr/bin/env bash

cron_entry=$(crontab -l 2>&1)
is_in_cron='/mount/share/script.py'
new_cron_entry='*/1 * * * * some_user python /mount/share/script.py >> /tmp/foo/logs/foo.cron.log 2>&1'

if [[ $cron_entry != *"$is_in_cron"* ]]; then
  printf '%s\n' "$cron_entry" "$new_cron_entry" | crontab -
fi

【讨论】:

以上是关于使用 Bash 脚本添加到 Crontab(如果不存在)的主要内容,如果未能解决你的问题,请参考以下文章

bash 脚本不能通过 crontab 工作

如何使用 crontab 运行运行 Python 脚本的 Bash 脚本

crontab不执行sh脚本 手动可以执行crontab执行失败【亲测】

crontab 普通用户添加的计划任务不能执行

该脚本从命令行运行,但 crontab 失败

Bash 脚本手动运行,但在 crontab 上失败