Comment créer un travail cron en utilisant Bash automatiquement sans 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 qui créerait une cronjob à partir d'un script Bash?
16 réponses
vous pouvez ajouter à la crontab comme suit:
#write out current crontab
crontab -l > mycron
#echo new cron into cron file
echo "00 09 * * 1-5 echo hello" >> mycron
#install new cron file
crontab mycron
rm mycron
Cron ligne explication
* * * * * "command to be executed"
- - - - -
| | | | |
| | | | ----- Day of week (0 - 7) (Sunday=0 or 7)
| | | ------- Month (1 - 12)
| | --------- Day of month (1 - 31)
| ----------- Hour (0 - 23)
------------- Minute (0 - 59)
Source nixCraft .
, Vous pouvez être en mesure de le faire à la volée
crontab -l | { cat; echo "0 0 0 0 0 some entry"; } | crontab -
crontab -l
liste les jobs actuels de crontab, cat
l'imprime, echo
imprime la nouvelle commande et crontab -
ajoute tous les documents imprimés dans le fichier crontab. Vous pouvez voir l'effet en faisant une nouvelle crontab -l
.
ce plus court ne nécessite pas de fichier temporaire, il est immunisé contre les insertions multiples, et il vous permet de modifier le calendrier d'une entrée existante.
dites que vous avez ceci:
croncmd="/home/me/myfunction myargs > /home/me/myfunction.log 2>&1"
cronjob="0 */15 * * * $croncmd"
pour l'ajouter au crontab, sans duplication:
( crontab -l | grep -v -F "$croncmd" ; echo "$cronjob" ) | crontab -
pour le supprimer du crontab quel que soit son horaire actuel:
( crontab -l | grep -v -F "$croncmd" ) | crontab -
Notes:
- grep -F correspond littéralement à la chaîne, car nous ne voulons pas l'interpréter comme une expression régulière
- nous ignorons également l'horaire et ne cherchons que la commande. De cette façon, l'horaire peut être modifié sans risque d'ajouter une nouvelle ligne au crontab
Merci à tous pour votre aide. En reconstituant ce que j'ai trouvé ici et ailleurs, j'ai trouvé ceci:
Le Code
command="php $INSTALL/indefero/scripts/gitcron.php"
job="0 0 * * 0 $command"
cat <(fgrep -i -v "$command" <(crontab -l)) <(echo "$job") | crontab -
Je ne pouvais pas comprendre comment éliminer la nécessité des deux variables sans me répéter.
command
est évidemment la commande que je veux programmer. job
prend $command
et ajoute les données de planification. J'avais besoin des deux variables séparément dans la ligne de le code qui fait le travail.
détails
- crédit à duckyflip, j'utilise ce petit truc de redirection (
<(*command*)
) pour transformer la sortie decrontab -l
en entrée pour la commandefgrep
. -
fgrep
filtre alors toutes les correspondances de$command
(-v
option), insensible à la casse (-i
option). - encore une fois, le petit truc de redirection (
<(*command*)
) est utilisé pour retournez le résultat en entrée pour la commandecat
. - la commande
cat
reçoit aussiecho "$job"
(explicite), encore une fois, en utilisant le thingy de redirection (<(*command*)
). - ainsi la sortie filtrée de
crontab -l
et le simpleecho "$job"
, combinés, sont pipés ('|') plus àcrontab -
pour être finalement écrit. - Et ils vécurent heureux pour toujours!
en un mot:
cette ligne de code filtre Toutes les tâches cron qui correspondent à la commande, puis écrit les tâches cron restantes avec la nouvelle, agissant effectivement comme une fonction" Ajouter "ou" mettre à jour".
Pour l'utiliser, il suffit d'échanger les valeurs des variables command
et job
.
MODIFIER (fixe écrasement):
cat <(crontab -l) <(echo "1 2 3 4 5 scripty.sh") | crontab -
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
.
utilisant cron
tirerait profit des fichiers et répertoires système situés à /etc/crontab
, /etc/cron.daily,weekly,hourly
ou /etc/cron.d/
:
cat > /etc/cron.d/<job> << EOF
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root HOME=/
01 * * * * <user> <command>
EOF
dans cet exemple ci-dessus, nous avons créé un fichier dans /etc/cron.d/
, fourni les variables d'environnement pour la commande à exécuter avec succès, et fourni le user
pour la commande, et le command
lui-même. Ce fichier ne doit pas être exécutable et le nom ne doit contenir que des caractères alphanumériques et des traits d'Union (plus de détails ci-dessous).
pour donner une réponse complète, regardons les différences entre crontab
vs cron/crond
:
crontab -- maintain tables for driving cron for individual users
pour ceux qui veulent exécuter le travail dans le contexte de leur utilisateur sur le système, en utilisant crontab
peut avoir un sens parfait.
cron -- daemon to execute scheduled commands
pour ceux qui utilisent la gestion de configuration ou qui veulent gérer des tâches pour d'autres utilisateurs, auquel cas nous devrions utiliser cron
.
un bref extrait des pages de manuel vous donne quelques exemples de ce que vous devez ou ne devez pas faire:
/etc /crontab et les fichiers de/etc / cron.d doit être la propriété de root, et ne doit pas être groupable ou autre. Contrairement à la zone spool, les fichiers sous /etc/cron.d ou les fichiers sous /etc/cron.horaire, / etc / cron.daily, / etc / cron.hebdomadaire et /etc/cron.mensuel peut aussi être symlinks, à condition que le symlink et le fichier qu'il pointe appartiennent à root. Les fichiers sous /etc/cron.d n'ont pas besoin d'être exécutable, alors que les fichiers sous /etc/cron.horaire, / etc / cron.daily, / etc / cron.hebdomadaire et /etc/cron.mensuel de faire, comme ils sont exécutés par les parties (voir run-parts(8) pour plus d'informations).
Source: http://manpages.ubuntu.com/manpages/trusty/man8/cron.8.html
Gérer les crons de cette façon est plus facile et plus évolutif du point de vue du système, mais ne sera pas toujours la meilleure solution.
une variante qui n'édite crontab que si la chaîne désirée n'y est pas trouvée:
CMD="/sbin/modprobe fcpci"
JOB="@reboot $CMD"
TMPC="mycron"
grep "$CMD" -q <(crontab -l) || (crontab -l>"$TMPC"; echo "$JOB">>"$TMPC"; crontab "$TMPC")
il y a des Chances que vous automatisiez ceci, et vous ne voulez pas qu'un seul travail soit ajouté deux fois. Dans ce cas, utilisez:
__cron="1 2 3 4 5 /root/bin/backup.sh"
cat <(crontab -l) |grep -v "${__cron}" <(echo "${__cron}")
cela ne fonctionne que si vous utilisez BASH. Je ne suis pas au courant de la syntaxe correcte de DASH ( sh
).
mise à Jour: Cela ne fonctionne pas si l'utilisateur ne dispose pas d'un crontab encore. Une façon plus fiable serait:
(crontab -l ; echo "1 2 3 4 5 /root/bin/backup.sh") | sort - | uniq - | crontab -
alternativement, si votre distro le supporte, vous pourriez utilisez également un fichier séparé:
echo "1 2 3 4 5 /root/bin/backup.sh" |sudo tee /etc/crond.d/backup
a trouvé ceux dans une autre question .
pour une belle création/remplacement rapide et sale d'une crontab à partir d'un script BASH, j'ai utilisé cette notation:
crontab <<EOF
00 09 * * 1-5 echo hello
EOF
si vous utilisez le Cron Vixie, par exemple sur la plupart des distributions Linux, vous pouvez simplement mettre un fichier dans /etc/cron.d avec le cronjob individuel.
cela ne fonctionne que pour root bien sûr. Si votre système le permet, vous devriez voir plusieurs exemples. (Notez le nom d'utilisateur inclus dans la ligne, dans la même syntaxe que l'ancien /etc/crontab)
c'est une triste erreur dans cron qu'il n'y ait aucun moyen de gérer cela en tant qu'Utilisateur régulier, et que tant de cron implémentations ont aucun moyen de gérer cela.
Voici une fonction bash pour ajouter une commande à crontab
sans duplication
function addtocrontab () {
local frequency=
local command=
local job="$frequency $command"
cat <(fgrep -i -v "$command" <(crontab -l)) <(echo "$job") | crontab -
}
addtocrontab "0 0 1 * *" "echo hello"
CRON="1 2 3 4 5 /root/bin/backup.sh"
cat < (crontab -l) |grep -v "${CRON}" < (echo "${CRON}")
ajouter 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 :
cronjob_editor () {
# usage: cronjob_editor '<interval>' '<command>' <add|remove>
if [[ -z "" ]] ;then printf " no interval specified\n" ;fi
if [[ -z "" ]] ;then printf " no command specified\n" ;fi
if [[ -z "" ]] ;then printf " no action specified\n" ;fi
if [[ "" == add ]] ;then
# add cronjob, no duplication:
( crontab -l | grep -v -F -w "" ; echo " " ) | crontab -
elif [[ "" == remove ]] ;then
# remove cronjob:
( crontab -l | grep -v -F -w "" ) | crontab -
fi
}
cronjob_editor "" "" ""
testé:
$ ./cronjob_editor.sh '*/10 * * * *' 'echo "this is a test" > export_file' add
$ crontab -l
$ */10 * * * * echo "this is a test" > export_file
Non, il n'y a pas d'option dans crontab pour modifier les fichiers cron.
vous devez: prendre le fichier cron actuel (crontab - l > newfile), le modifier et mettre le nouveau fichier en place (crontab newfile).
si vous connaissez 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, les expressions utilisables * > "
cronjob_creator () {
# usage: cronjob_creator '<interval>' '<command>'
if [[ -z ]] ;then
printf " no interval specified\n"
elif [[ -z ]] ;then
printf " no command specified\n"
else
CRONIN="/tmp/cti_tmp"
crontab -l | grep -vw " " > "$CRONIN"
echo " " >> $CRONIN
crontab "$CRONIN"
rm $CRONIN
fi
}
testé:
$ ./cronjob_creator.sh '*/10 * * * *' 'echo "this is a test" > export_file'
$ crontab -l
$ */10 * * * * echo "this is a test" > export_file
source : mon cerveau ;)
ma solution préférée serait celle-ci:
(crontab -l | grep . ; echo -e "0 4 * * * myscript\n") | crontab -
cela vous permettra de vous assurer que vous manipulez correctement la nouvelle ligne vide en bas. Pour éviter les problèmes avec crontab, vous devez généralement terminer le fichier crontab avec une nouvelle ligne vide. Et le script ci-dessus s'assure qu'il supprime d'abord toutes les lignes vides avec le "grep ."une partie, et puis ajouter une nouvelle ligne vide à la fin avec le "\n" à la fin du script. Cela empêchera également d'obtenir une ligne vide au-dessus votre nouvelle commande si votre fichier crontab se termine par une ligne vide.
vous pouvez probablement changer l'éditeur par défaut en ed et utiliser un heredoc pour éditer.
EDITOR=ed
export EDITOR
crontab -e << EOF
> a
> * * * * * Myscript
> * * * * * AnotherScript
> * * * * * MoreScript
> .
> w
> q
> EOF
> dans ce code signifie que la touche Retour/entrée est pressée pour créer une nouvelle ligne.
le a signifie ajouter de sorte qu'il ne sera pas écraser quoi que ce soit.
Le . ça veut dire que tu as fini d'éditer.
Le w signifie ÉCRIRE les modifications.
Le q signifie QUIT ou exit ed.
vous pouvez le vérifier
crontab -l
vous pouvez supprimer une entrée aussi.
EDITOR=ed
export EDITOR
crontab -e << EOF
> /Myscript/
> d
> .
> w
> q
> EOF
qui supprimera L'entrée crontab avec Myscript dedans.
le d signifie supprimer le motif à l'intérieur de la / / .
Pas de vérifier de nouveau
crontab -l
cette solution fonctionne à l'intérieur d'un script > bien sûr: -)