Je veux pouvoir ajouter par programme un nouveau travail cron, quelle est la meilleure façon de le faire?
D'après mes recherches , il semble que je pourrais vider le crontab actuel, puis en ajouter un nouveau, en le renvoyant dans crontab:
(crontab -l ; echo "0 * * * * wget -O - -q http://www.example.com/cron.php") | crontab -
Y a-t-il un meilleur moyen?
Réponses:
Cela a toujours bien fonctionné pour moi.
Vous devriez envisager un script légèrement plus sophistiqué qui peut faire trois choses.
Ajoutez une ligne crontab; assurant qu'il n'existait pas. Ajouter quand il existe déjà est mauvais.
Retirez la ligne crontab. Peut-être seulement un avertissement s'il n'existait pas.
Une combinaison des deux fonctionnalités ci-dessus pour remplacer la ligne crontab.
la source
La meilleure façon si vous exécutez en tant que root, est de déposer un fichier dans /etc/cron.d
si vous utilisez un gestionnaire de paquets pour empaqueter votre logiciel, vous pouvez simplement placer des fichiers dans ce répertoire et ils sont interprétés comme s'il s'agissait de crontabs, mais avec un champ supplémentaire pour le nom d'utilisateur, par exemple:
Nom de fichier:
/etc/cron.d/per_minute
Contenu:
* * * * * root /bin/sh /home/root/script.sh
la source
/etc/cron.d/*
? Il est difficile de savoir si quelque chose fonctionne s'il faut attendre une heure pour vérifier!La solution d'OP a un bogue, elle pourrait permettre d'ajouter deux fois des entrées, utilisez ci-dessous pour corriger.
la source
sort
avantuniq
, par exemple:(crontab -l ; echo "0 * * * * your_command") | sort - | uniq - | crontab -
uniq
. Utilisez l'-u
option sursort
.Pour ajouter quelque chose à cron
Pour supprimer cela de cron
l'espoir aiderait quelqu'un
la source
2>&1 | grep -v "no crontab"
car lorsqu'il n'y a pas de crontab, la ligne de sortiecrontab: no crontab for...
est envoyée à stderr. Il n'y a aucune raison de capturer cette sortie, de l'envoyer à stdout, puis de la filtrer à l'aide de grep. Si votre objectif est d'éviter de voircrontab: no crontab for...
dans votre sortie, utilisez2> /dev/null | sort....
.Si vous prévoyez de le faire pour un scénario unique pour simplement faire quelque chose, jetez un œil à 'at'
la source
Changez simplement l'éditeur en commande tee:
la source
En supposant qu'il existe déjà une entrée dans votre crontab, la commande suivante devrait fonctionner relativement bien. Notez que la
$CMD
variable n'est là que pour la lisibilité. Le tri avant de filtrer les doublons est important, caruniq
ne fonctionne que sur les lignes adjacentes.Si vous avez actuellement un crontab vide, vous recevrez l'erreur suivante à stderr:
Si vous voulez éviter cela, vous pouvez ajouter un peu de complexité et faire quelque chose comme ceci:
la source
La plupart des solutions ici sont pour ajouter des lignes à la crontab. Si vous avez besoin de plus de contrôle, vous voudrez pouvoir contrôler tout le contenu de la crontab.
Vous pouvez utiliser la tuyauterie pour le faire assez élégamment.
Pour réécrire complètement le crontab, faites
Cela devrait être facile à combiner avec d'autres réponses décrites ici comme
Ou, si vous avez le contenu dans un fichier, c'est encore plus simple
la source
Voici une autre méthode unilatérale, qui évite les doublons
Et voici un moyen de faire la réponse de JohnZ et d'éviter le
no crontab for user
message, ou si vous devez fonctionner dans unset -eu
environnement de type et que rien ne peut renvoyer un échec (auquel cas la2>/dev/null
partie est facultative):Ou si vous voulez diviser les choses pour qu'elles soient plus lisibles:
Ou supprimez éventuellement toutes les références à votre_commande (ex: si le planning a changé, vous ne voulez qu'il soit créé une seule fois). Dans ce cas, nous n'avons plus besoin
uniq
(bonus supplémentaire, l'ordre d'insertion est également conservé):la source
man crontab est également utile:
CRONTAB (1)
NOM
SYNOPSIS
la source
En plus de la réponse de JohnZ, voici la syntaxe à planifier en tant que root si vous êtes un sudoer:
la source
la source
Cela vérifierait que votre commande n'existe pas déjà avant de l'ajouter.
À votre santé.
la source
L'
crontab
installation de stdout dans n'a pas installé le nouveau crontab pour moi sur macOS, j'ai donc trouvé cette solution à la place, en utilisant l'tee
éditeur dans un sous-shell:la source
Si vous souhaitez que la tâche s'exécute en tant qu'utilisateur:
Si vous souhaitez que la tâche s'exécute avec des privilèges:
et vérifier la tâche (avec ou sans 'sudo'):
la source
vous pouvez également ajouter vos tâches à /etc/cron.*/
la source
Vous pouvez également éditer le fichier texte de la table cron directement, mais votre solution semble parfaitement acceptable.
la source