サーバーをセットアップするために実行するスクリプトを介して、cronジョブを追加する必要があります。現在Ubuntuを使用しています。 crontab -e
を使用できますが、現在のcrontabを編集するためのエディターが開きます。これをプログラムで行いたいです。
そうすることは可能ですか?
Cronジョブは通常、/var/spool/cron
の下のユーザーごとのファイルに保存されます
最も簡単なことは、おそらくジョブを構成したテキストファイルを作成し、それをcronスプールフォルダーにコピーして、適切なアクセス許可があることを確認することです。
以下は、新しいジョブをファイルに含める/使用する必要のないワンライナーです。
(crontab -l 2>/dev/null; echo "*/5 * * * * /path/to/job -with args") | crontab -
2>/dev/null
は重要です。これは、現在crontabエントリがない場合に* nixが生成するno crontab for username
メッセージを受け取らないようにするためです。
ユーザーcrontab(ルートを含む)の場合、次のようなことができます。
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
ファイルに保存されます。 。
Ubuntuおよび他の多くのディストリビューションでは、有効な crontab エントリを含む単一行を含む/etc/cron.d
ディレクトリにファイルを置くことができます。既存のファイルに行を追加する必要はありません。
毎日実行する必要があるだけの場合は、ファイルを/etc/cron.daily
に入れるだけです。同様に、ファイルを/etc/cron.hourly
、/etc/cron.monthly
、および/etc/cron.weekly
にドロップすることもできます。
Crontabファイルは単なるテキストファイルであるため、他のテキストファイルと同様に扱うことができます。 crontab
コマンドの目的は、crontabファイルの編集をより安全にすることです。このコマンドで編集すると、ファイルのエラーがチェックされ、エラーがない場合のみ保存されます。
crontab [path to file]
を使用して、ファイルに保存されているcrontabを指定できます。 crontab -e
と同様、エラーがない場合にのみファイルをインストールします。
したがって、スクリプトはcronタブファイルを直接書き込むか、一時ファイルに書き込んでcrontab [path to temp file]
コマンドで読み込むことができます。直接書き込むと、一時ファイルを書き込む必要がなくなりますが、安全性チェックも回避されます。
あなたの質問に対するさらに簡単な答えは次のとおりです。
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ファイルにcronジョブが追加され、毎日午前1時に/root/test.sh
が実行されます。
crontab -l | crontab -
を提案しているものに対する修正として:これはすべてのシステムで機能するわけではありません。たとえば、古いバージョンのSUSEを実行している多数のサーバーのルートcrontabにジョブを追加する必要がありました(理由は聞かないでください)。古いSUSEはcrontab -l
の出力にコメント行を追加し、crontab -l | crontab -
を非等電位にします(Debianはcrontabマンページでこの問題を認識し、そのバージョンのVixie Cronにパッチを適用して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
で置き換えようとしないでください-動作しません。
(コメントするのに十分な評判がないので、回答として追加しています:回答の横にコメントとして追加してください)
Joe Casadonteのワンライナー は、set -e
で実行する場合、つまりスクリプトがエラーで失敗するように設定されており、cronジョブがまだない場合を除いて、完璧です。その場合、ワンライナーはcronjobを作成しませんが、スクリプトを停止しません。サイレント障害は非常に誤解を招く可能性があります。
理由は、crontab -l
が1
戻りコードで戻り、後続のコマンド(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 -
Cronファイルを直接編集せずにcronエントリを変更する方法は次のとおりです(これは嫌がらせです)。
crontab -l -u <user> | sed 's/find/replace/g' | crontab -u <user> -
Cronエントリを削除する場合は、次を使用します。
crontab -l -u <user> | sed '/find/d' | crontab -u <user> -
これはガウラヴが求めていたものではないことを理解していますが、すべてのソリューションを1か所にまとめてみませんか?
さて/etc/crontab
は単なるASCIIファイルなので、最も簡単なのは
echo "*/15 * * * * root date" >> /etc/crontab
15分ごとにメールを送信するジョブが追加されます。好みに合わせて調整し、grep
またはその他の方法でテストして、スクリプトがdem等になるように行が追加されているかどうかを確認します。
Ubuntuなどでは、/etc/cron.*
にファイルをドロップすることもできます。これは、実行とテストが簡単です。さらに、/etc/crontab
などの(システム)構成ファイルを台無しにしないでください。
私は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 -"