如何设置cron在将来的某个特定时间运行一次文件?其中一个替代方案是http://en.wikipedia.org/wiki/At_%28Unix%29,但到目前为止标准托管计划上的所有用户都无法访问它。因此,我想知道是否有办法使用cron
?
答案 0 :(得分:46)
您真的想使用at
。它正是为此目的而制作的。
echo /usr/bin/the_command options | at now + 1 day
但是,如果您没有at
,或者您的托管公司没有提供对它的访问权限,您可以让cron作业包含代码,确保它只运行一次。
设置一个具有特定时间的cron条目:
0 0 2 12 * /home/adm/bin/the_command options
下一个/ 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
答案 1 :(得分:33)
尝试使用此命令在2011年3月30日午夜执行命令:
0 0 30 3 ? 2011 /command
警告:正如评论中所述,cron的标准/默认实现中不支持年列。请参阅下面的TomOnTime答案,了解在cron的标准实现中将来在特定时间运行脚本的正确方法。
答案 2 :(得分:14)
你真的想用。它正是为此目的而制作的。
echo /usr/bin/the_command options | at now + 1 day
但是,如果您没有,或者您的托管公司不提供访问权限,您可以自行删除cron条目。
可悲的是,这将删除所有cron条目。但是,如果你只有一个,这很好。
0 0 2 12 * crontab -r ; /home/adm/bin/the_command options
命令crontab -r
删除了您的crontab条目。幸运的是,命令行的其余部分仍将执行。
警告:这很危险!它删除所有cron条目。如果你有很多,这将删除所有,而不仅仅是具有“crontab -r”行的那个!
答案 3 :(得分:3)
您可以在/etc/cron.d
中放置一个crontab文件,该文件将运行一个运行您的命令的脚本,然后删除/etc/cron.d
中的crontab文件。当然,这意味着您的脚本需要以root身份运行。
答案 4 :(得分:0)
您的评论建议您尝试使用编程语言调用此函数。如果是这种情况,您的程序是否可以分叉调用sleep的子进程然后进行工作?
让程序计算到所需运行时间之前的秒数,然后让它调用shell_exec("sleep ${secondsToWait) ; myCommandToRun");
答案 5 :(得分:0)
at
是正确的方法。
如果您的计算机中没有at
命令,并且还没有安装特权,则可以在cron
上放置类似的内容(也许使用{{1 }}命令):
crontab
它将一次执行您的命令,然后将其从* * * 5 * /path/to/comand_to_execute; /usr/bin/crontab -l | /usr/bin/grep -iv command_to_execute | /usr/bin/crontab -
中删除。
答案 6 :(得分:-1)
对于那些无法在环境中访问/安装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
将脚本命名为 run1time.sh 示例可能类似于:
nohup bash run1time.sh /path/to/your/script.sh 202008150300 &