Comment ajouter une entrée à mon crontab?

13

J'utilise crontab pour la première fois. Vous voulez écrire quelques tâches cron de test très simples et les exécuter.

$crontab * * * * * echo "Hi"

ne produit rien.

crontab */1 * * * * echo "hi"

dit */1: No such file or directory.

En outre, comment puis-je répertorier les tâches cron en cours d'exécution (pas seulement celles que je possède, mais celles démarrées par d'autres utilisateurs comme root également).

Et comment supprimer une tâche cron particulière?

xyz
la source
Pour des instructions sur la façon de modifier et de créer des tâches cron et une explication sur la structure des fichiers, consultez ce guide de syntaxe crontab
KJS

Réponses:

21

Vous ne pouvez pas utiliser crontabcomme ça. Utilisez man crontabpour lire comment appeler correctement cet utilitaire.

Vous voudrez utiliser crontab -epour modifier les entrées cron de l'utilisateur actuel (vous pouvez ajouter / modifier / supprimer des lignes). Utilisez crontab -lpour voir la liste actuelle des tâches configurées.

Quant à voir les crontabs des autres utilisateurs, ce n'est pas possible sans être root sur les installations par défaut. Voir Comment puis-je répertorier tous les travaux cron pour tous les utilisateurs pour quelques façons de tout répertorier (en tant que root)

Remarque: soyez très prudent lorsque vous utilisez des caractères globbing shell sur la ligne de commande ( *et ?surtout). *sera étendu à la liste des fichiers du répertoire courant, ce qui peut avoir des effets inattendus. Si vous voulez passer *comme argument à quelque chose, citez-le ( '*').

Tapis
la source
donc je fais crontab -e et dans l'éditeur je mets l'entrée * / 1 * * * * echo "hi" et quand j'enregistre ce fichier, je vois le message que crontab: installation de nouveau crontab. mais je ne vois pas les messages hi apparaître à l'écran. Qu'est-ce que je manque maintenant? Merci.
xyz
2
La sortie de crontab n'ira jamais sur votre "écran". À partir de la page de manuel POSIX pour crontab: "Si la sortie standard et l'erreur standard ne sont pas redirigées par des commandes exécutées à partir de l'entrée crontab, toute sortie ou erreur générée sera envoyée, via une méthode dépendante de l'implémentation, à l'utilisateur."
Mat
1
La sortie du travail sera envoyée à la boîte aux lettres locale du propriétaire du travail. (Exécution mailde la ligne de commande doit accéder à votre boîte de courrier local, si elle est configurée.) Pour voir le « salut » dans un environnement graphique, vous pouvez définir la tâche: * * * * * export DISPLAY=:0; xmessage 'hi'.
manatwork
@manatwork Vous pouvez également avoir besoin de XAUTHORITY, ce qui peut ne pas être facile .
derobert
7

Il y a deux façons de modifier sa version crontab:

  1. de manière interactive, en utilisant crontab -e, qui ouvrira crontabl'éditeur dans l'éditeur spécifié par $VISUALou $EDITOR, ou

  2. de manière non interactive, en utilisant crontab crontab.txt, qui importera simplement les crontabentrées du fichier crontab.txt, remplaçant la crontab active existante pour l'utilisateur actuel.

Le problème que vous avez est que vous utilisez simplement la crontabcommande de manière incorrecte.


Ce qui suit concerne la manipulation non interactive de crontab:

De manière à supprimer des tâches particulières par programme, vous pouvez faire quelque chose comme

$ crontab -l | grep -v 'PATTERN' >crontab.txt && crontab crontab.txt

PATTERN est une expression régulière qui correspondra aux tâches que vous souhaitez supprimer. Ici, crontab -lvous donnera votre courant crontab.

Ou, si vous avez des entrées dans un fichier appelé crontab-fragment.txt que vous souhaitez supprimer de la crontab active,

$ crontab -l | grep -v -Fx -f crontab-fragment.txt >crontab.txt && crontab crontab.txt

Cela lit la crontab actuelle et filtre (supprime) toute ligne qui se produit également dans le fichier crontab-fragment.txtdans le répertoire en cours (en utilisant une comparaison de chaîne de ligne complète). Le résultat est enregistré crontab.txtpuis chargé à partir de là pour remplacer la crontab actuelle.

Pour ajouter une ou plusieurs tâches , faites quelque chose comme

$ crontab -l | cat - crontab-fragment.txt >crontab.txt && crontab crontab.txt

