如何让php / apache使用AT守护进程安排任务

时间:2012-12-20 14:42:36

标签: php linux apache centos

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

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

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

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

我知道apache没有shell访问权限,有没有可用的工作?

2 个答案:

答案 0 :(得分:0)

exec()不使用shell,因此您无法使用管道等。

使用反引号,shell_exec()system()来使其正常工作。

shell_exec("echo 'date > /some/dir/date.txt' | at now + 1 minute");

答案 1 :(得分:0)

如果你的脚本运行的帐户(Apache或cgi用户)没有shell访问权限,那么将无法工作,因为稍后将尝试运行该命令的功能失调的shell(如/ bin / bad)。 / p>

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

$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的行为。嘿,我甚至可能在我的托管服务上为这样的东西设置服务: - )