J'ai besoin d'ajouter un travail cron à travers un script que j'exécute pour configurer un serveur. J'utilise actuellement Ubuntu. Je peux utiliser crontab -e
mais cela ouvrira un éditeur pour éditer le crontab actuel. Je veux faire cela par programme.
Est-il possible de le faire?
Réponses:
Les tâches Cron sont généralement stockées dans un fichier par utilisateur sous
/var/spool/cron
La chose la plus simple à faire pour vous est probablement de créer simplement un fichier texte avec le travail configuré, puis de le copier dans le dossier de spool cron et de vous assurer qu'il dispose des bonnes autorisations (600).
la source
Voici une ligne unique qui n'utilise pas / n'exige pas que le nouveau travail soit dans un fichier:
Le
2>/dev/null
est important pour que vous n'obteniez pas leno crontab for username
message que certains * nix produisent s'il n'y a actuellement aucune entrée crontab.la source
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 les crontabs utilisateur (y compris root), vous pouvez faire quelque chose comme:
où le fichier nommé "filename" contient des éléments à ajouter. Vous pouvez également manipuler du texte en utilisant
sed
ou un autre outil à la place decat
. Vous devez utiliser lacrontab
commande au lieu de modifier directement le fichier.Une opération similaire serait:
Si vous modifiez ou créez des crontabs système, ceux-ci peuvent être manipulés comme vous le feriez pour des fichiers texte ordinaires. Ils sont stockés dans les
/etc/cron.d
,/etc/cron.hourly
,/etc/cron.daily
,/etc/cron.weekly
,/etc/cron.monthly
répertoires et dans les fichiers/etc/crontab
et/etc/anacrontab
.la source
echo
), j'ai obtenu "crontab: erreur d'utilisation: le nom du fichier doit être spécifié pour le remplacement." La page de manuel Cron affiche la syntaxecrontab [ -u user ] file
, c'est-à-dire avec un nom de fichier obligatoire. Y a-t-il une astuce pour lui faire accepter les données acheminées à la place?stdin
. Je vais corriger ma réponse.Dans Ubuntu et de nombreuses autres distributions, vous pouvez simplement placer un fichier dans le
/etc/cron.d
répertoire contenant une seule ligne avec une entrée crontab valide . Pas besoin d'ajouter une ligne à un fichier existant.Si vous avez juste besoin de quelque chose à exécuter quotidiennement, mettez simplement 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
.la source
Une réponse encore plus simple à votre question serait:
Vous pouvez configurer des cronjobs sur des serveurs distants comme ci-dessous:
Sous Linux, l'emplacement par défaut du
crontab
fichier est/var/spool/cron/
. Ici vous pouvez trouver lescrontab
fichiers de tous les utilisateurs. Il vous suffit d'ajouter votre entrée cronjob au fichier de l'utilisateur respectif. Dans l'exemple ci-dessus, le fichier crontab de l'utilisateur racine est ajouté avec un cronjob à exécuter/root/test.sh
tous les jours à 1 heure du matin.la source
/var/spool/cron/crontabs/root
sur Ubuntu.Les fichiers Crontab sont simplement des fichiers texte et peuvent donc être traités comme n'importe quel autre fichier texte. Le but de la
crontab
commande est de rendre l'édition des fichiers crontab plus sûre. Lorsqu'il est édité via cette commande, le fichier est vérifié pour les erreurs et enregistré uniquement s'il n'y en a pas.crontab [path to file]
peut être utilisé pour spécifier une crontab stockée dans un fichier. Commecrontab -e
, cela installera le fichier uniquement s'il est sans erreur.Par conséquent, un script peut soit écrire directement les fichiers de l'onglet cron, soit les écrire dans un fichier temporaire et les charger avec la
crontab [path to temp file]
commande. L'écriture directe évite d'avoir à écrire un fichier temporaire, mais évite également le contrôle de sécurité.la source
crontab [path to file]
. C'était définitivement la meilleure option pour moi, car elle permet un code plus lisible. J'utilise crontab pour suivre les colis et changer mon fond d'écran avec l'état. Lorsque je n'attends pas de colis, il n'est pas nécessaire de vérifier toutes les heures. C'est pourquoi je voulais que le script édite automatiquement la fréquence cron.(Je n'ai pas assez de réputation pour commenter, donc j'ajoute à comme réponse: n'hésitez pas à l'ajouter comme commentaire à côté de sa réponse)
Le one-liner de Joe Casadonte est parfait, sauf si vous exécutez avec
set -e
, c'est-à-dire si votre script est configuré pour échouer en cas d'erreur, et s'il n'y a pas encore de cronjobs. Dans ce cas, le one-liner ne créera PAS le cronjob, mais n'arrêtera PAS le script. L'échec silencieux peut être très trompeur.La raison en est que
crontab -l
retourne avec un1
code de retour,echo
empêchant l'exécution de la commande suivante (le ) ... ainsi le cronjob n'est pas créé. Mais comme ils sont exécutés en tant que sous-processus (à cause de la parenthèse), ils n'arrêtent pas le script.( Fait intéressant, si vous exécutez la même commande à nouveau, il fonctionnera: une fois que vous avez exécuté
crontab -
une fois,crontab -l
rien encore sorties, mais il ne plus (vous ne recevez pas revenir pas d'erreur leno crontab for <user>
message de plus) Ainsi , la suite.echo
Est exécuté et le crontab est créé)Dans tous les cas, si vous exécutez avec
set -e
, la ligne doit être:la source
Pour corriger ceux qui suggèrent
crontab -l | crontab -
: cela ne fonctionne pas sur tous les systèmes. Par exemple, j'ai dû ajouter un travail à la crontab racine sur des dizaines de serveurs exécutant une ancienne version SUSE (ne demandez pas pourquoi). Les anciens SUSE ajoutent des lignes de commentaires à la sortie decrontab -l
, ce qui rendcrontab -l | crontab -
non idempotent (Debian reconnaît ce problème dans la page de manuel crontab et a patché sa version de Vixie Cron pour changer le comportement par défaut decrontab -l
).Pour modifier les crontabs par programmation 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 de l'utilisercat
comme éditeur (pas le vi par défaut habituel), ce qui ne change pas le fichier, mais le copie à la place dans stdout. Cela peut toujours échouer sicrontab -
attend une entrée dans un format différent de celui descrontab -e
sorties. N'essayez pas de remplacer la finalecrontab -
parcrontab -e
- cela ne fonctionnera pas.la source
Eh bien,
/etc/crontab
juste un fichier ascii donc le plus simple est de simplementqui ajoutera un travail qui vous enverra un e-mail toutes les 15 minutes. Ajustez-les selon vos goûts et testez via
grep
ou d'autres moyens si la ligne a déjà été ajoutée pour rendre votre script idempotent.Sur Ubuntu et al, vous pouvez également déposer des fichiers dans
/etc/cron.*
lesquels il est plus facile de faire et de tester --- plus vous ne jouez pas avec les fichiers de configuration (système) tels que/etc/crontab
.la source
crond
ne contrôle, et il le fait sans aucun doute sur la plate - forme indiquée de l'OP.Voici comment modifier cron une entrée sans éditer 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 demandait gaurav, mais pourquoi ne pas avoir toutes les solutions en un seul endroit?
la source
J'ai écrit un outil de déploiement crontab en python: https://github.com/monklof/deploycron
L'installation de votre crontab est très simple, cela fusionnera la crontab dans la crontab existante du système.
la source
C'est une approche pour ajouter progressivement le travail cron:
la source