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?

292

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 .

414
répondu dogbane 2016-07-09 15:20:04

, 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 .

253
répondu TheBonsai 2018-01-16 11:10:19

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
57
répondu MoonCactus 2017-10-13 07:46:03

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

  1. crédit à duckyflip, j'utilise ce petit truc de redirection ( <(*command*) ) pour transformer la sortie de crontab -l en entrée pour la commande fgrep .
  2. fgrep filtre alors toutes les correspondances de $command ( -v option), insensible à la casse ( -i option).
  3. encore une fois, le petit truc de redirection ( <(*command*) ) est utilisé pour retournez le résultat en entrée pour la commande cat .
  4. la commande cat reçoit aussi echo "$job" (explicite), encore une fois, en utilisant le thingy de redirection ( <(*command*) ).
  5. ainsi la sortie filtrée de crontab -l et le simple echo "$job" , combinés, sont pipés ('|') plus à crontab - pour être finalement écrit.
  6. 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 .

37
répondu Stoutie 2011-11-12 18:24:24

MODIFIER (fixe écrasement):

cat <(crontab -l) <(echo "1 2 3 4 5 scripty.sh") | crontab -
23
répondu duckyflip 2009-05-18 21:49:53

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.

8
répondu Mike Mackintosh 2017-03-13 21:46:13

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")
5
répondu Gerald Schade 2015-11-21 10:50:03

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 .

5
répondu kvz 2018-09-28 11:37:00

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
3
répondu Gibbsoft 2014-05-29 17:02:58

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.

2
répondu chuck 2009-05-22 21:28:56

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"
1
répondu Klas Mellbourn 2017-06-03 20:48:19
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
1
répondu speefak 2017-09-04 12:47:31

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

0
répondu andcoz 2009-05-18 16:53:51

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 ;)

0
répondu 2017-09-03 20:52:53

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.

0
répondu gsus 2018-09-08 12:29:34

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: -)

-4
répondu Jetchisel 2015-01-14 07:26:59