cronでの文字のエスケープ


9

次のコマンドプロンプトから期待どおりに動作します。しかし、それはcronからは機能しません。

mysqldumpslow <(tail -1000 `mysqladmin variables \
    | grep slow_query_log_file | awk '{print $4}'`) \
    | mail -s "slow log from `hostname` sorted by time" shantanu.oak`hostname`@gmail.com \
    > /root/slow_succ.txt 2> /root/slow_err.txt

次のエラーが発生します。

/bin/sh: -c: line 0: syntax error near unexpected token `('

特定の文字をcronでエスケープする必要がありますか?それともcronのサブシェルの問題ですか?


回答:


13

私は何に展開するだろうSvenWが、私は二つの理由からスクリプトには、このコマンドを置くことを示すことにより、言いました:

  1. crontabでの文字のエスケープに関する問題を回避します。
  2. これにより、作成したワンライナーマジックを解読してサイクルを無駄にすることなく、ジョブが何をするかを他の管理者に明確に示すことができます。スクリプトの呼び出しなど/root/bin/dump_mysql_tables_and_email_failure_report.sh。他の管理者のいる環境にはいないかもしれませんが、これは、1年後の何を考えていたのかを思い出させるのに役立ちます。:)

2
「1年後、あなたが何を考えていたのか!」
Tonny、2012年

5

cronエスケープ問題の最も簡単な解決策:コマンドを独自のシェルスクリプトに入れ、cronからこのスクリプトを呼び出すだけです。


5

それが機能しない理由はそうでcronはありませんbash。ブラケットを使用してサブシェルを作成することは、bash構文の一部です。これの手がかりは、エラーメッセージの最初の「単語」にあります。

バックティックはサブシェルを作成するために機能しますが、サブシェル内ですでにバックティックを使用しているため、それらを再度使用することはできません。

他の人がすでに言ったように、スクリプトを書いて、それをcronから呼び出します。

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