如何设置cron在将来的某个特定时间运行一次文件?

时间:2011-03-29 14:01:57

标签: linux unix cron

如何设置cron在将来的某个特定时间运行一次文件?其中一个替代方案是http://en.wikipedia.org/wiki/At_%28Unix%29,但到目前为止标准托管计划上的所有用户都无法访问它。因此,我想知道是否有办法使用cron

7 个答案:

答案 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 &