web-dev-qa-db-ja.com

スクリプトを使用してcrontabを作成する方法

サーバーをセットアップするために実行するスクリプトを介して、cronジョブを追加する必要があります。現在Ubuntuを使用しています。 crontab -eを使用できますが、現在のcrontabを編集するためのエディターが開きます。これをプログラムで行いたいです。

そうすることは可能ですか?

127
gaurav

Cronジョブは通常、/var/spool/cronの下のユーザーごとのファイルに保存されます

最も簡単なことは、おそらくジョブを構成したテキストファイルを作成し、それをcronスプールフォルダーにコピーして、適切なアクセス許可があることを確認することです。

12
Jason Stelzer

以下は、新しいジョブをファイルに含める/使用する必要のないワンライナーです。

(crontab -l 2>/dev/null; echo "*/5 * * * * /path/to/job -with args") | crontab -

2>/dev/nullは重要です。これは、現在crontabエントリがない場合に* nixが生成するno crontab for usernameメッセージを受け取らないようにするためです。

307
Joe Casadonte

ユーザー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ファイルに保存されます。 。

53

Ubuntuおよび他の多くのディストリビューションでは、有効な crontab エントリを含む単一行を含む/etc/cron.dディレクトリにファイルを置くことができます。既存のファイルに行を追加する必要はありません。

毎日実行する必要があるだけの場合は、ファイルを/etc/cron.dailyに入れるだけです。同様に、ファイルを/etc/cron.hourly/etc/cron.monthly、および/etc/cron.weeklyにドロップすることもできます。

26
IvanGoneKrazy

Crontabファイルは単なるテキストファイルであるため、他のテキストファイルと同様に扱うことができます。 crontabコマンドの目的は、crontabファイルの編集をより安全にすることです。このコマンドで編集すると、ファイルのエラーがチェックされ、エラーがない場合のみ保存されます。

crontab [path to file]を使用して、ファイルに保存されているcrontabを指定できます。 crontab -eと同様、エラーがない場合にのみファイルをインストールします。

したがって、スクリプトはcronタブファイルを直接書き込むか、一時ファイルに書き込んでcrontab [path to temp file]コマンドで読み込むことができます。直接書き込むと、一時ファイルを書き込む必要がなくなりますが、安全性チェックも回避されます。

16
cledoux

あなたの質問に対するさらに簡単な答えは次のとおりです。

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が実行されます。

15
ganesh pathak

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=catcatをエディターとして(通常のデフォルトのviではなく)使用するようにcrontabに指示します。これはファイルを変更せず、代わりにstdoutにコピーします。 crontab -crontab -eが出力するものとは異なる形式の入力を予期している場合、これはまだ失敗する可能性があります。最後のcrontab -crontab -eで置き換えようとしないでください-動作しません。

6
user2845840

(コメントするのに十分な評判がないので、回答として追加しています:回答の横にコメントとして追加してください)

Joe Casadonteのワンライナー は、set -eで実行する場合、つまりスクリプトがエラーで失敗するように設定されており、cronジョブがまだない場合を除いて、完璧です。その場合、ワンライナーはcronjobを作成しませんが、スクリプトを停止しません。サイレント障害は非常に誤解を招く可能性があります。

理由は、crontab -l1戻りコードで戻り、後続のコマンド(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 -
5
Faria

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か所にまとめてみませんか?

2
Brian Smith

さて/etc/crontabは単なるASCIIファイルなので、最も簡単なのは

 echo "*/15 * * * *   root     date" >> /etc/crontab

15分ごとにメールを送信するジョブが追加されます。好みに合わせて調整し、grepまたはその他の方法でテストして、スクリプトがdem等になるように行が追加されているかどうかを確認します。

Ubuntuなどでは、/etc/cron.*にファイルをドロップすることもできます。これは、実行とテストが簡単です。さらに、/etc/crontabなどの(システム)構成ファイルを台無しにしないでください。

2

私はpythonでcrontab展開ツールを作成しました: https://github.com/monklof/deploycron

pip install deploycron

Crontabのインストールは非常に簡単です。これにより、crontabがシステムの既存のcrontabにマージされます。

from deploycron import deploycron
deploycron(content="* * * * * echo hello > /tmp/hello")
1
monklof

これは、cronジョブを増分的に追加するアプローチです。

  ssh USER_NAME@$PRODUCT_IP Nohup "echo '*/2 * * * * ping -c2 PRODUCT_NAME.com >> /var/www/html/test.html' | crontab -u USER_NAME -"
0