PHP関数を使用してLinux "at"ジョブをスケジュールするPHP Webアプリケーションがありますexec()
。スケジュールされたタスクは別のPHPスクリプトです。とにかく、遠い将来にスケジュールされたジョブは、同じジョブを同時にスケジュールすることに関連していると疑われる特定の条件下で即座に実行されます。たとえば、昨日この機能をテストしていましたが、「at」ジョブが早期に実行されました。
ジョブ出力を/var/log/
というファイルにリダイレクトしましたat_job.log
。ジョブは、昨日(2月20日)21:17 UTC(午後9:17)にジョブがスケジュールされた時刻に実行されました。 2月21日17時57分(UTC)(午後5時57分)基準ログファイルの内容は次のとおりです。
..
job 72 at Thu Feb 21 23:07:00 2019
job 73 at Thu Feb 21 23:17:00 2019
以下は、同じ時間(2月21日17:57 UTC)の「at」ジョブキューです。
# atq
73 Thu Feb 21 23:17:00 2019 a staging
これがどのように可能であるか、私が間違っているかどうか疑問に思います。それ以来、私は作業スケジュールが同時にキャッチされないように安全装置を用意しましたが、ここで何が起こっているのか100%確信できません。
修正する:
以下で実行したコマンドは次のとおりです(一部の詳細を隠すために少し変更されます)。
/usr/bin/php -q /PATH/TO/PHP/SCRIPT/cli_admin.php cli product_list_edit 20 | at -m 2206 21.02.2019 >> /var/log/at_log.log 2>&1
これにより、スクリプトがすぐに実行されるだけでなく、後でスケジュールされたタスクも実行されるようです(重複した項目はパテウィンドウで直接テストされているコマンドです)。
atq
75 Thu Feb 21 22:06:00 2019 a staging
76 Thu Feb 21 22:06:00 2019 a root
74 Thu Feb 21 21:43:00 2019 a staging
答え1
at
これは、コマンドを実行する場所を誤って理解しているようです。
このat
コマンドは、標準入力から実行するコマンドを読み込みます。
at
特定の時間にコマンドを実行するには、php
コマンド(出力ではありません)を入力する必要がありますat
。
echo '/usr/bin/php -q /PATH/TO/PHP/SCRIPT/cli_admin.php cli product_list_edit 20' | at ...
または、
at ... <<END_JOB
/usr/bin/php \
-q /PATH/TO/PHP/SCRIPT/cli_admin.php \
cli product_list_edit 20
END_JOB
(...
オプションはどこにありますかat
?)
または、ファイルからコマンドを読み取るには
at -f filename ...