Caratteri di escape in cron


9

Di seguito funziona come previsto dal prompt dei comandi. Ma non funziona da 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

Ottengo il seguente errore:

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

Alcuni personaggi devono essere salvati in cron? O è un problema con subshell in cron?


Risposte:


13

Espanderò ciò che ha detto SvenW affermando che avrei inserito questo comando in uno script per due motivi:

  1. Evita qualsiasi problema con i caratteri di escape in crontab.
  2. Ti consente di indicare chiaramente ai tuoi colleghi amministratori cosa fa il lavoro senza sprecare nessuno dei loro cicli decifrando la magia one-liner che hai creato. Come chiamare la sceneggiatura /root/bin/dump_mysql_tables_and_email_failure_report.sh. Potrebbe non essere in un ambiente con altri amministratori, ma questo servirà per ricordare voi cosa diavolo stavi pensando un anno da oggi! :)

2
Complimenti per "che diamine stavi pensando tra un anno!".
Tonny

5

La soluzione più semplice per i problemi di escape di cron: inserisci il comando nel suo script di shell e chiama questo script da cron.


5

La ragione per cui non funziona è che cronnon lo è bash. La creazione di una subshell usando parentesi fa parte della sintassi bash. Un indizio a questo è nella prima "parola" del messaggio di errore.

I backtick funzionerebbero per creare una subshell tranne per il fatto che si stanno già utilizzando backtick all'interno della subshell in modo da non poterli utilizzare nuovamente.

Come hanno già detto gli altri, scrivi uno script e chiamalo da cron.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.