Comment créer une tâche cron avec Bash automatiquement sans que l'éditeur interactif?
Ne crontab avoir un argument pour la création de tâches cron sans l'aide de l'éditeur (crontab -e). Si oui, Quel serait le code créer une tâche cron à partir d'un script Bash?
- Double Possible de Comment puis-je créer par programme une nouvelle tâche cron?
- Malheureusement, la plupart des top-réponses ici sont juste montrer comment modifier le crontab, quoique raisonnablement sûr moyens, mais je pense que c'est dans l'ensemble, l'approche erronée. Meilleur, plus sûr et le plus simple est de déposer un fichier dans {{cron.d}}, et il y a (actuellement) de basse-vote des réponses expliquant comment le faire que si vous regardez plus loin.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez ajouter à la crontab comme suit:
Cron ligne explication
Source nixCraft.
mycron
est un fichier temporaire utilisé pour stocker le contenu de la crontab. Vous pouvez l'appeler comme vous le souhaitez.(crontab -l ; echo "00 09 * * 1-5 echo hello") | crontab -
- plus facile à copier d'Edo answear;
avec&&
comme un garde-fou contre le cas sicrontab -l
échoue. donc, comme:(crontab -l && echo "0 0 0 0 0 some entry") | crontab -
(crontab -l && echo "0 0 0 0 0 some entry" | sort | uniq) | crontab -
&&
rend impossible pour le script pour ajouter de la première entrée dans la crontab.(crontab -l 2>/dev/null ; echo "0 0 0 0 0 some entry") | crontab -
! (crontab -l | grep -q "SCRIPT_FILENAME") && (crontab -l; echo "20 10 * * * SCRIPT_FILENAME") | crontab -
Vous pourriez être en mesure de le faire à la volée
crontab -l
répertorie les crontab emplois,cat
imprime,echo
imprime la nouvelle commande etcrontab -
ajoute tous les imprimés des trucs dans le fichier crontab. Vous pouvez voir l'effet en faisant une nouvellecrontab -l
.crontab -l
répertorie les crontab emplois,cat
imprime,echo
imprime la nouvelle commande etcrontab -
ajoute tous les imprimés des trucs dans le fichier crontab. Vous pouvez voir l'effet en faisant une nouvellecrontab -l
no crontab for <username>
, mais il fonctionne de toute façon.(crontab -l ; echo "00 09 * * 1-5 echo hello") | crontab -
œuvres.Ce plus court ne nécessite aucun fichier temporaire, il est à l'abri à de multiples reprises, et il vous permet de modifier l'horaire d'une entrée existante.
Dire que vous avez ces:
Pour l'ajouter à la crontab, sans duplication:
Pour la retirer de la crontab quel que soit son horaire actuel:
Notes:
Merci à tous pour votre aide. En regroupant tout ce que j'ai trouvé ici et d'ailleurs j'ai trouvé ceci:
Le Code
Je ne pouvais pas comprendre comment éliminer la nécessité pour les deux variables sans me répéter.
command
est évidemment la commande que j'souhaitez planifier.job
prend$command
et ajoute les données de planification. J'avais besoin de deux variables séparément dans la ligne de code qui fait le travail.Détails
<(*command*)
) pour activer la sortie decrontab -l
dans l'entrée pour lafgrep
commande.fgrep
filtre puis tout les matchs de$command
(-v
option), la casse (-i
option).<(*command*)
) est utilisé pour activer le résultat de retour dans l'entrée pour lacat
commande.cat
de commande reçoit égalementecho "$job"
(auto-explicatifs), encore une fois, grâce à l'utilisation de la redirection truc (<(*command*)
).crontab -l
et le simpleecho "$job"
, combinés, sont les canalisations ('|') àcrontab -
pour enfin être écrit.En un mot:
Cette ligne de code filtre toutes les tâches cron qui correspondent à la commande, écrit ensuite le reste des tâches cron avec la nouvelle, fonctionnant comme un "ajout" ou "mise à jour" de la fonction.
Pour l'utiliser, tout ce que vous avez à faire est de permuter les valeurs de la
command
etjob
variables.fgrep -v
crontab -l | fgrep -i -v "$command" | { cat; echo "$job"; } | crontab -l
MODIFIER (fixe écrasement):
crontab -l
échoue, maiscrontab -
réussit, votre crontab sera un one-liner.Il y a eu beaucoup de bonnes réponses autour de l'utilisation de crontab, mais ne mentionnent pas une méthode plus simple, comme l'utilisation de
cron
.À l'aide de
cron
de profiter du système de fichiers et répertoires situés à/etc/crontab
,/etc/cron.daily,weekly,hourly
ou/etc/cron.d/
:Dans cet exemple ci-dessus, nous avons créé un fichier dans
/etc/cron.d/
, à condition que les variables d'environnement pour la commande à exécuter avec succès, et a fourni à lauser
pour la commande, et lecommand
lui-même. Ce fichier ne doit pas être exécutable et le nom ne doit contenir que alphanumériques et des tirets (plus de détails ci-dessous).Pour donner une approfondie réponse mais, examinons les différences entre
crontab
vscron/crond
:Pour ceux qui veulent exécuter le travail dans le contexte de leur utilisateur sur le système, à l'aide de
crontab
peut tout à fait logique.Pour ceux qui utilisent la gestion de la configuration ou souhaitez gérer des emplois pour les autres utilisateurs, dans ce cas, nous devrions l'utiliser
cron
.Un rapide extrait de la page de manuel vous donne quelques exemples de ce qu'il faut et ne faut pas faire:
La gestion des crons dans ce de la manière la plus facile et la plus évolutive à partir d'un point de vue du système, mais ne sera pas toujours la meilleure solution.
<job>
ne devrait pas inclure une extension de fichier.Les Chances sont que vous êtes en train d'automatiser cela, et vous ne voulez pas un seul emploi a ajouté deux fois.
Dans ce cas, utiliser:
Cela ne fonctionne que si vous utilisez BASH. Je ne suis pas au courant de la bonne DASH (
sh
) de la syntaxe.Mise à jour: Cela ne fonctionne pas si l'utilisateur ne dispose pas d'un crontab encore. D'une façon plus fiable serait:
Alternativement, si votre distribution prend en charge, vous pouvez également utiliser un fichier séparé:
Trouvé ces dans DONC, la question d'une autre.
syntax error near unexpected token `(
Toute pensée?sh: 1: Syntax error: "(" unexpected
à l'aide de sh.<
et(
. Cela signifie que< (
échoue, mais<(
entreprise, sauf s'il y a des astérisques dans votre horaire...cat <(crontab -l |grep -v "${CRON}") <(echo "${CRON}") | crontab -
Pour une belle rapide et sale création/remplacement d'une crontab avec un script BASH, j'ai utilisé cette notation:
Une variante qui modifie uniquement crontab si la chaîne souhaitée ne s'y trouve pas:
Si vous êtes à l'aide de la Vixie Cron, par exemple, sur la plupart des distributions Linux, vous pouvez simplement mettre un fichier dans /etc/cron.d avec la personne de job cron.
Cela ne fonctionne que pour la racine de cours. Si votre système le permet, vous devriez voir plusieurs exemples dans il. (Notez le nom d'utilisateur inclus dans la ligne, dans la même syntaxe que l'ancien /etc/crontab)
C'est une triste misfeature dans cron qu'il n'y a aucun moyen de gérer cela en tant qu'utilisateur normal, et que tant de cron implémentations ont aucun moyen de gérer cela.
Script Bash pour l'ajout de tâche cron sans l'éditeur interactif.
Code ci-dessous permet d'ajouter une tâche cron à l'aide de fichiers linux.
Ici est une fonction bash pour l'ajout d'une commande pour
crontab
sans duplicationajouter le paramètre-w à grep de commande exacte, sans paramètre-w l'ajout de la tâche cron "test" provoquer la suppression de la tâche cron "testing123"
fonction de script à ajouter/supprimer des tâches cron. pas de duplication des entrées :
testé :
Donc, Debian, Ubuntu, et de nombreux autres distributions basées sur Debian...
Il y a une tâche cron concaténation mécanisme qui prend un fichier de config, les faisceaux et les ajoute à votre service cron en cours d'exécution.
Vous pouvez mettre un fichier dans /etc/cron.d/somefilename où somefilename est ce que vous voulez.
Nous allons démonter ce:
sudo - parce que vous avez besoin des privilèges élevés pour changer cron configs dans le répertoire /etc
echo - un véhicule pour créer une sortie sur les mst en sortir. printf, chat... marcherait aussi bien
" - utiliser une apostrophe au début de votre chaîne, vous êtes un professionnel de la
0,15,30,45 * * * * - la norme cron calendrier d'exécution, celui-ci circule toutes les 15 minutes
ntpdate -u time.nist.gov - la commande réelle je veux courir
" - parce que mon premier guillemets besoin d'un copain à proximité de la ligne en cours de sortie
>> - la double redirection ajoute au lieu de remplace*
/etc/cron.d/vmclocksync - vmclocksync est le nom que j'ai choisi, il va dans /etc/cron.d/
* si nous avons utilisé l' > redirection, nous pouvions garantir que nous n'avions qu'une entrée de tâche. Mais, nous serions au risque de se faire sauter à l'écart de toutes autres règles dans un fichier existant. Vous pouvez décider pour vous-même, si possible, avec la destruction > est de droite ou de doublons possibles avec >> sont pour vous. Alternativement, vous pourriez faire quelque chose compliquée ou impliqués pour vérifier si le nom de fichier existe, si il ya quelque chose en elle, et si vous ajoutez à toute sorte de double-- mais, j'ai des trucs à faire et je ne peux pas le faire pour vous maintenant.
Non, il n'y a pas d'option dans le crontab de modifier les fichiers cron.
Vous devez: prendre l'actuel fichier cron (crontab -l > newfile), de le modifier et de mettre le nouveau fichier en place (crontab newfile).
Si vous êtes familier avec perl, vous pouvez utiliser ce module Config::Crontab.
LLP, Andrea
fonction de script pour ajouter des tâches cron. vérifier les entrées en double,utilisable expressions * > "
testé :
source : mon cerveau 😉
Ma solution préférée pour ce serait celui-ci:
Ce sera assurez-vous que vous êtes la manipulation de la vierge nouvelle ligne à la fin correctement. Pour éviter les problèmes avec crontab vous devez habituellement à la fin du fichier crontab une copie vierge de la nouvelle ligne. Et le script ci-dessus permet de s'assurer d'abord supprime les lignes vides avec le "grep ." partie, et puis ajouter une nouvelle ligne vide à la fin avec le "\n" à la fin du script. Cela permettra également d'éviter l'obtention d'une ligne vide au-dessus de votre nouvelle commande si votre fichier crontab se termine par une ligne vide.
Vous pouvez probablement changer l'éditeur par défaut pour ed et l'utilisation d'un heredoc à modifier.
Remarque le premier > dans ce code signifie le retour/touche entrée pour créer une nouvelle ligne.
La un signifie AJOUTER afin de ne pas écraser quelque chose.
La . signifie que vous avez terminé l'édition.
La w signifie ÉCRIRE les modifications.
La q signifie QUIT ou exit ed.
vous pouvez le vérifier
Vous pouvez supprimer une entrée trop.
Qui permet de supprimer l'entrée crontab avec Myscript en elle.
La d moyen de supprimer le motif à l'intérieur de la //.
Pas de vérifier de nouveau
Cette solution fonctionne à l'intérieur d'un script trop moins le > bien sûr 🙂