Melarikan karakter dalam cron

9

Berikut ini berfungsi seperti yang diharapkan dari prompt perintah. Tapi itu tidak berhasil dari 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

Saya mendapatkan kesalahan berikut:

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

Apakah karakter-karakter tertentu perlu melarikan diri dalam cron? Atau itu masalah dengan subkulit di cron?

shantanuo
sumber

Jawaban:

13

Saya akan memperluas apa yang dikatakan SvenW dengan menyatakan bahwa saya akan memasukkan perintah ini ke dalam skrip karena dua alasan:

  1. Itu menghindari masalah dengan melarikan diri karakter di crontab.
  2. Hal ini memungkinkan Anda untuk dengan jelas menunjukkan kepada sesama administrator Anda apa pekerjaan itu tanpa membuang siklus mereka mendekripsi sihir satu baris yang Anda buat. Seperti memanggil naskah /root/bin/dump_mysql_tables_and_email_failure_report.sh. Anda mungkin tidak berada dalam lingkungan dengan administrator lain, tetapi ini akan mengingatkan Anda apa yang Anda pikirkan setahun dari sekarang! :)
Kyle Smith
sumber
2
Kudos for the "apa yang kau pikirkan setahun dari sekarang!".
Tonny
5

Solusi termudah untuk mengatasi masalah cron: Masukkan perintah di skrip shell itu sendiri dan panggil skrip ini dari cron.

Sven
sumber
5

Alasannya tidak berhasil adalah itu crontidak berhasil bash. Membuat subkulit menggunakan tanda kurung adalah bagian dari sintaks bash. Petunjuk untuk ini adalah "kata" pertama dari pesan kesalahan.

Backticks akan berfungsi untuk membuat subkulit kecuali bahwa Anda sudah menggunakan backtick di dalam subkulit Anda sehingga Anda tidak dapat menggunakannya lagi.

Seperti yang sudah dikatakan orang lain, tulis skrip dan panggil itu dari cron.

Ladadadada
sumber