プログラムで新しいcronジョブを追加できるようにしたいのですが、これを行う最善の方法は何ですか?
私の研究から、現在のcrontabをダンプしてから新しいcrontabを追加し、それをcrontabにパイプで戻すことができるようです:
(crontab -l ; echo "0 * * * * wget -O - -q http://www.example.com/cron.php") | crontab -
もっと良い方法はありますか?
プログラムで新しいcronジョブを追加できるようにしたいのですが、これを行う最善の方法は何ですか?
私の研究から、現在のcrontabをダンプしてから新しいcrontabを追加し、それをcrontabにパイプで戻すことができるようです:
(crontab -l ; echo "0 * * * * wget -O - -q http://www.example.com/cron.php") | crontab -
もっと良い方法はありますか?
回答:
それはいつも私にとってうまくいきます。
3つのことを実行できる、もう少し高度なスクリプトを検討する必要があります。
crontab行を追加します。それが存在しないことを保証します。既に存在する場合に追加するのは悪いです。
crontab行を削除します。おそらく、存在しない場合にのみ警告します。
crontab行を置き換える上記の2つの機能の組み合わせ。
ルートとして実行している場合の最善の方法は、ファイルを/etc/cron.dにドロップすることです。
パッケージマネージャーを使用してソフトウェアをパッケージ化する場合、そのディレクトリにファイルを置くだけで、それらはcrontabであるかのように解釈されますが、ユーザー名の追加フィールドがあります。例:
ファイル名: /etc/cron.d/per_minute
コンテンツ:
* * * * * root /bin/sh /home/root/script.sh
/etc/cron.d/*
?確認のために1時間待つ必要がある場合、何かが機能しているかどうかを知るのは困難です。
OPのソリューションにはバグがあり、エントリを2回追加できる場合があります。以下を使用して修正してください。
(crontab -l ; echo "0 * * * * your_command") | sort - | uniq - | crontab -
sort
前にuniq
:、例えば(crontab -l ; echo "0 * * * * your_command") | sort - | uniq - | crontab -
uniq
。の-u
オプションを使用しますsort
。
何かを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 -
誰かを助けることを願っています
2>&1 | grep -v "no crontab"
crontabがない場合、出力行crontab: no crontab for...
はstderrに送信されるため、実際には必要ありません。その出力をキャプチャしてstdoutに送信し、grepを使用してフィルタリングする理由はありません。crontab: no crontab for...
出力に表示されないようにすることが目的の場合は、を使用します2> /dev/null | sort....
。
何かを取得するための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 -
ここでのソリューションのほとんどは、crontabに行を追加するためのものです。さらに制御が必要な場合は、crontabの内容全体を制御できるようにする必要があります。
パイピングを使用して、これをかなりエレガントに行うことができます。
crontabを完全に書き換えるには、
echo "2 2 2 2 2 /bin/echo foobar" |crontab -
これは、ここで説明されている他の回答と簡単に組み合わせることができます
crontab -l | <something> | tee |crontab -
または、ファイルにコンテンツがある場合は、さらに簡単です
cat <file> |crontab -
これは、重複を回避する別のワンライナー方法です
(crontab -l 2>/dev/null | fgrep -v "*/1 * * * * your_command"; echo "*/1 * * * * your_command") | crontab -
そして、JohnZの回答を行ってno crontab for user
メッセージを回避する方法、またはset -eu
型環境で操作する必要があり、何も失敗を返すことができない場合(この場合、2>/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への参照をすべて削除します(例:スケジュールが変更された場合、一度だけ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 -
man crontabも役立ちます:
CRONTAB(1)
名前
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
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');
stdoutをcrontab
pipingしてmacOSに新しいcrontabをインストールしなかったので、サブシェルでtee
エディターを使用して、このソリューションを代わりに見つけました:
(EDITOR=tee && (crontab -l ; echo "@daily ~/my-script.sh" ) | uniq - | crontab -e)
また、/ etc / cron。* /にタスクを追加することもできます
cronテーブルのテキストファイルを直接編集することもできますが、ソリューションは完全に許容できるようです。