2017-08-26 87 views
-1

我已经使用curl创造了一些cron作业:用PHP(卷曲)删除单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 

我怎样才能去做这个?

+1

你到目前为止尝试过什么?您用于删除PHP中的cron作业的方法将取决于您的系统中如何设置cron作业。 –

+0

我已经使用此代码添加新的cron exec('echo -e“'crontab -l' \ n curl -s https://ex.example.com/cron/test3.php”| crontab - ',$输出); 我想删除一个 – enassr

+0

您的链接无法访问,至少对我而言。堆栈溢出的良好做法是将代码粘贴到问题本身中并对其进行格式化。 –

回答

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格式。
  • 您可能想要添加一些输出以告诉用户他们的作业已成功添加或删除。另外,如果他们指定了一个删除不存在的作业,那么告诉他们这样做可能是个好主意,这样他们就不会认为某些东西被删除,而不是因为它实际上并不存在。
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!'; 
} 
  • 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结尾。case 4:以换行符开始,以换行符结束) - 如果要使用str_replace执行此操作,则必须调用它4次! (并按正确顺序)