web-dev-qa-db-fra.com

Installation de crontab à l'aide d'un script Bash

J'ai créé un script pour installer deux scripts sur le crontab.

#!/bin/bash

 Sudo crontab -l > mycron
 #echo new cron into cron file

 echo "*/05 * * * * bash /mnt/md0/capture/delete_old_pcap.sh" >> mycron #schedule the delete script
 echo "*/12 * * * * bash  /mnt/md0/capture/merge_pcap.sh" >> mycron     #schedule the merge script

#install new cron file
 crontab mycron
rm mycron

Le script fonctionne et ajoutez les deux lignes au crontab. Mais si j'exécute à nouveau le script, cela ajoute de nouveau ces lignes, je vais donc avoir quatre lignes disant les mêmes choses. Je souhaite que le script d'installation fonctionne de telle sorte que les lignes insérées sur le crontab ne se répètent pas. Comment puis je faire ça

11
Jishnu U Nair

Je recommanderais d'utiliser /etc/cron.d sur crontab.

Vous pouvez placer des fichiers dans /etc/cron.d qui se comporte comme des entrées de crontab. Bien que le format soit légèrement différent.

Par exemple
[.____] /etc/cron.d/pcap:

*/05 * * * * root bash /mnt/md0/capture/delete_old_pcap.sh
*/12 * * * * root bash  /mnt/md0/capture/merge_pcap.sh

La différence dans le format ajoute l'utilisateur à exécuter le travail comme après la spécification de l'heure.

Maintenant, vous pouvez simplement vérifier si le fichier existe et si vous écrasez cela, cela n'a pas d'importance.

Notez que c'est possible que votre démon cron pourrait ne pas avoir /etc/cron.d. Je ne sais pas quels daemons cron l'ont, mais Vixie Cron est le démon cron standard sur Linux, et c'est.

18
Patrick

Vous pouvez plutôt déclarer une fonction:

add() {
  grep -Fq "$1" mycron || echo "$1" >> mycron
}

et l'invoquer en disant:

add "*/05 * * * * bash /mnt/md0/capture/delete_old_pcap.sh"

Cela annoncerait la ligne que si cela n'existe pas dans le fichier.

3
devnull

de bash j'utilise

    crontab -l | { cat; echo "*/10 * * * * /script/script.sh > /dev/null 2>&1"; } | crontab -

Utilisez également ce script pour ajouter des entrées cron sur des serveurs distants.

    cronok="##";
    cronok+=`ssh $Host 'crontab -l'`;
    pattern="reboot.sh"

    if [[ "$cronok" == *${pattern}* ]]; then
         echo "found cron  at [$Host]"
      else
        echo "Cron at [$Host] not found adding now"
       `ssh $Host 'crontab -l | { cat; echo "*/10 * * * * /root/reboot.sh > /dev/null 2>&1"; } | crontab -'`
       echo "finished cron"
    fi
1
Markus07

Vous pouvez écrire un script et l'ajouter à crontab pour l'arrêter:

####You should calculate tiem you want kill your script.
#######code of calculating........
pid=`ps ax |egrep myscript |awk {'print $1'}`
kill -9 $pid
#OR
kill $pid
0
PersianGulf