使用exec()运行Unix的“at”命令

3

我需要使用PHP运行unix中的at命令。如何实现呢?对于我所做的事情,curl不是一个选项。如果我尝试简单地运行exec('at'),它没有任何响应。但是,如果我使用ssh运行它,它就能正常工作。所以我猜这是权限/路径问题。

4个回答

4

请记住,“at”命令从标准输入中接收其脚本,因此您需要使用popen()打开到at命令的管道。将您的命令写入该管道并关闭它。当您打开管道时,您希望“at”运行命令的时间应该是命令行的一部分。

<?php
$r = popen('/usr/bin/at noon');
fwrite($r,"ls -l");
pclose($r);
?>

只有一个注意事项,您必须在 popen 中使用 "mode",就像这样:$r = popen('/usr/bin/at noon','r'); - Ajax
@Ajax,干得好。除了示例中的模式应该是'w'。 - jbruni

3

我想你在命令行中输入了一些真正的at命令,因为只有at是无效语法。你的命令应该包括一些参数。

然而,也许你的问题是at不在$PATH中。尝试使用完整路径运行at,通常是/usr/bin/at。可以通过whereis at检查。


1
运行cat /etc/passwd命令来检查apache用户使用的shell,如果是bin/false,则不能从apache用户运行“at”命令。
我发现了一个技巧,通过在运行shell命令之前导出shell到bin/bash,就像这样:

export SHELL=/bin/bash; echo "shell command" | at :time: :date:

并将其作为php exec()函数的参数传递。
这样,您就可以从apache运行您的“at”调度。

1
原因在文件“/etc/at.deny”中。浏览该文件,您会看到一行“www-data”,这是apache2正在运行的用户(在我的情况下是文件中的最后一行)。这将拒绝用户“www-data”运行“at”命令。只需从/etc/at.deny中删除该行即可。然后,您可以使用“shell_exec”运行“at”命令。
希望对您有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接