web-dev-qa-db-ja.com

特定の時間に1回だけファイルを実行するようにcronを設定するにはどうすればよいですか?

特定の時間に1回だけファイルを実行するようにcronを設定するにはどうすればよいですか?選択肢の1つは at ですが、標準のホスティングプランのすべてのユーザーがアクセスできるわけではありません。したがって、私はcronを使用してそれを行う方法があるかどうか疑問に思っていましたか?

38
Gajus

これを試して、2011年3月30日の午前0時にコマンドを実行します。

0 0 30 3 ? 2011  /command

[〜#〜] warning [〜#〜]:コメントに記載されているように、year列は標準ではサポートされていませんcronの/ default実装。 cronの標準実装で将来特定の時間にスクリプトを実行する適切な方法については、以下のTomOnTimeの回答を参照してください。

33
gparis

本当に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]
49
TomOnTime

本当に使いたいです。これはまさにこの目的のために作られています。

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」行があるものだけでなく、すべて削除されます!

14
TomOnTime

/etc/cron.dにcrontabファイルを配置すると、コマンドを実行するスクリプトを実行し、/etc/cron.dのc​​rontabファイルを削除できます。もちろん、これはスクリプトをルートとして実行する必要があることを意味します。

3
Brian Showalter

あなたのコメントは、プログラミング言語からこれを呼び出そうとしていることを示唆しています。その場合、プログラムはsleepを呼び出す子プロセスをforkしてから作業できますか?

プログラムに希望のランタイムまでの秒数を計算させ、Shell_exec("sleep ${secondsToWait) ; myCommandToRun");を呼び出させる

1
dj_segfault

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から削除します。

0
alexandre1985