cronタブジョブ内で「日付」を実行するにはどうすればよいですか?


117

ログファイル名に現在の時間が含まれているcronスクリプトのログファイルを作成したい。これは私が使用しようとしたコマンドです:

0 * * * * echo hello >> ~/cron-logs/hourly/test`date "+%d"`.log

残念ながら、それが実行されるとこのメッセージが表示されます。

/bin/sh: -c: line 0: unexpected EOF while looking for matching ``'
/bin/sh: -c: line 1: syntax error: unexpected end of file

dateさまざまな方法でパーツをエスケープしようとしましたが、あまり運がありません。これをcrontabファイルでインラインで実行することは可能ですか、またはこれを行うためにシェルスクリプトを作成する必要がありますか?

回答:


180

簡潔な答え:

%asをエスケープします\%

0 * * * * echo hello >> ~/cron-logs/hourly/test`date "+\%d"`.log

長い答え:

エラーメッセージは、コマンドを実行するシェルに2番目のバックティック文字が表示されないことを示唆しています。

/bin/sh: -c: line 0: unexpected EOF while looking for matching '`'

これは、他の回答の1つを試したときに受け取った2番目のエラーメッセージでも確認できます。

/bin/sh: -c: line 0: unexpected EOF while looking for matching ')'

crontabのmanページには、コマンドは最初のエスケープされていないまで読まれていることを確認%印:

「6番目」フィールド(行の残り)は、実行するコマンドを指定します。行のコマンド部分全体(改行または %文字まで)は、cronファイルの変数で/bin/sh指定されたシェルによって、またはシェルによって実行されますSHELLコマンド内のパーセント記号(%)は、 バックスラッシュ(\)でエスケープしない限り、 改行文字変更され、最初のデータ以降のすべてのデータ%は標準入力としてコマンドに送信されます。


無知で申し訳ありませんが、このエラーメッセージはどこに表示されますか?「grep CRON / var / log / syslog」を実行すると、cronが失敗しましたが、エラーメッセージは表示されません -kagda.ru/i/9a016249a39_20-05-2015-09:22:47_9a01.png
Tebe

2
@Копать_Шо_я_нашелcronはエラーメッセージを含むメールを送信します
Jasen

3
date +\%Y\ \%m\ \%d\ \%H:\%M:\%S-cronlog
DevilCode 16

7

コマンドをシェルファイルに入れてから、cronでシェルファイルを実行することもできます。

jobs.sh

echo hello >> ~/cron-logs/hourly/test`date "+%d"`.log

cron

0 * * * * sh jobs.sh

6

あなたは、(文字列全体の重複を避けるために)変数として日付の書式文字列を作成したい場合しないでください脱出%しないでくださいにそれを置きます$()

たとえば、文字列を宣言しながら、次のように記述します。

DATEVAR=date +%Y%m%d_%H%M%S

次に、次の$($VARIABLE_NAME)ようなcronステートメントを記述します。

* * * * * /bin/echo $($DATEVAR) >> /tmp/crontab.log

cyberx86のおかげで、ServerFaultでの彼女/彼の答えはさらに完成するかもしれません:


1
DATEVAR = "date +%Y%m%d_%H%M%S"
フランク・ファン

3

cronでは、次の簡単な構文を使用できます。

*/15 01-09 * * * sh /script.sh >> /home/username/cron_$(date -d"-0 days" +\%Y\%m\%d).log 2>&1

出力日付形式はcron_20180123.logのように再実行されます
bala4rtraining

(1)受け入れられた回答でまだ言われていないことを言っていますか?(2)あなたの答えは質問よりもはるかに複雑です。たとえば-d、質問で使用されていないオプションを追加しました(説明しませんでした)。この「単純な構文」を呼び出すことをどのように正当化しますか?
G-Man

2

上記の答えはすべて二重引用符を使用しています(すべてが私のセットアップで機能したわけではありません)。これは私のために働いた:

0 5 * * 3 /data/script.sh > /data/script_`date +\%y\%m\%d`.log 2>&1

1
受け入れられた答えでまだ言われていないことを何と言っていますか?引用符を使用するよりも引用符を使用しない方がうまく機能すると言っていますか?(ヒント:それはほとんどありません。)
G-Man

受け入れられた答えは私にとってはうまくいきません。これは。
マヌエルシュミッツバーガー

0

基本的な解決策:

  • 使用し$()実行するためのdateコマンドをし、出力を返します
  • datetimeをUTCにフォーマットし、%文字をエスケープします\
  • 2>&1ストリーミングの両方stdoutstderrそのログファイルに最後に追加します

例:

* * * * * echo "Test crontab log" > /tmp/crontab.log.$(date --utc +\%Y\%m\%d_\%H\%M\%SZ) 2>&1

出力:

ls -lh /tmp | grep log

-rw-rw-r-- 1 ubuntu  ubuntu    17 May  4 05:06 crontab.log.20190504_050601Z
-rw-rw-r-- 1 ubuntu  ubuntu    17 May  4 05:07 crontab.log.20190504_050701Z
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.