J'ai un script de déploiement, il doit ajouter quelque chose à un utilisateur crontab
(déclencher un script qui nettoie les journaux tous les XXX jours), mais cela ne doit être fait que lors du premier déploiement, ou lorsqu'il doit être mis à jour.
(Je peux courir xxx.py deploy env
ou xxx.py update env
)
donc je dois faire ceci:
Check if my cronJob already exist
Put my cronJob if it does not already exist
or
update my cronjob if one of the parameter of the command is different
Je ne vois pas comment ajouter / vérifier / supprimer quelque chose crontab
sans utiliser crontab -e
ou modifier le crontab
fichier (le télécharger, le réécrire, le télécharger à nouveau)
PS: il s'agit d'un cronjob spécifique à l'utilisateur, "webadmin" va le faire et il ne devrait pas utiliser sudo pour le faire.
/etc/cron.d
? Si c'est le cas, mettez votre script là-dedans en utilisant un nom unique à votre application/etc/crontab
fichiers/etc/cron.d/
contiennent un champ supplémentaire pour le nom d'utilisateur, immédiatement après la spécification de planification. par exemple* * * * * username /path/to/script
. Voirman 5 crontab
et rechercherSYSTEM CRON
.Réponses:
ma meilleure idée jusqu'ici
pour vérifier d'abord si le contenu correspond à ce qui devrait y être et ne le mettre à jour que si ce n'est pas le cas:
mais cela devient assez compliqué pour construire un script séparé autour de cette tâche cron.
d'autres idées
vous pouvez envoyer la chaîne via stdin à crontab (attention, cela efface toutes les entrées crontab précédentes):
cela devrait même fonctionner directement via ssh:
si vous souhaitez ajouter au fichier, vous pouvez utiliser ceci:
la source
echo '*...
étendu le*
à une liste de fichiers. 2) les fins de ligne dans la crontab ont été supprimées.echo "*...
et 2) supprimantecho $
le début de la ligne.Pour mémoire, je vais suggérer d'utiliser
/etc/cron.d/
. Seul root peut écrire des fichiers ici mais les entrées peuvent être exécutées comme n'importe quel utilisateur (sans besoin desudo
).Cela peut être appliqué plusieurs fois, en mettant à jour le
webadmin.cron
fichier local si nécessaire avant de le copier.Vous pouvez même supprimer le provisionnement:
Notez que dans de nombreux cas, vous ne pouvez pas fournir le mot de passe root pour les commandes
scp
/ssh
. Au lieu de cela, vous devez avoir configuré des certificats de clé publique / privée. En outre, par implication, le compte local (quel qu'il soit) aura un accès root complet au serveur distant. Il n'est pas clair pour le moment si ce serait une solution pour votre scénario spécifique.la source
/etc/cron.d/
existe exactement dans ce but - pour que les packages / déploiements puissent simplement déposer un fichier crontab ici.Je recommande fortement d'utiliser Ansible * pour cela plutôt que de lancer le vôtre. Ou Puppet ou Chef - mais Ansible est bien adapté pour des scripts de déploiement sans infrastructure comme celui-ci.
En effet, il existe déjà des modules destinés à résoudre des problèmes comme celui-ci, et les outils de gestion de la configuration ont l' idempotence comme objectif de conception de base - c'est la propriété de ne changer que lorsque cela est nécessaire, même si vous le réexécutez accidentellement (ou intentionnellement).
En particulier, le module cron d'Ansible peut modifier les crontabs utilisateur. En prime, si vous souhaitez vous ajuster ultérieurement pour utiliser les crontabs du système, ce sera un ajustement très facile plutôt qu'une réécriture.
* Avertissement: je travaille pour Red Hat et Ansible est un projet sponsorisé par Red Hat.
la source
Si vous souhaitez ajouter un travail cron via le compte cible, exécutez
crontab -e
. Cette commande passe la crontab via un éditeur. Dites-lui d'utiliser une commande d'éditeur qui modifie la crontab comme vous le souhaitez. La commande de l'éditeur est exécutée comme un extrait de shell avec le nom d'un fichier temporaire ajouté.Cette approche est plus fiable que la native
crontab -l | … | crontab -
car celle-ci est vulnérable à une condition de concurrence si la crontab est éditée simultanément: les modifications apportées entre l'appel àcrontab -l
et l'appel àcrontab -
seraient annulées.la source
Il s'agit d'une adaptation de ce que @ phillip-zyan-k-lee-stockmann a proposé, sur la base de son code "Meilleure idée à ce jour".
Mes changements par rapport à son (extrait excellent et utile) sont essentiellement:
Et voici donc mon code pour ce que j'ai appelé
crontab-add-hourly.sh
:Exemple d'utilisation et de sortie:
la source
TL; DR: Cela fonctionne réellement, testé dans Bash 4.4.
Comme indiqué dans les commentaires de @Phillip -Zyan K Lee-Stockmann, cette solution se développe
*
dans tous les fichiers du répertoire actuel. Je n'ai pas réussi à faire fonctionner la suggestion des commentaires. set -f désactive l'extension générique, voir https://stackoverflow.com/a/11456496/915441 .la source