【问题标题】:how to get php/apache to schedule tasks using the AT daemon如何让 php/apache 使用 AT 守护进程安排任务
【发布时间】:2012-12-20 14:42:35
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: php linux apache centos


    【解决方案1】:

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

    使用反引号,shell_exec()system() 来代替它。

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

    【讨论】:

    • tnx ThiefMaster,使用 shell_exec 我的 error_log 显示“出于安全原因,shell_exec() 已被禁用”。我不确定如果我启用它会有什么影响。
    • 通常共享主机公司通过 php.ini 禁用它,因为他们不希望 php 应用程序运行 shell 命令。通常他们的安全性很差(同一用户组中的所有客户,因此仅受诸如 open_basedir 之类的限制,无法窥探其他客户的文件 - 而 shell 命令显然绕过了该限制)
    【解决方案2】:

    如果您的脚本运行的帐户(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 的行为。嘿,我什至可以在我的托管服务上为类似的东西设置一个服务:-)

    【讨论】:

      猜你喜欢
      • 2016-03-31
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多