如何从 shell 脚本写入 cronjob

如何从 shell 脚本写入 cronjob

我想自动化 cronjob(即通过 shell 脚本安排一项任务)。所以我有一个脚本可以做到这一点

#!/bin/ksh
timestamp=$(date +%H%M%S)
if [ "$timestamp" -eq 230000 ]; then
 write to cronjob to execute the same script @ 11:00 PM
fi

所以输出应该如下所示,这可能吗?

00 23 2 10 2 /home/test/run_cron.sh

答案1

您好,欢迎来到 Ask Ubuntu!

crontab您可以通过以下方式写信至stdin

echo  '0 23 * * * /home/test/run_cron.sh' | crontab -

缺点是这会清除所有先前的crontab条目。

如果你必须保留已经存在的条目(而不是从头开始),那么应该这样做:

echo "$(crontab -l ; echo  '0 23 * * * /home/test/run_cron.sh')" | crontab -

答案2

我假设您只想被添加到crontabONCE。因此必须从crontab第一个脚本中删除:

#!/bin/ksh
myname="$0"  

(crontab -l | grep -E -v "$myname";echo " 0 23 \* \* \* $myname") |\
    crontab -

答案3

从评论和你更新的问题中我读到你想运行你的脚本而不是每天晚上 11 点,但第二天晚上 11 点只发送一次。虽然这可以通过以下方式实现,但cron我建议使用at工作。

为此添加 cronjob 时,我们需要计算第二天的日期(设置类似于0 23 2 10 * …10 月 2 日的日期),然后在第二天再次删除该 cronjob。如所述:可能的但很麻烦。因此,这是一项at工作。您可能需要at通过 安装命令sudo apt install at

的语法at有点令人惊讶:要运行的命令不是作为参数给出的,而是从标准输入,所以我们需要将其导入at。以下是一些示例:

echo "ls -l > out1.txt" | at now + 2 minutes
echo "ls -l > out2.txt" | at 23:00
echo "ls -l > out3.txt" | at tomorrow

就你的情况而言:

echo "./test-script.sh" | at 23:00

test-script.sh这将在下次晚上 11 点时运行。

相关内容