Échapper à des personnages dans cron


9

Les éléments suivants fonctionnent comme prévu à partir de l'invite de commandes. Mais cela ne fonctionne pas depuis 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

J'obtiens l'erreur suivante:

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

Certains personnages doivent-ils être échappés dans cron? Ou est-ce un problème avec le sous-shell dans cron?


Réponses:


13

Je développerai ce que SvenW a dit en déclarant que je mettrais cette commande dans un script pour deux raisons:

  1. Cela évite tout problème avec les caractères d'échappement dans crontab.
  2. Il vous permet d'indiquer clairement à vos collègues administrateurs ce que fait le travail sans perdre aucun de leurs cycles à déchiffrer la magie à une ligne que vous avez créée. Tels que d'appeler le script /root/bin/dump_mysql_tables_and_email_failure_report.sh. Vous n'êtes peut-être pas dans un environnement avec d'autres administrateurs, mais cela vous rappellera ce que vous pensiez dans un an! :)

2
Bravo pour "ce que vous pensiez dans un an!".
Tonny

5

La solution la plus simple pour les problèmes d'échappement cron: Mettez la commande dans son propre script shell et appelez simplement ce script depuis cron.


5

La raison pour laquelle cela ne fonctionne pas est que cronnon bash. La création d'un sous-shell à l'aide de crochets fait partie de la syntaxe bash. Un indice à cela se trouve dans le premier "mot" du message d'erreur.

Les backticks fonctionneraient pour créer un sous-shell, sauf que vous utilisez déjà des backticks à l'intérieur de votre sous-shell, vous ne pouvez donc pas les réutiliser.

Comme les autres l'ont déjà dit, écrivez un script et appelez-le depuis cron.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.