Cela suppose que le fichier crontab-fragment.txtcontient les entrées que vous souhaitez ajouter. Il lit la crontab actuelle, ajoute les entrées de crontab-fragment.txtà ceci et crée crontab.txt. Le crontab.txtfichier remplace alors la crontab actuelle.

Kusalananda
la source
2

Si vous souhaitez modifier la crontab de manière interactive, exécutez la commande crontab -e, sans aucune autre option. Cela lancera un éditeur sur une copie de la crontab; lorsque vous quittez l'éditeur , la copie modifiée devient la nouvelle crontab. Vous pouvez contrôler quel éditeur est démarré via les variables d'environnement VISUALetEDITOR . Pour répertorier votre crontab, exécutezcrontab -l .

Si vous souhaitez modifier la crontab dans un script, définissez VISUALet EDITORsur le chemin d'accès à un script ou à un extrait de shell qui modifie le fichier fourni sur place. L'éditeur edest une possibilité ici, ou sed -isi votre implémentation de seda cette option. Si vous souhaitez ajouter inconditionnellement une ligne, vous pouvez utiliser echo … >>. Prenez soin de citer; en cas de doute, écrivez un script et passez le nom du script comme EDITOR.

script=$(mktemp)
cat <<'EOF' >"$script"
#!/bin/sh
ed -s "$1" <<'EOS'
g/^ *[^= ][^ =]*  *[^= ][^ =]*  *[^= ][^ =]*  *[^= ][^ =]*  *[^= ][^ =]*  *echo "hi"$/d
$a
* * * * * echo "hi"
.
w
q
EOS
EOF
Gilles 'SO- arrête d'être méchant'
la source
2

C'est un peu tard, mais pour ceux qui cherchent ici. Il existe des moyens plus simples que de manipuler les flux d'entrée / sortie avec VISUALet EDITOR.

Vous pouvez simplement écrire votre planning cron dans un fichier, 1 job par ligne, et utiliser la commande crontab [filename]pour pouvoir y faire catvos jobs dans filenamele cadre de votre script et enfin appeler crontab à la fin si vous le souhaitez.

en fait, c'est l'utilisation la plus courante sous forme d' man crontabindices en la répertoriant d' abord

Lindsay Ryan
la source
2

Si vous souhaitez ajouter des entrées à l' crontabautomatisation par ou à partir de la ligne de commande, vous pouvez le faire (définir les heures que vous souhaitez avoir)

echo "* * * * * /yourpath/yourcommand 2>&1 >> /var/log/somelog.log" >> /var/spool/cron/root (or appropriate username)

Alors:

service crond reload

pour recharger les crontabs.

Chris Sprucefield
la source
Ce n'est pas transférable; Unix ne stocke pas tous les fichiers crontab sous /var/spool/cron. Une meilleure façon serait d'utiliser la crontab(1)commande.
thrig
C'est peut-être vrai, mais c'était pour montrer le principe de la façon dont vous pouvez le faire sur un système, et oui, crontab fait l'affaire si vous voulez ajouter ligne par ligne. Ce n'était pas censé être une réponse absolue, mais une réponse si vous savez où se trouvent vos affaires et que vous devez les ajouter en masse. Prenez-le pour ce qu'il est.
Chris Sprucefield
1

Essayez-le avec cette commande:

crontab -e 

puis ajoutez votre tâche cron:

*/1 * * * * echo "hi"

dans ce fichier.

user158204
la source
0

Je voudrais souligner la façon dont je décris ci-dessous, même si cela a déjà été mentionné dans un autre commentaire. Je l'ai trouvé extrêmement utile lors de l'ajout des entrées dans un fichier, puis dans le fichier crontab. Ce fichier contiendrait les deux entrées ci-dessous et le nom du fichier serait hello-world-crontab.txt.

  • 0 09 * * * echo "Hello world!" >> /home/user/greeting.txt
  • 0 09 * * * python /home/user/greeting.py

Ensuite, j'ai exécuté la commande ci-dessous pour ajouter ces entrées à la crontab.

  • $ crontab hello-world-crontab.txt

L'étape suivante consiste à vérifier que ces entrées ont été ajoutées.

  • $ crontab -l

Une brève explication sur ce que fait chaque entrée:

  • Cette entrée crontab écrit "Bonjour tout le monde!" dans le fichier/home/user/greeting.txt tous les jours à 9h.
    • 0 09 * * * echo "Hello world!" >> /home/user/greeting.txt
  • Cette crontab exécute un fichier python qui s'imprime dans la ligne de commande 'Hello world!' tous les jours à 9h.
    • 0 09 * * * python /home/user/greeting.py
SylvesterAbreuLoreto
la source