如何设置 cron 在特定时间只运行一次文件?

如何设置 cron在特定时间只运行一次文件?其中一个替代方案是 at,但并非所有用户都能按照标准托管计划访问它。因此,我想知道是否有办法做到这一点使用 cron

166940 次浏览

请尝试在2011年3月30日午夜执行以下命令:

0 0 30 3 ? 2011  /command

警告 : 正如注释中指出的,在 cron 的标准/默认实现中不支持 列。请参考 TomOnTime 的回答如下,以获得在将来标准实现 cron 的特定时间运行脚本的正确方法。

您可以在 /etc/cron.d中放置 crontab 文件,它将运行一个脚本来运行您的命令,然后在 /etc/cron.d中删除 crontab 文件。当然,这意味着您的脚本需要以 root 用户身份运行。

您的注释表明您正试图从一种编程语言调用它。如果是这种情况,您的程序是否可以分叉一个调用 sleep 的子进程,然后执行该工作?

让您的程序计算所需运行时之前的秒数,并调用 shell_exec("sleep ${secondsToWait) ; myCommandToRun");怎么样

你真的想使用 at。它正是为此目的而设计的。

echo /usr/bin/the_command options | at now + 1 day

但是,如果您没有 at,或者您的托管公司不提供对它的访问,您可以使用 cron 作业包含的代码来确保它只运行一次。

设置一个带有特定时间的 cron 条目:

0 0 2 12 * /home/adm/bin/the_command options

Next/home/adm/bin/the _ command 需要确保它只运行一次。

#! /bin/bash


COMMAND=/home/adm/bin/the_command
DONEYET="${COMMAND}.alreadyrun"


export PATH=/usr/bin:$PATH


if [[ -f $DONEYET ]]; then
exit 1
fi
touch "$DONEYET"


# Put the command you want to run exactly once here:
echo 'You will only get this once!' | mail -s 'Greetings!' me@example.com

你真的想使用 at。它正是为此目的而设计的。

echo /usr/bin/the_command options | at now + 1 day

但是,如果您没有 at,或者您的托管公司不提供访问它的权限,您可以创建一个自删除 cron 条目。

遗憾的是,这将删除所有 cron 条目。

0 0 2 12 * crontab -r ; /home/adm/bin/the_command options

命令 crontab -r删除 crontab 条目。幸运的是,命令行的其余部分仍将执行。

警告: 这很危险!它删除所有 cron 条目。如果有很多,这将删除它们,而不仅仅是有“ crontab-r”行的那个!

at是正确的方法。

如果机器中没有 at命令,也没有安装特权,那么可以在 cron上安装类似的命令(可以使用 crontab命令) :

* * * 5 * /path/to/comand_to_execute; /usr/bin/crontab -l | /usr/bin/grep -iv command_to_execute | /usr/bin/crontab -

它将执行您的命令一次,然后将其从 cron中删除。

对于那些无法在环境中访问/安装 at的用户,可以使用自定义脚本:

#!/bin/bash
if [ $# -lt 2 ]; then
echo ""
echo "Syntax Error!"
echo "Usage: $0 <shell script> <datetime>"
echo "<datetime> format: %Y%m%d%H%M"
echo "Example: $0 /home/user/scripts/server_backup.sh 202008142350"
echo ""
exit 1
fi


while true; do
t=$(date +%Y%m%d%H%M);
if [ $t -eq $2 ]; then
/bin/bash $1
echo DONE $(date);
break;
fi;
sleep 1;
done

让我们将脚本命名为 < strong > run1time.sh 例如:

nohup bash run1time.sh /path/to/your/script.sh 202008150300 &