プログラムで新しいcronジョブを作成するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/610839

  •  03-07-2019
  •  | 
  •  

質問

新しいcronジョブをプログラムで追加できるようにしたいのですが、これを行う最良の方法は何ですか?

私の研究から、現在のcrontabをダンプしてから、新しいcrontabを追加できるようです。 crontabに戻ります:

(crontab -l ; echo "0 * * * * wget -O - -q http://www.example.com/cron.php") | crontab -

もっと良い方法はありますか?

役に立ちましたか?

解決

それはいつも私にとってはうまくいきました。

3つのことを実行できる、もう少し洗練されたスクリプトを検討する必要があります。

  1. crontab行を追加します。存在しないことを保証します。既に存在する場合の追加は不適切です。

  2. crontab行を削除します。おそらく存在しなかった場合にのみ警告します。

  3. crontab行を置き換えるための上記2つの機能の組み合わせ。

他のヒント

ルートとして実行している場合の最良の方法は、ファイルを/etc/cron.dにドロップすることです

パッケージマネージャーを使用してソフトウェアをパッケージ化する場合、そのディレクトリにファイルを配置するだけで、それらはcrontabであるかのように解釈されますが、ユーザー名の追加フィールドがあります。例:

ファイル名: /etc/cron.d/per_minute

内容: * * * * * root / bin / sh /home/root/script.sh

OPのソリューションにはバグがあり、エントリを2回追加できる場合があります。以下を使用して修正します。

(crontab -l ; echo "0 * * * * your_command") | sort - | uniq - | crontab -

cronに何かを追加するには

(crontab -l ; echo "0 * * * * hupChannel.sh") 2>&1 | grep -v "no crontab" | sort | uniq | crontab -

cronからこれを削除するには

(crontab -l ; echo "0 * * * * hupChannel.sh") 2>&1 | grep -v "no crontab" | grep -v hupChannel.sh |  sort | uniq | crontab -

希望は誰かを助ける

何かをwgetするだけの1回限りのシナリオでそれを行うことを計画している場合は、 'at'

エディターをteeコマンドに変更するだけです:

export EDITOR="tee"
echo "0 * * * * /bin/echo 'Hello World'" | crontab -e

crontabにすでにエントリがあると仮定すると、次のコマンドは比較的うまく機能するはずです。 $ CMD 変数は、読みやすくするためにのみ存在することに注意してください。 uniq は隣接する行でのみ機能するため、重複をフィルタリングする前にソートすることが重要です。

CMD='wget -O - -q http://www.example.com/cron.php"'
(crontab -l ; echo "0 * * * * $CMD") | sort | uniq | crontab -

現在空のcrontabがある場合、stderrに次のエラーが表示されます。

no crontab for user

これを回避したい場合は、少し複雑さを追加して、次のように追加します。

(crontab -l ; echo "0 * * * * $CMD") 2>&1 | sed "s/no crontab for $(whoami)//"  | sort | uniq | crontab -

man crontabも便利です:

CRONTAB(1)

NAME

   crontab - manipulate per-user crontabs (Dillon's Cron)

シノプシス

   crontab file [-u user] - replace crontab from file

   crontab - [-u user] - replace crontab from stdin

   crontab -l [user] - list crontab for user

JohnZの答えに加えて、sudoerである場合にルートとしてスケジュールする構文は次のとおりです。

(sudo crontab -l ; echo "0 * * * * your_command") | sort - | uniq - | sudo crontab -

ここでの解決策のほとんどは、crontabに行を追加するためのものです。さらに制御が必要な場合は、crontabのコンテンツ全体を制御できるようにする必要があります。

パイピングを使用して、これを非常にエレガントに行うことができます。

crontabを完全に書き換えるには、次のようにします

echo "2 2 2 2 2 /bin/echo foobar" |crontab -

これは、ここで説明する他の回答と簡単に組み合わせることができます

crontab -l | <something> | tee |crontab -

または、ファイルにコンテンツがある場合は、さらに簡単です

cat <file> |crontab -
function cronjob_exists($command){

    $cronjob_exists=false;

    exec('crontab -l', $crontab);


    if(isset($crontab)&&is_array($crontab)){

        $crontab = array_flip($crontab);

        if(isset($crontab[$command])){

            $cronjob_exists=true;

        }

    }
    return $cronjob_exists;
}

function append_cronjob($command){

    if(is_string($command)&&!empty($command)&&cronjob_exists($command)===FALSE){

        //add job to crontab
        exec('echo -e "`crontab -l`\n'.$command.'" | crontab -', $output);


    }

    return $output;
}

    append_cronjob('* * * * * curl -s http://localhost/cron/test.php');

これは、コマンドを追加する前に、コマンドがまだ存在しないことを確認します。

crontab -l 2>/dev/null | grep -q '/path/to/script' || echo "5 * * * * /path/to/script" | crontab -

乾杯。

stdoutを crontab にパイプすると、macOSに新しいcrontabがインストールされなかったため、代わりにサブシェルで tee エディターを使用してこのソリューションを見つけました:

(EDITOR=tee && (crontab -l ; echo "@daily ~/my-script.sh" ) | uniq - | crontab -e)

また、タスクを/etc/cron.*/に追加できます

重複を回避する別のワンライナーの方法があります

(crontab -l 2>/dev/null | fgrep -v "*/1 *  *  *  * your_command"; echo "*/1 *  *  *  * your_command") | crontab -

JohnZの回答を行い、ユーザーのcrontabなしメッセージを回避する方法、または set -eu タイプの環境で操作する必要があり、できない場合何かが失敗を返すようにします(この場合、 2&gt; / dev / null 部分はオプションです):

( (crontab -l 2>/dev/null || echo "")  ; echo "0 * * * * your_command") | sort -u - | crontab -

または、読みやすくするために分割したい場合:

new_job="0 * * * * your_command"
preceding_cron_jobs=$(crontab -l || echo "")
(echo "$preceding_cron_jobs" ; echo "$new_job") | sort - | uniq - | crontab -

または、必要に応じてyour_commandへの参照を削除します(例:スケジュールが変更された場合、1回だけcronする必要があります)。この場合、 uniq は不要になりました(ボーナスが追加され、挿入順序も保持されます):

new_job="0 * * * * your_command"
preceding_cron_jobs=$(crontab -l || echo "")
preceding_cron_jobs=$(echo "$preceding_cron_jobs" | grep -v your_command )
(echo "$preceding_cron_jobs" ; echo "$new_job") | crontab -

cronテーブルテキストファイルを直接編集することもできますが、解決策は完全に受け入れられるようです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top