如何用PHP检查cronjob是否存在?

11

有没有一种方法可以用php知道cronjob是否已经存在?

我希望它能在大多数主机上运行,甚至是共享主机。

4个回答

12

不行,在PHP中没有这样的直接权限。

但是(在专用服务器上),您可以编写一个PHP脚本来读取 /etc/crontab 文件并解析信息以检查服务器上是否存在特定的cron。


3
你可以尝试运行crontab -l命令,这应该可以从PHP中运行。你可能需要限定完整的路径,例如/usr/bin/crontab -l,这将取决于主机。
如果PHP页面和cron作业是以相同用户身份运行的(现在许多共享主机使用setuid php脚本),则会返回运行命令的用户的crontab条目,这正是您想要的。要获取另一个用户的crontab条目,在大多数系统上都需要超级用户权限,以及crontab -l -u otheruser

1
除了Nathan的回答之外:
如果您可以运行exec()crontab命令
function cronjob_exists($command){

    $cronjob_exists=false;

    exec('crontab -l', $crontab);

    if(isset($crontab)&&is_array($crontab)){

        $crontab = array_flip($crontab);

        if(isset($crontab[$command])){

            $cronjob_exists=true;

        }

    }

    return $cronjob_exists;
}

$command = '30 9 * * * '.__DIR__.'/cronjobs/job1.php';

if(cronjob_exists($command)===FALSE){

    //add job to crontab
    exec('echo -e "`crontab -l`\n'.$command.'" | crontab -');

}

1

使用shell_exec()system()或类似的东西可能解决问题。 但是在打开safe_mode时不起作用。

我认为共享主机不会启用这些功能。

@Nathan:难道/usr/bin/crontab -l不会返回运行脚本的用户的crontab吗?例如www-data、wwwrun、apache或其他什么?


1
是的...我猜想大多数共享主机都会设置用户 PHP 脚本作为用户运行,就像他们的定时任务一样。我将编辑以澄清我的答案。 - Nathan

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