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


153

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

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




crontabエントリを変更または削除する場合は、以下の解決策を参照してください。
ブライアンスミス

回答:


11

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

あなたがする最も簡単なことはおそらく、ジョブが設定されたテキストファイルを作成し、それをcronスプールフォルダにコピーして、適切な権限(600)があることを確認することです。


19
/ var / spool / cron内のファイルを直接変更することは好ましくありません。実際、そこでファイルを見ると、通常、最初の行に「このファイルを編集しないでください」などの警告が含まれています。
Jared

12
@Jaredアイデアにかなり同意しますが、「眉をひそめている」と言ってもあまり役に立ちません。むしろ、に編集する必要があるファイルがある場合は、それを伝えるか、手動でファイルを編集するリスクを説明します。私は自動化されたコマンドラインを介していくつかのcronジョブを作成することを計画しています。このファイルを編集することが唯一のオプションであり、重大な副作用がない場合、なぜそれを使用するべきではないのかわかりません。
Balmipour 2017年

47
実際の答えを見つけるには、下にスクロールしてください。
ジョンレッド

1
私の意見では、この答えは
はるかに

2
私はこのアプローチをとり、それを後悔しました。RHELでは、ディレクトリ/ var / spool / cronは全世界で実行可能ではないため、ユーザーはディレクトリを走査してファイルを手動で編集できません。/ var / spool / cron worldを実行可能にすると、フレンドリーなローカルシステム管理者に怒られます。また、cronieパッケージが再インストールまたは更新されると、権限の変更が上書きされる可能性があります。
functionvoid

384

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

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

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


14
これは受け入れられる答えになるはずです。追加する予定のワンライナーがすでにあるかどうかを確認する方法が必要です...
ChrisPrime

7
...ああ待ち時間は、ここで私は、スクリプトでそれを追加する前に、何かが私のユーザーのcrontabにあるかどうかを確認する方法は次のとおりです。stackoverflow.com/a/14451184/3686125
ChrisPrime

1
このスクリプトが繰り返し実行され、既存のcronタスクを変更するコマンドとして意図されている場合は、crontabの既存の行を置き換えると便利です。いくつかのマーカーを使用して、さまざまなcronタスクを制御できます(control-marker-1、control-marker-2など):(crontab -l 2> / dev / null | grep -v control-marker-1; echo '* / 5 * * * * / path / to / job -with args#control-marker-1')| crontabの-
シェフ

7
私は、これは、既存のcrontabエントリを削除していることが分かって、私は、既存のエントリを維持するために、以下の使用しても、私は別のユーザー(root)を使用する必要が:echo -e "$(sudo crontab -u root -l)\n* * * * * echo hello > /home/danny/temp.log 2>&1" | sudo crontab -u root -うまくいけば、このことができます誰か
ダニー・

60

ユーザーcrontab(rootを含む)の場合、次のようなことができます。

crontab -l -u user | cat - filename | crontab -u user -

「filename」という名前のファイルには、追加する項目が含まれています。sedまたはの代わりにまたはを使用してテキストを操作することもできますcatcrontabファイルを直接変更するのではなく、コマンドを使用する必要があります。

同様の操作は次のようになります。

{ 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


有望に見えたが2番目のアプローチ(を使用echo)を試したところ、「crontab:使用方法のエラー:置換するファイル名を指定する必要があります」が表示されました。Cronのマニュアルページでは、構文はcrontab [ -u user ] file、つまり必須のファイル名で示されています。代わりにパイプされたデータを受け入れるためのトリックはありますか?
Mark Berry

1
@MarkBerry:申し訳ありません。パイプでは、入力がからであることを示すためにハイフンを使用する必要がありますstdin。正解します。
追って通知があるまで一時停止。

29

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

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


5
しかし、これを行うにはrootでなければなりません。
キース

17

あなたの質問に対するさらに簡単な答えは次のようになります:

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/rootUbuntuにあります。
Íhor私

17

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

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

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


2
私自身のような初心者の場合、それがcrontab [path to file]..であることに注意してください。これは、コードをより読みやすくするため、私にとって間違いなく最良のオプションでした。crontabを使用して区画を追跡し、デスクトップの壁紙をステータスに変更します。小包を期待していないときは、毎時間チェックする必要はありません。そのため、スクリプトでcronの頻度を自動編集する必要がありました。
Rasmus

1
@Rasmus盗むことができるようになりたい素晴らしいスクリプトのようですね。要点などで共有する可能性はありますか?
cledoux

8

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

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

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

はい、これはさらに完璧です。
Yngve Sneen Lindal

7

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


4

まあ/etc/crontab単にASCIIファイルなので、最も簡単なのは

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

これにより、15分ごとにメールで通知されるジョブが追加されます。好みに合わせて調整しgrep、スクリプトをべき等にするために行が既に追加されているかどうかを介してテストします。

Ubuntuなどでは、ファイルのドロップ/etc/cron.*やテストが簡単にできます/etc/crontab。さらに、などの(システム)設定ファイルをいじらないでください。


1
技術的にはcrondはcrontabへの変更を監視する必要がないと思いますが、実際にはほとんどの実装ではそうなっているので、後でcrontab -eを呼び出して実行することをお勧めします。crontab -eは、メモリが機能する場合はEDITOR変数を優先するため、現時点で/ bin / trueに設定すると、crontabが強制的に再読み取りされます。
Ulrich Schwarz、

1
確かに、最近のLinuxシステムでcrond 監視が可能ですが、OPのプラットフォームでは確実に監視されます。
Dirk Eddelbuettel、2011

rootで、スクリプトをrootとして実行したい場合のみ。これはOPのケースでは望ましくない場合があります。
キース

そうではないので、/ etc / crontabにはルート以外のエントリがたくさんあります。ファイルに追加するには、「単に」sudoが必要です。とにかく、私が述べたように、/ etc / cron。* /もありますが、そこに書き込むにはrootである必要もあります。
Dirk Eddelbuettel、2011

2

これは、(眉をひそめている)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> -

これはgauravが求めていたものではないことを理解していますが、すべてのソリューションを1か所にまとめてみませんか?


1

私はpythonでcrontabデプロイツールを作成しました:https : //github.com/monklof/deploycron

pip install deploycron

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

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

1

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

  ssh USER_NAME@$PRODUCT_IP nohup "echo '*/2 * * * * ping -c2 PRODUCT_NAME.com >> /var/www/html/test.html' | crontab -u USER_NAME -"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.