1

有没有办法让 php 脚本(apache 用户)使用 AT 守护进程安排任务?

我想将任务从我的 php 脚本传递到 atd,如下所示:

exec( "echo 'date > /some/dir/date.txt' | at now + 1 minute > /dev/null &" );

当我从命令行(root)运行 php 脚本时,一切都很好,但是,当我通过 http 请求运行脚本时,永远不会创建 at 作业。

我知道 apache 没有 shell 访问权限,有什么可用的解决方法吗?

4

2 回答 2

0

exec()不使用外壳,因此您不能使用管道等。

使用反引号,shell_exec()或者system()改为使其工作。

shell_exec("echo 'date > /some/dir/date.txt' | at now + 1 minute");
于 2012-12-20T15:03:53.003 回答
0

如果您的脚本在其下运行的帐户(Apache 或 cgi 用户)没有 shell 访问权限,则 at 将无法工作,因为稍后将尝试运行不正常的 shell(如 /bin/bad)来运行该命令。

检查您是否可以执行任何操作:

$output = array();
exec('whoami',$output);
print_r($output);

如果这确实有效,您可以尝试类似(伪代码):

write "date > /some/dir/date.txt" in /tmp/atcmd
exec("/usr/bin/at -f /tmp/atcmd now + 1 minute");

所以你需要: - 稍后在其中运行命令的 shell - php 内的权限以运行 exec 函数 - 没有由 /etc/at.{deny,allow} 创建的问题

这基本上意味着(我猜)你需要一个在 php-cgi 中运行的 PHP 切换到一个“真实”帐户。

我现在唯一能想到的其他解决方案是在网络服务器上创建您需要的脚本,并使用 wget 在您有权访问的机器上运行 at 作业。

echo "wget -q http://myserver.mydomain/my/atscript"  | at now + 1 minute

人们实际上将此类构造用于类似 cron 的行为。嘿,我什至可以在我的托管服务上为类似的东西设置一个服务:-)

于 2013-02-19T13:22:34.180 回答