Comment puis-je créer un crontab par le biais d'un script
J'ai besoin d'ajouter une tâche cron via un script que j'ai exécuter pour configurer un serveur. Je suis actuellement en utilisant Ubuntu. Je peux utiliser crontab -e
mais qui va ouvrir un éditeur pour éditer le crontab. Je veux le faire par programmation.
Est-il possible de le faire?
- stackoverflow.com/questions/610839/...
- Double Possible de Comment puis-je créer par programme une nouvelle tâche cron?
- Si vous êtes à la recherche pour modifier ou supprimer une entrée crontab, voir ma solution ci-dessous.
Vous devez vous connecter pour publier un commentaire.
Des tâches Cron sont généralement stockées dans un fichier de l'utilisateur en vertu de
/var/spool/cron
La chose la plus simple à faire pour vous est probablement juste de créer un fichier texte avec le travail configuré, puis de le copier dans le cron bobine de dossier et assurez-vous qu'il a les autorisations de droite.
Voici un one-liner qui n'utilise pas/exiger le nouvel emploi dans un fichier:
La
2>/dev/null
est important de sorte que vous n'obtenez pas lano crontab for username
message que certains *nixes produire si il n'existe actuellement aucun crontab entrées.echo -e "$(sudo crontab -u root -l)\n* * * * * echo hello > /home/danny/temp.log 2>&1" | sudo crontab -u root -
j'espère que cela aide quelqu'unPour l'utilisateur crontabs (y compris la racine), vous pouvez faire quelque chose comme:
où le fichier nommé "nom de fichier" contient des éléments à ajouter. Vous pouvez également faire de la manipulation d'un texte à l'aide de
sed
ou un autre outil à la place decat
. Vous devez utiliser lecrontab
de commande au lieu de modifier directement le fichier.Une opération similaire serait:
Si vous êtes à la modification ou de la création du système des crontabs, ceux qui peuvent être manipulés comme vous le feriez ordinaire des fichiers texte. Ils sont stockés dans le
/etc/cron.d
,/etc/cron.hourly
,/etc/cron.daily
,/etc/cron.weekly
,/etc/cron.monthly
les répertoires et les fichiers/etc/crontab
et/etc/anacrontab
.echo
), je me suis "crontab: erreur d'utilisation: nom de fichier doit être spécifié pour les remplacer." Cron homme page montre la syntaxe commecrontab [ -u user ] file
, qui est, avec obligatoirement un nom de fichier. Est-il une astuce pour obtenir à accepter les canalisations de données à la place?stdin
. Je vais corriger ma réponse.Dans Ubuntu et de nombreuses autres distributions, vous pouvez simplement mettre un fichier dans le
/etc/cron.d
répertoire contenant une seule ligne avec un valide crontab entrée. Pas besoin d'ajouter une ligne à un fichier existant.Si vous avez juste besoin de quelque chose pour une exécution quotidienne, il suffit de mettre un fichier dans
/etc/cron.daily
. De même, vous pouvez également déposer des fichiers dans/etc/cron.hourly
,/etc/cron.monthly
, et/etc/cron.weekly
.Même plus simple de répondre à votre question serait:
Vous pouvez configurer les tâches cron sur des serveurs distants comme ci-dessous:
Sous Linux, l'emplacement par défaut de la
crontab
fichier est/var/spool/cron/
. Ici vous pouvez trouver lescrontab
les fichiers de tous les utilisateurs. Vous avez juste besoin d'ajouter votre tâche cron entrée de l'utilisateur du fichier. Dans l'exemple ci-dessus, l'utilisateur root crontab, le fichier est ajouté avec une tâche cron pour exécuter/root/test.sh
tous les jours à 1 heure du matin.Crontab fichiers sont de simples fichiers texte et peuvent être traités comme n'importe quel autre fichier texte. Le but de la
crontab
de commande est de rendre l'édition de fichiers crontab plus sûr. Lors de l'édition par le biais de cette commande, le fichier est vérifié pour les erreurs et ne sont enregistrées que si il n'en existe aucune.crontab [path to file]
peut être utilisé pour spécifier un crontab stockées dans un fichier. Commecrontab -e
, ce sera seulement installer le fichier si il est exempt d'erreur.Par conséquent, un script peut soit écrire directement cron onglet fichiers, ou de les écrire dans un fichier temporaire et de les charger avec le
crontab [path to temp file]
de commande. Écrit directement évite d'avoir à écrire un fichier temporaire, mais il évite aussi le contrôle de sécurité.crontab [path to file]
.. C'était certainement la meilleure option pour moi, car il permet un code plus lisible. Je crontab pour le suivi de colis et de changer mon papier peint de bureau avec le statut. Quand je ne suis pas attendre colis, il n'a pas besoin de vérifier toutes les heures. C'est pourquoi je voulais le script d'auto-éditer le cron de fréquence.(Je n'ai pas assez de réputation pour le commentaire, je suis donc d'ajouter, à titre de réponse: n'hésitez pas à l'ajouter comme commentaire à côté de sa réponse)
Joe Casadonte du one-liner est parfait, sauf si vous exécutez avec
set -e
, c'est à dire si votre script est défini à l'échec en cas d'erreur, et si il n'y a pas cronjobs encore. Dans ce cas, le one-liner ne va PAS créer la tâche cron, mais ne sera PAS arrêter le script. Le silence de l'échec peut être très trompeur.La raison en est que
crontab -l
revient avec un1
code de retour, provoquant la commande subséquente (leecho
) de ne pas être exécutée... donc la tâche cron n'est pas créé. Mais, depuis qu'ils sont exécutés comme un sous-processus (à cause de la parenthèse) ils n'ont pas arrêter le script.(En fait, si vous exécutez à nouveau la commande même, cela fonctionne: une fois que vous avez exécuté
crontab -
une fois,crontab -l
encore sorties de rien, mais il ne retourne pas une erreur de plus (vous n'obtenez pas lano crontab for <user>
message). De sorte que la postérieureecho
est exécuté et la crontab est créé)Dans tous les cas, si vous exécutez avec
set -e
, la ligne doit être:Comme une correction à ceux qui suggèrent
crontab -l | crontab -
: Cela ne fonctionne pas sur tous les systèmes. Par exemple, j'ai dû ajouter une tâche dans la crontab de root sur des dizaines de serveurs exécutant une ancienne version de SUSE (ne me demandez pas pourquoi). Vieux SUSEs ajouter des lignes de commentaires à la sortie decrontab -l
, fairecrontab -l | crontab -
non-idempotent (Debian reconnaît ce problème dans la crontab man et patché sa version de Vixie Cron pour modifier le comportement par défaut decrontab -l
).Pour modifier les crontabs par programme sur les systèmes où
crontab -l
ajoute des commentaires, vous pouvez essayer ce qui suit:EDITOR=cat crontab -e > old_crontab; cat old_crontab new_job | crontab -
EDITOR=cat
dit crontab pour utilisercat
comme un éditeur (pas l'habituel défaut vi), qui ne modifie pas le fichier, mais au lieu de copies sur la sortie standard. Cela pourrait encore échouer sicrontab -
attend d'entrée dans un format différent de ce quecrontab -e
sorties. N'essayez pas de remplacer la finalecrontab -
aveccrontab -e
- il ne fonctionnera pas.Bien
/etc/crontab
juste un fichier ascii donc le plus simple est de simplementqui va ajouter un travail qui se chargera de vous toutes les 15 minutes. Ajuster le goût, et à l'essai par l'intermédiaire
grep
ou par d'autres moyens que la ligne a déjà été ajouté afin de rendre votre script idempotent.Sur Ubuntu et al, vous pouvez également déposer des fichiers dans
/etc/cron.*
qui est plus facile à faire et à tester pour la---de plus, vous ne salissez pas avec (système) des fichiers de configuration tels que/etc/crontab
.crond
t moniteur, et ce n'est certainement sur le cas des OP a déclaré plate-forme.Voici comment modifier cron une entrée sans modifier directement le fichier cron (ce qui est mal vu).
Si vous souhaitez supprimer une entrée cron, utilisez ceci:
Je me rends compte que ce n'est pas ce que gaurav a été demander, mais pourquoi ne pas avoir toutes les solutions en un seul endroit?
J'ai écrit un crontab déployer l'outil en python: https://github.com/monklof/deploycron
Installer votre crontab est très facile, cela permettra de fusionner les crontab dans le système existant de crontab.
C'est une approche incrémentale ajouter la tâche cron: