サーバーをセットアップするために実行するスクリプトを通じて、cronジョブを追加する必要があります。現在Ubuntuを使用しています。私は使用できますcrontab -e
が、現在のcrontabを編集するためのエディターが開きます。これをプログラムで実行したい。
そうすることは可能ですか?
サーバーをセットアップするために実行するスクリプトを通じて、cronジョブを追加する必要があります。現在Ubuntuを使用しています。私は使用できますcrontab -e
が、現在のcrontabを編集するためのエディターが開きます。これをプログラムで実行したい。
そうすることは可能ですか?
回答:
cronジョブは通常、以下のユーザーごとのファイルに保存されます /var/spool/cron
あなたがする最も簡単なことはおそらく、ジョブが設定されたテキストファイルを作成し、それをcronスプールフォルダにコピーして、適切な権限(600)があることを確認することです。
以下は、新しいジョブを使用しない/ファイル内にある必要がないワンライナーです。
(crontab -l 2>/dev/null; echo "*/5 * * * * /path/to/job -with args") | crontab -
これ2>/dev/null
は、no crontab for username
現在crontabエントリがない場合に一部の* nixが生成するメッセージを受信しないようにするために重要です。
echo -e "$(sudo crontab -u root -l)\n* * * * * echo hello > /home/danny/temp.log 2>&1" | sudo crontab -u root -
うまくいけば、このことができます誰か
ユーザーcrontab(rootを含む)の場合、次のようなことができます。
crontab -l -u user | cat - filename | crontab -u user -
「filename」という名前のファイルには、追加する項目が含まれています。sed
またはの代わりにまたはを使用してテキストを操作することもできますcat
。crontab
ファイルを直接変更するのではなく、コマンドを使用する必要があります。
同様の操作は次のようになります。
{ crontab -l -u user; echo 'crontab spec'; } | crontab -u user -
システムのcrontabを変更または作成している場合、通常のテキストファイルと同じように操作できます。彼らはに格納されている/etc/cron.d
、/etc/cron.hourly
、/etc/cron.daily
、/etc/cron.weekly
、/etc/cron.monthly
ディレクトリやファイルに/etc/crontab
と/etc/anacrontab
。
echo
)を試したところ、「crontab:使用方法のエラー:置換するファイル名を指定する必要があります」が表示されました。Cronのマニュアルページでは、構文はcrontab [ -u user ] file
、つまり必須のファイル名で示されています。代わりにパイプされたデータを受け入れるためのトリックはありますか?
stdin
。正解します。
あなたの質問に対するさらに簡単な答えは次のようになります:
echo "0 1 * * * /root/test.sh" | tee -a /var/spool/cron/root
以下のように、リモートサーバーでcronjobsを設定できます。
#!/bin/bash
servers="srv1 srv2 srv3 srv4 srv5"
for i in $servers
do
echo "0 1 * * * /root/test.sh" | ssh $i " tee -a /var/spool/cron/root"
done
Linuxでは、crontab
ファイルのデフォルトの場所は/var/spool/cron/
です。ここではcrontab
、すべてのユーザーのファイルを見つけることができます。cronjobエントリをそれぞれのユーザーのファイルに追加するだけです。上記の例では、rootユーザーのcrontabファイルに、/root/test.sh
毎日午前1時に実行するcronjobが追加されています。
/var/spool/cron/crontabs/root
Ubuntuにあります。
Crontabファイルは単なるテキストファイルであるため、他のテキストファイルと同様に扱うことができます。このcrontab
コマンドの目的は、crontabファイルの編集をより安全にすることです。このコマンドで編集すると、ファイルのエラーがチェックされ、エラーがない場合にのみ保存されます。
crontab [path to file]
ファイルに保存されているcrontabを指定するために使用できます。と同様にcrontab -e
、エラーのないファイルのみがインストールされます。
したがって、スクリプトはcronタブファイルを直接書き込むか、一時ファイルに書き込んでcrontab [path to temp file]
コマンドで読み込むことができます。直接書き込むと、一時ファイルに書き込む必要がなくなりますが、安全性チェックも回避されます。
crontab [path to file]
..であることに注意してください。これは、コードをより読みやすくするため、私にとって間違いなく最良のオプションでした。crontabを使用して区画を追跡し、デスクトップの壁紙をステータスに変更します。小包を期待していないときは、毎時間チェックする必要はありません。そのため、スクリプトでcronの頻度を自動編集する必要がありました。
(コメントするのに十分な評判がないので、私は回答として追加しています:彼の回答の横にコメントとして追加してください)
Joe Casadonteのワンライナーは完璧ですが、set -e
で実行する場合、つまり、スクリプトがエラーで失敗するように設定されている場合と、cronジョブがまだない場合は例外です。その場合、ワンライナーはcronjobを作成しませんが、スクリプトを停止しません。サイレント障害は非常に誤解を招く可能性があります。
その理由はcrontab -l
、1
戻りコードで戻り、後続のコマンド(the echo
)が実行されないためです...したがって、cronjobは作成されません。ただし、これらは(括弧があるため)サブプロセスとして実行されるため、スクリプトを停止しません。
(興味深いことに、同じコマンドをもう一度実行すると、機能します。一度実行するcrontab -
と、crontab -l
何も出力されませんが、エラーは返されません(no crontab for <user>
メッセージが表示されなくなります)。その後、次のコマンドecho
が実行されますcrontabが作成されます)
いずれの場合も、で実行するset -e
場合、行は次のようにする必要があります。
(crontab -l 2>/dev/null || true; echo "*/5 * * * * /path/to/job -with args") | crontab -
これらの提案に対する修正としてcrontab -l | crontab -
:これはすべてのシステムで機能するわけではありません。たとえば、古いバージョンのSUSEを実行している数十のサーバーのルートcrontabにジョブを追加する必要がありました(理由は尋ねないでください)。旧SUSEsは、出力にコメント行先頭に追加crontab -l
すること、crontab -l | crontab -
非冪等を(Debianはデフォルトの動作を変更するためにいるVixie Cronのそのバージョンをcrontabのmanページでは、この問題を認識し、パッチを適用しましたcrontab -l
)。
crontab -l
コメントを追加するシステムでcrontabをプログラムで編集するには、次のことを試してください。
EDITOR=cat crontab -e > old_crontab; cat old_crontab new_job | crontab -
EDITOR=cat
cat
(通常のデフォルトviではなく)エディターとして使用するようにcrontabに指示します。これにより、ファイルは変更されませんが、代わりにstdoutにコピーされます。これはcrontab -
、crontab -e
出力とは異なる形式の入力を想定している場合でも失敗する可能性があります。ファイナルcrontab -
をに置き換えようとしないでくださいcrontab -e
-機能しません。
まあ/etc/crontab
単にASCIIファイルなので、最も簡単なのは
echo "*/15 * * * * root date" >> /etc/crontab
これにより、15分ごとにメールで通知されるジョブが追加されます。好みに合わせて調整しgrep
、スクリプトをべき等にするために行が既に追加されているかどうかを介してテストします。
Ubuntuなどでは、ファイルのドロップ/etc/cron.*
やテストが簡単にできます/etc/crontab
。さらに、などの(システム)設定ファイルをいじらないでください。
crond
は監視が可能ですが、OPのプラットフォームでは確実に監視されます。
私はpythonでcrontabデプロイツールを作成しました:https : //github.com/monklof/deploycron
pip install deploycron
crontabのインストールは非常に簡単です。これにより、crontabがシステムの既存のcrontabにマージされます。
from deploycron import deploycron
deploycron(content="* * * * * echo hello > /tmp/hello")
これは、cronジョブを段階的に追加するアプローチです。
ssh USER_NAME@$PRODUCT_IP nohup "echo '*/2 * * * * ping -c2 PRODUCT_NAME.com >> /var/www/html/test.html' | crontab -u USER_NAME -"