Perché questo command non funziona come un cronjob, mentre funziona perfettamente quando viene digitato in una shell?

Se esegui questo command dalla shell, funziona come previsto:

cd ~ && mysqldump --databases --skip-dump-date --host=localhost --user=admin --password=xxxxx --lock-all-tables --result-file=xxxxx_dump_tmp.sql mydb && gzip xxxxx_dump_tmp.sql && mv xxxxx_dump_tmp.sql.gz xxxxx_dump_`date +"%Y-%m-%d__%H.%M.%S"`.sql.gz 

Tuttavia, se imposta un cronjob con lo stesso command (copia-incollato), non riesce con i seguenti errori (ricevi la notifica via e-mail):

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

Cosa c'è di sbagliato?

  • Come eseguire un lavoro quotidiano cron?
  • Come eseguire un lavoro cron solo una volta?
  • Posso ripristinare le voci crontab eliminate accidentalmente?
  • Perché il crontab non è in esecuzione each minuto
  • Cron lavoro per aprire una pagina web?
  • Le voci di registro dispari e l'utilizzo insignificante della width di banda
  • cron con lo stesso tempo di esecuzione
  • Come posso submit un messaggio di posta elettronica che viene fatto cronjob?
  • 2 Solutions collect form web for “Perché questo command non funziona come un cronjob, mentre funziona perfettamente quando viene digitato in una shell?”

    Cosa c'è di sbagliato?

    Secondo l' man 5 crontab :

    «…

    Il field "sesto" (il resto della row) specifica il command da eseguire. L'intera porzione di command della row, fino a un carattere newline o%, verrà eseguita da / bin / sh o dalla shell specificata nella variabile SHELL del file cronfile. Percent-segni (%) nel command, a less che non venga eliminato con backslash (), verranno modificati in caratteri newline e tutti i dati dopo il primo% verranno inviati al command come input standard.

    … », lo hai semplicemente scritto sbagliato. Quindi, per crontab va scritto come date +"\%Y-\%m-\%d__\%H.\%M.\%S"

    1. Non mettere un command complesso come questo direttamente nel file crontab.
      Metterlo in uno script e call lo script da cron.

      Per impostazione predefinita, i lavori cron vengono eseguiti da sh (a less che non sia configurato altrimenti). Quando si passa attraverso uno script è ansible impostare la shell appropriata da utilizzare mettendo un #!/bin/bash o qualcosa lungo quelle righe nella prima row dello script.

    2. cd ~ è pericoloso come diavolo. Dipende completamente da sotto quale userid la crontab è in esecuzione. Non necessariamente il tuo userid!
      Quindi usare cd ~userid .

    3. Se cron viene eseguito come utente diverso, l'utente può accedere al tuo home-dir? E questo utente ha lo stesso ambiente del tuo account? Vedi anche 4.

    4. cron-jobs inizia senza caricare l'ambiente normale. Quindi un sacco di ambiente normale (come $PATH ) non esistono o solo contengono informazioni limitate. Ciò può causare i programmi chiamati da cron a non riuscire. Vedere anche l'articolo 1. Potrebbe essere necessario call esplicitamente il tuo .bashrc (o qualsiasi altro script di avvio normalmente utilizzato) per impostare l'ambiente appropriato per qualsiasi altra cosa che hai inserito nel tuo script cron.

    Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.