2017-08-26 86 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次! (並按正確順序)