Linux“At”作业立即执行

Linux“At”作业立即执行

我有一个 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 ...

相关内容