我想每天在特定时间范围内运行一个 cronjob,但在此期间只运行一次。这怎么可能呢?
我看到了 anacrhon 中的可能性,但不知道如何设置这种场景。
答案1
您可以放置您的 cronjob /etc/cron.daily/
,它将在该时间范围内自动运行。
编辑:
抱歉,我指的是旧的 Debian 安装,anacron
默认情况下未安装。在这种情况下,在 6:25/etc/cron.daily/
执行/etc/crontab
。但较新的 Debian 安装(Ubuntu 也是如此)anacron
默认安装,因此将在启动后五分钟或每天/etc/cron.daily/
执行。/etc/anacrontab
anacron
为了实现您的计划(来自评论),您可以设置一个 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 在受限的“环境”下运行,您可能需要导出环境变量和诸如此类的东西,但这完全是另一个主题。