通过PHP删除单个cron作业(curl)

时间:2017-08-26 16:57:12

标签: php curl cron

我使用curl创建了一些cron作业:

curl -s  https://ex.example.com/cron/test1.php
curl -s  https://ex.example.com/cron/test2.php
curl -s  https://ex.example.com/cron/test3.php
curl -s  https://ex.example.com/cron/test4.php

现在我想使用PHP删除一个cron作业:

curl -s https://ex.example.com/cron/test3.php 

我该怎么做呢?

2 个答案:

答案 0 :(得分:0)

使用file_get_contents将文件转换为字符串,使用str_replace删除该行,并使用file_put_contents进行保存。像

<?php 
$file="/path/to/jobs.sh";
$jobs=file_get_contents($file);
$jobs=str_replace('curl -s https://ex.example.com/cron/test3.php','',$jobs,$count);
if($count<1){
    echo "failed to delete the job, couldn't find it!";
    return 1;
}else{
    file_put_contents($file,$str);
    echo 'deleted '.$count.' jobs!';
}
  • 这种方法的一个烦恼是,每次删除作业时都会留下一个离线换行符。如果您不想这样做,请记住,如果您要删除第一个作业,它可能不会以一行开头,如果您要删除上一个作业,它可能不会以一个换行符,考虑到这一点,它可能最容易使用正则表达式,如preg_replace('/\s*'.preg_quote('curl -s https://ex.example.com/cron/test3.php','/').'\s*/',"\n",$jobs,$count); - 这不会留下流浪新线,并将说明工作既不是开始也不是结束的可能性使用换行符,但在所有4个案例中删除换行符。 (案例1:它不是以换行符开头,并且它不以换行符结束,它是唯一的作业。案例2:它不是以换行符开头的,但结尾为1.案例3:它以换行符开头,但不以1结尾。案例4:以换行符开头,以换行符结束) - 如果你想用str_replace做这个,你不得不称它为4次! (并按照正确的顺序)

答案 1 :(得分:0)

用户的crontab只是一个文本文件。当您运行crontab -e时,/var/spool/cron/crontabs/的crontab副本将复制到/tmp,然后使用文本编辑器打开。保存后,如果进行了更改,则会将临时文件复制回crontabs目录以覆盖用户以前的crontab(如果存在)。

crontab命令允许您列出内容,或启动它以进行手动编辑,但不特别允许您添加(尽管您已为其创建了包装)或从此文件中删除。我会编写一个包装器来为你做这个,它将需要两个命令行参数:

  • 指明你想做什么的东西;添加或删除。
  • 您要添加或删除的行。

它看起来像这样:

<强> crontab.php

$cron   = '/var/spool/cron/crontabs/' . `echo $USER`;
$action = $argv[1];
$line   = array_slice( $argv, 2 );

if ( $action == 'add' ) {
    file_put_contents( $cron, $line . "\n", FILE_APPEND );
} elseif ( $action == 'del' ) {
    $file = explode( "\n", file_get_contents( $cron ));
    unlink( $cron );

    foreach ( $file as $file_line ) {
        if ( trim( $file_line ) != trim( $line )) {
            file_put_contents( $cron, $file_line . "\n", FILE_APPEND );
        }
    }
}

您可以像这样运行:

./crontab.php add * * * * curl -s https://ex.example.com/cron/test3.php

这会添加一行:

* * * * curl -s https://ex.example.com/cron/test3.php

...到用户的crontab的末尾。以下内容:

./crontab.php add * * * * curl -s https://ex.example.com/cron/test3.php

...将用于删除该行,无论它在文件中的哪个位置。

请注意,上面的脚本只是一个让您从一个方向开始的示例。它缺少一些东西,即错误检查:

  • 它不验证用户的crontab是否存在。如果用户从未添加过cron作业,则该文件将不存在。您需要检查它是否在那里,如果没有,则创建一个新文件。
  • 它不验证已设置的参数。例如,第一个参数是“add”或“del”,或者第二个参数存在。您应该验证不仅设置了第一个参数,而且它是一个有效选项,并且如果不是,则吐出使用情况摘要。对于额外的功劳,您可以检查第二个参数不仅存在,而且是有效的cron格式。
  • 您可能希望添加一些输出以告知用户他们的作业已成功添加或删除。另外,如果他们指定要删除的作业不存在,那么告诉他们也是一个好主意,这样他们就不会认为某些东西被删除了,因为它实际上并不存在。