每晚 3 点至 6 点之间运行 Cronjob,但仅运行一次

每晚 3 点至 6 点之间运行 Cronjob,但仅运行一次

我想每天在特定时间范围内运行一个 cronjob,但在此期间只运行一次。这怎么可能呢?

我看到了 anacrhon 中的可能性,但不知道如何设置这种场景。

答案1

您可以放置​​您的 cronjob /etc/cron.daily/,它将在该时间范围内自动运行。


编辑:

抱歉,我指的是旧的 Debian 安装,anacron默认情况下未安装。在这种情况下,在 6:25/etc/cron.daily/执行/etc/crontab。但较新的 Debian 安装(Ubuntu 也是如此)anacron默认安装,因此将在启动后五分钟或每天/etc/cron.daily/执行。/etc/anacrontabanacron


为了实现您的计划(来自评论),您可以设置一个 cronjob,例如在 3-6 之间每 10 分钟启动一次,anacron以确保备份作业只运行一次,或者您可以编写自定义控制脚本。

1.替代方案:anacron

mkdir ~/.local/share/anacron_spool
echo "1 0 backup.daily /path/to/backup.sh" > ~/.config/anacrontab
(crontab -l; echo "*/10 3-6 * * * /usr/sbin/anacron -s -t $HOME/.config/anacrontab -S $HOME/.local/share/anacron_spool") | crontab -

这将使 anacron 序列化 ( -s) 运行 中定义的所有作业~/.config/anacrontab。由于默认情况下只有 root 才具有写入权限来写入/var/spool/anacron/存储时间戳的位置,因此我们使用自定义的 spool-dir ( -S)。如果今天的所有作业都已完成,anacron 将退出。

2. 替代方案:自定义控制脚本

打开编辑器(例如sudo nano /usr/local/bin/run_once_a_day.sh)并粘贴以下内容:

#!/bin/bash
SPOOL="$HOME/.local/share/run_once_spool/"
if [ $# != 2 ]; then
    echo "Usage: $(basename $0) <job-identifier> <command>"
    exit 1
fi

if [ ! -d $SPOOL ]; then
    mkdir $SPOOL
fi

if [ -e ${SPOOL}${1} ]; then
    last_run=$(cat ${SPOOL}${1})
else
    last_run=0
fi

today=$(date +%Y%m%d)
if [ $last_run != $today ]; then
    $2
    echo $today > ${SPOOL}${1}
fi

CTRL+O保存并按CTRL+X退出。使其可执行并添加一个 cronjob,它将定期启动它:

sudo chmod 755 !$
(crontab -l; echo "*/10 3-6 * * * /usr/local/bin/run_once_a_day.sh backup.daily /path/to/backup.sh") | crontab -

答案2

cron 任务每次都会运行只有一次按给定的时间表/时间运行。因此,如果您在 3 点到 6 点之间的任意时间设置 cron 作业,该作业将仅在指定时间运行一次。仅运行一次,绝不会超过一次!

请参阅以下更多解释和一些示例:http://en.wikipedia.org/wiki/Cron

答案3

我认为最简单的解决方法是在间隔内每 N 分钟调用一次包装器脚本,但它首先检查执行时创建的“锁定”文件是否存在。

#!/bin/bash
[[ -f /dev/shm/cron-once-script-lock ]] && exit 0
touch /dev/shm/cron-once-script-lock

actualcronjob.sh # or whatever non-script command it may be

# end of wrapper script

cron 行将会像这样:

*/10 3-6 * * * /wherever/the/script/is/wrapper-script.sh

也许

*/10 3-6 * * * bash /wherever/the/script/is/wrapper-script.sh

唯一的警告是 cron 在受限的“环境”下运行,您可能需要导出环境变量和诸如此类的东西,但这完全是另一个主题。

相关内容