ログファイル名に現在の時間を含む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ファイルでインラインで実行することは可能ですか、またはこれを実行するためにシェルスクリプトを作成する必要がありますか?
%
を\%
としてエスケープします。
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
変数で指定されたシェルによって実行されます。 コマンドのパーセント記号(%
)は、バックスラッシュ(\
)でエスケープされない限り、改行文字、および最初の%
の後のすべてのデータは、標準入力としてコマンドに送信されます。
日付フォーマット文字列を変数として作成する場合(文字列全体の重複を避けるため)、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の方が多いかもしれません完了:
コマンドをシェルファイルに入れ、cronでシェルファイルを実行することもできます。
jobs.sh
echo hello >> ~/cron-logs/hourly/test`date "+%d"`.log
cron
0 * * * * sh jobs.sh
Cronでは、次の単純な構文を使用できます。
*/15 01-09 * * * sh /script.sh >> /home/username/cron_$(date -d"-0 days" +\%Y\%m\%d).log 2>&1
上記の回答はすべて二重引用符を使用しています(私のセットアップではすべてが機能するわけではありません)。これは私のために働きました:
0 5 * * 3 /data/script.sh > /data/script_`date +\%y\%m\%d`.log 2>&1
date
コマンドを実行して出力を返すには、$()
を使用します%
文字を\
でエスケープしますstdout
とstderr
の両方をそのログファイルにストリーミングするために、最後に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