Mise à jour de CRON avec le script bash

Quelqu’un peut-il voir mon erreur de syntaxe ici? Essayer de modifier / mettre à jour un travail cron, mais le fichier n’est pas mis à jour.

crontab -l | sed 's%*/5 * * * * cd /home/administrator/anm-1.5.0 && ./anm.sh%*/10 * * * * cd /home/administrator/anm-1.5.0 && ./anm.sh%' | crontab - 

* METTRE À JOUR *

Donc, j’ai toujours des problèmes avec ça. En fin de compte, j’essaie de tirer une valeur d’un fichier de configuration $ FREQ (minutes) pour exécuter le travail. Le script va d’abord vérifier si la valeur dans la configuration est différente de la valeur actuellement dans la crontab. Si la valeur est différente, la mise à jour de la crontab sera effectuée avec la nouvelle valeur. Le crontab (à la fois l’installation initiale et les mises à jour) extrait également le répertoire en cours d’exécution et le nom du script des variables. Exemple:

 DIR=`pwd` SCRIPT=`basename $0` CRONTMP=`crontab -l | grep anm.sh` crontab -l | sed 's%'$CTMP'%*/'$FREQ' * * * * cd '$DIR' && ./'$SCRIPT'%' | crontab - 

Quelque chose dans ce sens. Évidemment, il manque certaines choses, mais cela devrait vous donner une idée générale.

Merci pour l’aide!

* METTRE À JOUR *

Ok, les choses avancent, mais j’ai toujours un petit problème. Je pense que j’ai la plupart de la logique élaborée. Voici la partie entière (pertinente) du script afin que vous puissiez avoir une idée exacte de ce que j’essaie d’accomplir.

Rappelez-vous: $ SCRIPT et $ DIR sont définis en dehors de la fonction et sont juste égaux au nom du script (anm.sh par exemple) et au répertoire de travail en cours. Et j’ai pris votre suggestion et mis à jour tout mon code. J’utilise maintenant SCRIPT = $ (nom de base $ 0). Merci

 function CRON { if [ "`crontab -l | grep $SCRIPT`" \> " " ]; then CTMP=$(crontab -l | grep $SCRIPT) if [ "$CTMP" = "*/$FREQ * * * * cd $DIR && ./$SCRIPT" ]; then echo "$GREEN No modifications detected $RESET" else crontab -l | "sed s%$CTMP%*/$FREQ * * * * cd $DIR && ./$SCRIPT%" | crontab - fi else echo "$YELLOW CRON not detected - Installing defaults $RESET" (crontab -l ; echo "*/$FREQ * * * * cd $DIR && ./$SCRIPT") | crontab - fi } 

Essentiellement, lorsque la fonction s’exécute, elle vérifie d’abord si le travail cron est même installé (c’est peut-être la première fois que le script est exécuté). S’il ne détecte rien, il ajoute le travail cron au fichier crontab. Cela fonctionne très bien jusqu’à présent. Ensuite, si la fonction détecte que la tâche cron a été installée, elle la compare à la fréquence (en minutes) définie dans le fichier de configuration. Si elles sont identiques, aucune modification n’a été apscope au fichier de configuration et le script continue. Enfin, si les valeurs sont effectivement différentes, il essaie ensuite de mettre à jour la ligne correspondante dans le fichier crontab afin de refléter les modifications apscopes au fichier de configuration. Cette dernière partie échoue. Actuellement, il suffit de remplacer complètement le fichier crontab par du blanc.

* METTRE À JOUR *

Il semble qu’il y ait un problème majeur avec la ligne suivante. Cela ne tire pas correctement la ligne souhaitée de la crontab et la stocke dans la variable CTMP:

 CTMP=$(crontab -l | grep $SCRIPT) 

quand je fais écho au CTMP, je reçois un tas de résultats inattendus. Apparemment, j’utilise incorrectement grep ici.

Ok, ce problème a été résolu. La variable était stockée correctement, je ne faisais que l’échouer de manière incorrecte.

