web-dev-qa-db-ja.com

cronjobコマンドを使用してタイムスタンプをログファイルに追加する

5分ごとに出力メッセージをファイルに記録してgitpullコマンドを実行しようとしています。

しかし、私はこのようなエラーが発生しました、

(root) CMD (cd /var/www/sites/ && git pull Origin master | sed -e "s/^/$(date +\")
(CRON) error (grandchild #1111 failed with exit status 2)

私のcronjobコマンドは次のとおりです。

*/5 * * * * cd /var/www/site/ && git pull Origin master | sed -e "s/^/$(date +\"%d-%m-%y\ %T\"), /" >> /var/log/crond/site.log

どうすれば修正できますか?

2
Erol Guzoğlu

一部のシステムでは、%はcrontabで特別です:私のシステムのcrontab(5)から

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

私は強く日付形式を使用することをお勧めします%Y-%m-%d-それは 標準 であるだけでなく、同じことを語彙的および時系列的にソートします。一部のstrftime実装には、その省略形があります。%F

システムに ts コマンドがあるかどうかを確認します

cd /dir && git pull Origin master 2>&1 | ts "\%F \%T" >> /var/log/crond/site.log

「リアルタイム」のタイムスタンプを取得するには、コマンドのバッファを解除する必要がある場合があります:(非常に醜くなり始めます)

cd /dir && stdbuf -oL sh -c 'git pull Origin master 2>&1' | ts "\%F \%T" >> /var/log/crond/site.log
6
glenn jackman