私のcronjob構文の何が問題になっていますか、バックティック( `)を使用しようとしていますか?


31

自動化したいものは次のとおりです。

00 08 * * * psql -Uuser database < query.sql | mail somone@null.com -s "query for `date +%Y-%m-%dZ%I:%M`"

エラーメッセージは次のとおりです。

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

2
エラーを与えることとは別に、これをシェルスクリプトに入れることを検討してください。crontabが不格好なふりをし、スクリプトファイルにコメントと設定を追加できます。
PeterMmm 2009年

回答:


67

以下からのcrontab(5)

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

%記号の前にバックスラッシュを追加するだけです:

00 08 * * * psql -Uuser database < query.sql | mail somone@null.com -s "query for `date +\%Y-\%m-\%dZ\%I:\%M`"

8

この問題を解決するには、%文字をエスケープしますdate +%Y-%m-%dあるべきdate +\%Y-\%m-\%d

残念ながら、この回答は少し遅れていますが、問題はPATHまたはバックティックではありません。問題は、パーセント文字「%」がcrontabエントリの改行または標準入力を示すために使用される特殊な文字であるということです。

これは、dateコマンドのフォーマット入力と競合します。このようなコマンドには、次のものが含まdate +%Y-%m-%dれます:

date Y- m- d


4

バッククティックにも多くの問題がありました。場合によっては、引用符とバックティックを複数回使用する必要があります。それらを$()に置き換えるだけです。

例:

export NOW=`date`
by
export NOW=$(date)

-ギルソンソアレス


1
+1これは、とにかく最近では好まれている構文です。
ダンキャリー

4
しかし、それはユーザーの質問とは何の関係もありません。
アーロンブラウン

1
もちろん、バックスティックについては、質問をもう一度読んでください。
セルジオ・アブレウ

おかげで、それはバッククォートを実現するために、私のcronsを壊した私はしばらく時間がかかった-私は今、あまりにも私のすべてのスクリプトで$()を使用し始めました
エリックKigathi

-2

バックスティックとは関係ありません。ひどいのは、cronにPATHが表示されず、cronに「PATHとは何か?」cronスクリプトで何度も繰り返します。

PATH=/bin:/usr/bin:/usr/sbin
* * * * * /your/script/here

そして、cron行でコマンドを文字通り渡すのではなく、ファイルにコマンドを書くことに賛成です。持っている方がはるかにエレガントです

* * * * * /your/script/here

より

* * * * * perl -e '$@#$@$%%@' | grep -e '@#$@$#$@' | sed s/asfdf/asdfa/

これらの行は、1つのファイル、chmod + xファイル、および呼び出されるこのファイルの中に入れることができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.