109 votes

Échapper les guillemets doubles et les signes de pourcentage (%) dans cron

La commande suivante fonctionne à partir de l'invite de commande mais pas à partir de crontab.

grep abc /var/log/messages | grep "`date '+%B %d'`" | mail -s"abc log of `hostname`" s.o+`hostname`@gmail.com

Je dois l'ajouter à la tâche cron quotidienne.

1 votes

Votre exemple est incroyable, le % est entouré de guillemets doubles, simples et inversés. Ne laissant aucun espoir que l'échappement des citations puisse fonctionner.

184voto

imoverclocked Points 1

Vous devez échapper les signes %. Ils ont une signification spéciale dans les crontabs:

man (5) crontab:

Les signes de pourcentage (%) dans la commande, sauf s'ils sont échappés avec un antislash (\), 
seront remplacés par des caractères de nouvelle ligne, et toutes les données après le 
premier % seront envoyées à la commande en tant qu'entrée standard.

10 votes

Eh bien, je suis juste tombé là-dessus. J'utilisais date +%F et je n'allais nulle part

5 votes

Le code suivant a-t-il une utilité? Avec SHELL=/bin/bash, je peux toujours réécrire cat %Hello world comme cat <<<'Hello world'. Je ne vois pas la nécessité d'une syntaxe spéciale.

0 votes

@Witiko Si la "syntaxe spéciale" à laquelle vous faites référence est le backslash pour échapper au pourcentage, alors la propre question de l'OP est un exemple où il est nécessaire : les arguments de commande qui nécessitent un pourcentage, notamment le programme de date, qui serait assez populaire dans une commande cron. Si vous vous demandez en fait pourquoi cron a cette astuce en premier lieu : c'est-à-dire de substituer un saut de ligne à la place du pourcentage, alors je suppose que c'est pour que vous puissiez fournir, sur une seule ligne requise par crontab, une "commande" qui consiste en deux ou plusieurs commandes subsidiaires.

10voto

Randy Orrison Points 480

Cela ne répond pas directement à votre question, mais je vous suggérerais de créer un fichier de script dans /usr/local/bin (ou ~/bin ou tout autre emplacement approprié) et de l'appeler depuis cron. C'est plus facile à tester et à modifier.

8 votes

Dans mon expérience, il est beaucoup plus facile de maintenir 50 lignes dans un crontab que de maintenir 50 petits fichiers. Vous voudrez certainement transformer des scripts plus longs en fichiers de script, mais le faire pour des scripts en une seule ligne peut être excessif.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X