2017-08-26 17 views
-1

私はカールを使用して、いくつかのcronジョブを作成した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 - '、$出力); 1つだけを削除します – enassr

+0

あなたのリンクは、少なくとも私にはアクセスできません。 Stack Overflowの良い習慣は、質問自体にコードを貼り付けてフォーマットすることです。 –

答えて

0

ユーザーのcrontabは単なるテキストファイルです。 crontab -eを実行すると、/var/spool/cron/crontabs/のcrontabのコピーが/tmpにコピーされ、テキストエディタで開かれます。保存すると、変更が加えられると、一時ファイルはcrontabsディレクトリにコピーされて、ユーザの前のcrontab(存在する場合)を上書きします。

crontabコマンドを使用すると、内容を一覧表示することも、手動で編集するために起動することもできます(ただし、ラッパーを作成したにもかかわらず)。私はあなたのためにそれを行うラッパーを書くでしょう。それは2つのコマンドラインパラメータを取るでしょう:

  • 何をしたいかを指定します。追加または削除します。
  • 追加または削除する行。

それはこのようなものになります:行を追加します

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

あなたはこのようにそれを実行することができ

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); 
     } 
    } 
} 

* * * * 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」であること、または2番目のパラメータが存在することです。最初のパラメータが設定されているだけでなく、有効なオプションであることを確認し、そうでない場合は使用法サマリーを吐き出すようにしてください。クレジットを追加するには、2番目のパラメータが存在するだけでなく、有効な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:改行で始まり、改行で終わる) - str_replaceでこれを行う場合は、4回呼び出す必要があります。 (正しい順序で)