特定の時間に1回だけファイルを実行するようにcron
を設定するにはどうすればよいですか?選択肢の1つは at
ですが、標準のホスティングプランのすべてのユーザーがアクセスできるわけではありません。したがって、私はcron
を使用してそれを行う方法があるかどうか疑問に思っていましたか?
これを試して、2011年3月30日の午前0時にコマンドを実行します。
0 0 30 3 ? 2011 /command
[〜#〜] warning [〜#〜]:コメントに記載されているように、year列は標準ではサポートされていませんcronの/ default実装。 cronの標準実装で将来特定の時間にスクリプトを実行する適切な方法については、以下のTomOnTimeの回答を参照してください。
本当にat
を使用したいです。これはまさにこの目的のために作られています。
echo /usr/bin/the_command options | at now + 1 day
ただし、at
がない場合、またはホスティング会社からアクセスできない場合は、cronジョブに、1回だけ実行されるようにするコードを含めることができます。
非常に特定の時間でcronエントリを設定します。
0 0 2 12 * /home/adm/bin/the_command options
次に/ home/adm/bin/the_commandは、1回だけ実行されることを確認する必要があります。
#! /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!' [email protected]
本当に使いたいです。これはまさにこの目的のために作られています。
echo /usr/bin/the_command options | at now + 1 day
ただし、持っていない場合、またはホスティング会社がアクセスできない場合は、自己削除のcronエントリを作成できます。
残念ながら、これによりすべてのcronエントリが削除されます。ただし、1つしかない場合はこれで問題ありません。
0 0 2 12 * crontab -r ; /home/adm/bin/the_command options
コマンド crontab -r
は、crontabエントリを削除します。幸いなことに、残りのコマンドラインは引き続き実行されます。
警告:これは危険です!すべてのcronエントリを削除します。多数ある場合は、「crontab -r」行があるものだけでなく、すべて削除されます!
/etc/cron.d
にcrontabファイルを配置すると、コマンドを実行するスクリプトを実行し、/etc/cron.d
のcrontabファイルを削除できます。もちろん、これはスクリプトをルートとして実行する必要があることを意味します。
あなたのコメントは、プログラミング言語からこれを呼び出そうとしていることを示唆しています。その場合、プログラムはsleepを呼び出す子プロセスをforkしてから作業できますか?
プログラムに希望のランタイムまでの秒数を計算させ、Shell_exec("sleep ${secondsToWait) ; myCommandToRun");
を呼び出させる
at
が正しい方法です。
マシンにat
コマンドがなく、その上に特権をインストールしていない場合、cron
にこのようなものを置くことができます(おそらくcrontab
コマンド):
* * * 5 * /path/to/comand_to_execute; /usr/bin/crontab -l | /usr/bin/grep -iv command_to_execute | /usr/bin/crontab -
コマンドを1回実行し、その後cron
から削除します。