* MISE À JOUR 24/06/13 5h08 *

Le dernier numéro semble être la ligne sed. Voici le message d’erreur que je recherche actuellement.

 sed s%*/12 * * * * cd /home/administrator/anm-1.5.0 && ./anm.sh%*/10 * * * * cd /home/administrator/anm-1.5.0 && ./anm.sh%: No such file or directory 

On dirait qu’il essaie de remplacer la ligne, mais échoue.

* MISE À JOUR 24/06/13 5h45 *

Le message d’erreur ci-dessus était donc dû à ma propre stupidité. J’inclus sed dans les citations. J’ai depuis supprimé la commande des guillemets, mais le problème persiste. J’ai essayé des guillemets simples, des guillemets doubles, échappant * et. sans chance. Le fichier cron n’est toujours pas mis à jour. Voici le code actuel:

 function CRON { if [ "`crontab -l | grep $SCRIPT`" \> " " ]; then CTMP="$(set -f; crontab -l | grep $SCRIPT)" if [ "$CTMP" = "*/$FREQ * * * * cd $DIR && ./$SCRIPT" ]; then echo "$GREEN No modifications detected $RESET" else crontab -l | sed "s%$CTMP%*/$FREQ * * * * cd $DIR && ./$SCRIPT%" | crontab - fi else echo "$YELLOW CRON not detected - Installing defaults $RESET" (crontab -l ; echo "*/$FREQ * * * * cd $DIR && ./$SCRIPT") | crontab - fi } 

* MISE À JOUR 24/06/13 6h05 *

Peut-être que le problème est que je n’échappe pas à tout. c’est-à-dire que les variables à l’intérieur de l’expression sed une fois développées ont des caractères qui doivent s’échapper? Est-ce que ça pourrait être le problème? Si oui, je ne sais pas exactement comment résoudre ce problème. S’il vous plaît aider.

* RESOLU *

Je devais effectivement échapper aux variables aussi avant de les transmettre à sed. Voici le code:

 CTMPESC=$(sed 's/[\*\.&]/\\&/g' <<<"$CTMP") DIRESC=$(sed 's/[\*\.&]/\\&/g' <<<"$DIR") SCRIPTESC=$(sed 's/[\*\.&]/\\&/g' <<<"$SCRIPT") crontab -l | sed "s%$CTMPESC%\*/$FREQ \* \* \* \* cd $DIRESC \&\& \./$SCRIPTESC%" | crontab - 

Essayez de vous échapper du * et . dans votre portion de substitution.

 crontab -l | sed 's%\*/5 \* \* \* \* cd /home/administrator/anm-1\.5\.0 && \./anm\.sh%*/10 * * * * cd /home/administrator/anm-1.5.0 && ./anm.sh%' | crontab - 

ou, vous pouvez mettre une regex qui correspond à votre travail et simplement changer le calendrier

 crontab -l | sed '/anm\.sh/s,^\*/5,*/10,' | crontab - 

* RESOLU *

Je devais effectivement échapper aux variables aussi avant de les transmettre à sed. Voici le code:

 CTMPESC=$(sed 's/[\*\.&]/\\&/g' <<<"$CTMP") DIRESC=$(sed 's/[\*\.&]/\\&/g' <<<"$DIR") SCRIPTESC=$(sed 's/[\*\.&]/\\&/g' <<<"$SCRIPT") crontab -l | sed "s%$CTMPESC%\*/$FREQ \* \* \* \* cd $DIRESC \&\& \./$SCRIPTESC%" | crontab - 

Je proposerais cette version plus courte:

 crontab -l | sed '/cd /s#\/5#\/10#' | crontab - 

ce qui devrait changer 5 à 10 où la ligne a cd . Ou utilisez anm.sh à la place de cd comme adresse pour être plus précis au cas où il y aurait plus d’une ligne de cd :

 crontab -l | sed '/anm\.sh/s#\/5#\/10#' | crontab -