web-dev-qa-db-ja.com

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

ログファイル名に現在の時間を含む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ファイルでインラインで実行することは可能ですか、またはこれを実行するためにシェルスクリプトを作成する必要がありますか?

131
cwd

簡潔な答え:

%\%としてエスケープします。

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

長い答え:

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

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

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

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

crontab manpage は、コマンドが最初のエスケープされていない%記号までのみ読み取られることを確認します。

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

199
Adam Zalcman

日付フォーマット文字列を変数として作成する場合(文字列全体の重複を避けるため)、DO NOTescape _%_ andしないでください$()に入れます

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

_DATEVAR=date +%Y%m%d_%H%M%S
_

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

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

cyberx86のおかげで、 her/his answer atServerFaultの方が多いかもしれません完了:

8
Gawi - Kai

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

jobs.sh

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

cron

0 * * * * sh jobs.sh
7
Trevi Awater

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

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

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

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

基本的なソリューション:

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

例:

* * * * * 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
0
Hieu Huynh