如何使用PHP启动/停止cronjob?

时间:2011-07-01 13:42:15

标签: php linux cron crontab

如果我在命令行中键入crontab -l,我可以看到以下行:

# * * * * * /usr/bin/php /home/user/every_minute_script.php

启动此cronjob,我需要使用crontab -e命令编辑文件,删除行开头的注释字符,保存编辑后的文件,然后退出编辑器。

停止此cronjob,步骤相同,但在行的开头添加注释字符。

我希望使用 PHP脚本实现完全相同的效果,而不是手动编辑文件。

5 个答案:

答案 0 :(得分:12)

我做了一些研究和found in a forum,以下信息:

  

使用EDITOR调用“crontab -e”   环境变量设置为php   脚本。该脚本可以修改   文件和它退出crontab时会   重新阅读文件并更新。

所以,我尝试了一些东西,但它确实有效。我将粘贴下面的工作代码:

#!/usr/bin/php
<?php

$on  = "* * * * * /usr/bin/php /home/user/every_minute_script.php\n";
$off = "# * * * * * /usr/bin/php /home/user/every_minute_script.php\n";

$param    = isset( $argv[1] ) ? $argv[1] : '';
$filename = isset( $argv[2] ) ? $argv[2] : '';

if ( $param == 'activate' )
{
    shell_exec( 'export EDITOR="/home/user/cron.php on"; crontab -e' );
}
elseif( $param == 'deactivate' )
{
    shell_exec( 'export EDITOR="/home/user/cron.php off"; crontab -e' );
}
elseif( in_array( $param, array( 'on', 'off' ) ) )
{
    if ( !is_writable( $filename ) )
        exit();

    $crontab = file( $filename );
    $key = array_search( $param == 'on' ? $off : $on, $crontab );

    if ( $key === false )
        exit();

    $crontab[$key] = $param == 'on' ? $on : $off;
    sleep( 1 );
    file_put_contents( $filename, implode( '', $crontab ) );
}

exit();

?>

实际上,我们有一个名为cron.php的脚本位于/home/user文件夹,设置为可执行(chmod a+x cron.php)并从命令行调用(PHP-CLI) 。稍后我会调整它以从网上运行,这是我的意图。

用法:./cron.php activate启用cronjob,./cron.php deactivate禁用它。

该脚本正确设置EDITOR环境变量(自身),然后调用crontab -e,后者调用EDITOR(现在是相同的cron.php脚本)将临时crontab文件位置作为论点。然后,找到并更改正确的crontab行,并保存修改后的版本,替换临时文件。当脚本退出时,crontab将更新。

这正是我想要的,也符合我的需要。

其他答案很好,可能适合不同的需求和场景,我要感谢所有贡献者。

答案 1 :(得分:7)

我建议在你的every_minute_script.php中进行检查,而不是以编程方式与crontab混淆(这是一种微妙而快速的愤怒):

if (!file_exists('/your/path/run_every_minute_script')) {
  exit;
}

这样,脚本仍然会每分钟开始,但如果不满足条件(/your/path/run_every_minute_script不存在),它将立即终止而无需进一步处理。

(当然,你可以在那里替换不同的条件,例如检查数据库的权限等。)


如果需要邮寄输出,可以使用包装器脚本。的crontab:

* * * * * /your/path/wrapper.sh > /dev/null 2> /dev/null

然后,包装器脚本正确运行该作业,收集其输出和错误,如果这些不是空的,则将它们发送出去(请注意,您也可以在包装器脚本中进行检查;我们没有,因为它依靠数据库)。

答案 2 :(得分:6)

Here's一个非常酷的教程,用于使用PHP创建这种功能。

答案 3 :(得分:2)

将您的停止/开始条件设置在every_minute_script.php

的开头
if($condition == false) {
    exit();
}

答案 4 :(得分:2)

你可以在every_minute_script.php的开头放置一些逻辑来检查一个标志,看它是否应该做什么?这样它就可以旋转,然后如果没有工作可以快速停止。

或者对你的目的来说效率太低了吗?