ログファイル名に現在の時刻を含む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ファイルでこれをインラインで実行できますか?それともこれを行うにはシェルスクリプトを作成する必要がありますか?
答え1
短い答え:
%
次のようにエスケープされました\%
。
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 ')'
これクローンタップマンページエスケープされていない最初のシンボルまでコマンドが読み取り専用であることを確認してください%
。
「6番目」フィールド(行の残りの部分)は、実行するコマンドを指定します。行の完全なコマンド部分(改行文字または文字まで)は、cronfile変数で指定されたシェルによって実行されます
%
。/bin/sh
SHELL
%
パーセント記号( ) コマンドは\
バックスラッシュ()でエスケープしない限り次のように変更されます。 改行文字,最初のデータ以降のすべてのデータは%
標準入力としてコマンドに送信されます。
答え2
日付形式の文字列を変数として使用するには(文字列全体が繰り返されないように)欲しくない脱出%
して欲しくないそれを入れて$()
たとえば、文字列を宣言するときは、次のように記述します。
DATEVAR="date +%Y%m%d_%H%M%S"
$($VARIABLE_NAME)
次に、次のようにcronステートメントを作成します。
* * * * * /bin/echo $($DATEVAR) >> /tmp/crontab.log
ありがとうサイバーx86、彼/彼の答え存在するサーバー障害より完全かもしれません:
答え3
コマンドをシェルファイルに入れてから、cron を使用してシェルファイルを実行することもできます。
職業
echo hello >> ~/cron-logs/hourly/test`date "+%d"`.log
予約されたこと
0 * * * * sh jobs.sh
答え4
基本的な解決策:
- コマンドを
$()
実行して出力を返すために使用されます。date
%
エスケープ文字を使用して日付/時刻形式をUTCとして指定します。\
- そのログファイルをストリーミング
2>&1
するには、最後に追加してください。stdout
stderr
例:
* * * * * 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