我有一个 PHP Web 应用程序,它使用 PHP 函数安排 Linux“at”作业exec()
。计划任务是另一个PHP脚本。不知何故,在我怀疑与同时安排同一作业有关的某些条件下,安排在未来很长时间的作业会立即执行。例如,昨天我正在测试此功能,并且过早执行了“at”作业。
我将作业的输出重定向到/var/log/
名为at_job.log
.该作业于昨天(2 月 20 日)UTC 时间 21:17(晚上 9:17)执行,当时是计划作业的时间。以下是截至 UTC 时间 2 月 21 日 17:57(下午 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 ...