【问题标题】:delete single cron job by PHP (curl)通过 PHP (curl) 删除单个 cron 作业
【发布时间】:2017-08-27 12:45:19
【问题描述】:

我使用 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 

我该怎么做?

【问题讨论】:

  • 到目前为止您尝试过什么?在 PHP 中删除 cron 作业的方法取决于系统中 cron 作业的设置方式。
  • 我已经使用这段代码添加了新的 cron exec('echo -e "crontab -l\n curl -s ex.example.com/cron/test3.php " | crontab -', $output);我只想删除一个
  • 您的链接无法访问,至少对我来说是这样。 Stack Overflow 上的良好做法是将代码粘贴到问题本身并格式化。
  • 另外,你的帖子应该有一个清晰简洁的问题。

标签: php curl cron


【解决方案1】:

用户的 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 格式。
  • 您可能想要添加一些输出来告诉用户他们的作业已成功添加或删除。此外,如果他们指定要删除的作业不存在,最好也告诉他们,这样他们就不会认为某些内容已被删除,因为它实际上从未存在过。李>

【讨论】:

    【解决方案2】:

    使用 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!';
    }
    
    • 1 这种方法的烦恼是每次删除作业时都会留下一个杂散的换行符。如果您不希望这样,请记住,如果您要删除第一个作业,它可能不会以一行开头,如果您要删除最后一个作业,它可能不会以换行符结尾,在请注意,使用正则表达式可能是最简单的,例如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 次! (并以正确的顺序)

    【讨论】:

      猜你喜欢
      • 2013-03-27
      • 1970-01-01
      • 1970-01-01
      • 2013-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-27
      • 1970-01-01
      相关资源
      最近更新 更多