C’est une question canonique sur l’utilisation de cron & crontab.
Vous avez été dirigé ici car la communauté est à peu près certaine que la réponse à votre question se trouve ci-dessous. Si votre question ne répond pas ci-dessous, elle vous aidera à recueillir des informations qui aideront la communauté à vous aider. Cette information devrait être modifiée dans votre question initiale.
La réponse à ' Pourquoi ma crontab ne fonctionne-t-elle pas et comment puis-je la résoudre? 'peut être vu ci-dessous. Cela concerne le cron
système avec la crontab en surbrillance.
Réponses:
Comment résoudre tous vos problèmes / problèmes liés à crontab (Linux)
Premièrement, la terminologie de base:
Ensuite, éducation sur cron:
Chaque utilisateur d’un système peut avoir son propre fichier crontab. L'emplacement des fichiers crontab racine et utilisateur dépend du système, mais ils sont généralement situés en dessous
/var/spool/cron
.Il existe un
/etc/crontab
fichier système, le/etc/cron.d
répertoire peut contenir des fragments de crontab qui sont également lus et gérés par cron. Certaines distributions Linux (par exemple, Red Hat) ont également des/etc/cron.{hourly,daily,weekly,monthly}
répertoires, des scripts dans lesquels seront exécutées toutes les heures / tous les jours / toutes les semaines / tous les mois, avec le privilège root.root peut toujours utiliser la commande crontab; les utilisateurs réguliers peuvent ou non recevoir un accès. Lorsque vous éditez le fichier crontab à l'aide de la commande
crontab -e
et que vous l'enregistrez, crond le recherche pour une validité de base, mais ne garantit pas que votre fichier crontab est correctement formé. Il existe un fichier appelécron.deny
qui spécifie quels utilisateurs ne peuvent pas utiliser cron. L'cron.deny
emplacement du fichier dépend du système et peut être supprimé, ce qui permettra à tous les utilisateurs d'utiliser Cron.Si l'ordinateur n'est pas allumé ou si le démon crond n'est pas en cours d'exécution et que la date / heure d'exécution d'une commande est expirée, crond n'acceptera pas et n'exécutera pas les requêtes antérieures.
Détails crontab, comment formuler une commande:
Une commande crontab est représentée par une seule ligne. Vous ne pouvez pas utiliser
\
pour étendre une commande sur plusieurs lignes. Le#
signe hash ( ) représente un commentaire qui signifie que tout ce qui est sur cette ligne est ignoré par cron. Les espaces et les lignes vierges sont ignorés.Soyez très prudent lorsque vous utilisez le
%
signe percent ( ) dans votre commande. Sauf s'ils sont échappés,\%
ils sont convertis en saut de ligne et tout ce qui suit le premier non-échappé%
est transmis à votre commande sur stdin.Il existe deux formats pour les fichiers crontab:
Crontabs utilisateur
Système
/etc/crontab
et/etc/cron.d
fragmentsNotez que ce dernier nécessite un nom d'utilisateur. La commande sera exécutée en tant qu'utilisateur nommé.
Les 5 premiers champs de la ligne représentent le (s) moment (s) où la commande doit être exécutée. Vous pouvez utiliser des chiffres ou des noms de jours / mois, le cas échéant, dans la spécification de l'heure.
,
) est utilisée pour spécifier une liste, par exemple 1,4,6,8 qui signifie exécuter à 1,4,6,8.-
) et peuvent être combinées avec des listes, par exemple 1-3,9-12, ce qui signifie entre 1 et 3, puis entre 9 et 12./
caractère peut être utilisé pour introduire une étape, par exemple 2/5, ce qui signifie à partir de 2, puis toutes les 5 (2,7,12,17,22 ...). Ils ne vont pas au-delà de la fin.*
) dans un champ indique toute la plage de ce champ (par exemple,0-59
le champ des minutes).*/2
signifie commencer au minimum pour le champ concerné, puis tous les 2, par exemple 0 pour les minutes (0,2 ... 58), 1 pour les mois (1,3 ... 11), etc.Débogage des commandes cron
Vérifiez le mail!
Par défaut, cron enverra toute sortie de la commande à l'utilisateur sur lequel elle est exécutée. S'il n'y a pas de sortie, il n'y aura pas de courrier. Si vous voulez que cron envoie des messages à un autre compte, vous pouvez définir la variable d’environnement MAILTO dans le fichier crontab, par exemple:
Capturez vous-même la sortie
Vous pouvez rediriger stdout et stderr vers un fichier. La syntaxe exacte pour capturer la sortie peut varier en fonction du shell utilisé par cron. Voici deux exemples qui enregistrent toutes les sorties dans un fichier dans
/tmp/mycommand.log
:Regarde les bûches
Cron enregistre ses actions via syslog, qui (selon votre configuration) va souvent à
/var/log/cron
ou/var/log/syslog
.Si nécessaire, vous pouvez filtrer les instructions cron avec, par exemple,
Maintenant que nous avons passé en revue les bases de cron, où se trouvent les fichiers et comment les utiliser, examinons quelques problèmes courants.
Vérifiez que cron est en cours d'exécution
Si cron ne fonctionne pas, vos commandes ne seront pas planifiées ...
devrait vous obtenir quelque chose comme
ou
Si ce n'est pas le redémarrer
ou
Il peut y avoir d'autres méthodes; utilisez ce que votre distribution fournit.
cron exécute votre commande dans un environnement restreint.
Les variables d'environnement disponibles seront probablement très limitées. En règle générale, vous obtenez seulement quelques variables définies, telles que
$LOGNAME
,$HOME
et$PATH
.Il est à noter que le
PATH
est limité à/bin:/usr/bin
. La grande majorité des problèmes "mon script cron ne fonctionne pas" sont causés par ce chemin restrictif . Si votre commande est dans un emplacement différent, vous pouvez résoudre ce problème de plusieurs manières:Indiquez le chemin complet de votre commande.
Fournissez un PATH approprié dans le fichier crontab
Si votre commande nécessite d'autres variables d'environnement, vous pouvez également les définir dans le fichier crontab.
cron exécute votre commande avec cwd == $ HOME
Peu importe où le programme que vous exécutez réside sur le système de fichiers, le répertoire de travail actuel du programme lors de son exécution par cron sera le répertoire de base de l'utilisateur . Si vous accédez aux fichiers de votre programme, vous devrez en tenir compte si vous utilisez des chemins relatifs, ou (de préférence), utilisez simplement des chemins pleinement qualifiés partout, ce qui évite à tout le monde beaucoup de confusion.
La dernière commande de ma crontab ne s'exécute pas
Cron nécessite généralement que les commandes soient terminées par une nouvelle ligne. Éditez votre crontab; allez à la fin de la ligne qui contient la dernière commande et insérez une nouvelle ligne (appuyez sur entrée).
Vérifier le format de la crontab
Vous ne pouvez pas utiliser une crontab utilisateur formatée par crontab pour / etc / crontab ou les fragments de /etc/cron.d et vice versa. Une crontab formatée par l'utilisateur n'inclut pas de nom d'utilisateur à la 6ème position d'une ligne, alors qu'une crontab formatée par le système inclut le nom d'utilisateur et exécute la commande en tant qu'utilisateur.
Je mets un fichier dans /etc/cron.{hourly,daily,weekly,monthly} et il ne s'exécute pas
#!/bin/sh
en haut)Bugs liés à la date de Cron
Si votre date est récemment modifiée par un utilisateur ou une mise à jour du système, un fuseau horaire ou autre, crontab commencera à se comporter de manière erratique et affichera des bugs bizarres, parfois fonctionnels, parfois non. C'est la tentative de crontab d'essayer de "faire ce que vous voulez" quand le temps change de dessous. Le champ "minute" deviendra inefficace après le changement d'heure. Dans ce scénario, seuls les astérisques seraient acceptés. Redémarrez cron et réessayez sans vous connecter à Internet (pour que la date ne puisse pas être réinitialisée sur l'un des serveurs de temps).
Encore des signes de pourcentage
Pour souligner le conseil relatif aux signes de pourcentage, voici un exemple de ce que cron en fait:
créera le fichier ~ / cron.out contenant les 3 lignes
Ceci est particulièrement intrusif lorsque vous utilisez la
date
commande. Assurez-vous d'échapper aux signes de pourcentagela source
... /path/to/your/command >/tmp/mycommand.log 2>&1
sudo apt-get install postfix
Debian Linux et ses dérivés (Ubuntu, Mint, etc.) présentent certaines particularités qui peuvent empêcher votre tâche cron de s’exécuter. en particulier, les fichiers dans
/etc/cron.d
,/etc/cron.{hourly,daily,weekly,monthly}
doivent:Le dernier fait régulièrement mal aux utilisateurs peu méfiants; en particulier un script dans l' un de ces dossiers nommés
whatever.sh
,mycron.py
,testfile.pl
, etc. seront pas être exécuté, jamais.D'après mon expérience, ce point particulier a été de loin la raison la plus fréquente pour laquelle un cronjob non exécuté sur Debian et ses dérivés.
Voir
man cron
pour plus de détails, si nécessaire.la source
Si vos tâches cron cessent de fonctionner, vérifiez que votre mot de passe n’est pas expiré. Depuis, tous les travaux cron s’arrêtent.
Il y aura des messages
/var/log/messages
similaires à celui ci-dessous qui montrent des problèmes d'authentification de l'utilisateur:la source
sudo -u root passwd
Horaires peu communs et irréguliers
Cron est tout à fait considéré comme un ordonnanceur très basique et la syntaxe ne permet pas facilement à un administrateur de formuler des plannings légèrement plus rares.
Considérez le travail suivant qui serait généralement expliqué comme "exécuté
command
toutes les 5 minutes" :contre:
qui ne toujours courir
command
toutes les 7 minutes .Rappelez - vous que le /personnage peut être utilisé pour introduire une étape , mais que des mesures ne boucle pas au - delà de la fin d'une série par exemple ,
*/7
qui correspond à toutes les 7 minutes du procès - verbal0-59
c. -à- 0,7,14,21,28,35,42,49, 56 mais entre une heure et la prochaine , il y aura seulement 4 minutes entre les lots , après00:56
une nouvelle série commence à01:00
,01:07
etc. (et les lots ne fonctionnera pas sur01:03
,01:10
,01:17
etc.).Que faire à la place?
Créer plusieurs lots
Plutôt que de créer un seul travail cron, créez plusieurs lots qui, combinés, donnent le planning souhaité.
Par exemple, pour exécuter un lot toutes les 40 minutes (00:00, 00:40, 01:20, 02:00, etc.), créez deux lots, un qui s'exécute deux fois aux heures paires et un autre qui ne fonctionne qu'aux heures impaires:
Exécutez vos lots moins fréquemment
Plutôt que d'exécuter votre lot toutes les 7 minutes, ce qui est un programme difficile à décomposer en plusieurs lots, exécutez-le simplement toutes les 10 minutes.
Commencez vos lots plus souvent (mais empêchez l'exécution simultanée de plusieurs lots)
De nombreuses planifications étranges évoluent car les durées d'exécution des lots augmentent / fluctuent, puis les lots sont planifiés avec une marge de sécurité supplémentaire afin d'éviter que les exécutions ultérieures du même lot ne se chevauchent et ne s'exécutent simultanément.
Au lieu de cela, pensez différemment et créez un cronjob qui échouera normalement lorsqu'une exécution précédente n'est pas encore terminée, mais qui s'exécutera autrement. Voir ce Q & A :
Cela lancera presque immédiatement une nouvelle exécution une fois que la précédente exécution de / usr / local / bin / frequent_cron_job sera terminée.
Commencez vos lots plus souvent (mais quittez-les normalement lorsque les conditions ne sont pas bonnes)
La syntaxe cron étant limitée, vous pouvez décider de placer des conditions et une logique plus complexes dans le travail par lots lui-même (ou dans un script d'encapsulation autour du travail par lots existant). Cela vous permet d'utiliser les fonctionnalités avancées de vos langages de script préférés, de commenter votre code et d'empêcher les constructions difficiles à lire dans l'entrée de la crontab elle-même.
En bash,
seven-minute-job
cela ressemblerait à quelque chose comme:Ce que vous pouvez alors en toute sécurité (tenter) de lancer toutes les minutes:
Un autre, mais le même problème serait de programmer un lot pour exécuter le premier lundi de chaque mois (ou le deuxième mercredi) , etc. programmer simplement le lot à tous les lundis et quitter lorsque la date est ni entre le 1 er ou 7 e et le jour de la semaine n'est pas lundi.
Ce que vous pouvez ensuite (tenter) de lancer en toute sécurité tous les lundis:
Ne pas utiliser cron
Si vos besoins sont complexes, vous pouvez envisager d’utiliser un produit plus avancé conçu pour exécuter des planifications complexes (réparties sur plusieurs serveurs) et prenant en charge les déclencheurs, les dépendances de tâches, la gestion des erreurs, les tentatives et la surveillance des tentatives, etc. " ordonnancement des travaux et / ou" automatisation de la charge de travail ".
la source
Spécifique à PHP
Si vous avez un job cron comme:
Et en cas d'erreurs, attendez-vous à ce qu'ils vous soient envoyés, mais ils ne le font pas - vérifiez ceci.
PHP par défaut n'envoie pas d'erreur à STDOUT. @see https://bugs.php.net/bug.php?id=22839
Pour résoudre ce problème, ajoutez dans le php.ini de cli`s ou dans votre ligne (ou dans votre wrapper bash pour PHP) ceux-ci:
Le 1er réglage vous permettra d'avoir des fatals comme 'Memory Oops' et 2nd - de les rediriger tous vers STDERR. Ce n’est qu’après avoir bien dormi que tout sera envoyé au courrier de votre racine au lieu de simplement vous connecter.
la source
Ajouter ma réponse à partir d'ici pour compléter, et ajouter une autre ressource potentiellement utile:
L'
cron
utilisateur a un différent$PATH
de vous:Un problème fréquent rencontré par les utilisateurs avec les
crontab
entrées est qu’ils oublient qu’il estcron
exécuté de manière différenteenvironment
de celle d’un utilisateur connecté. Par exemple, un utilisateur crée un programme ou un script dans son$HOME
répertoire et entre la commande suivante pour l'exécuter:La commande fonctionne parfaitement depuis sa ligne de commande. L'utilisateur ajoute ensuite cette commande à la sienne
crontab
, mais constate que cela ne fonctionne pas:La raison de l'échec dans ce cas est que l'
./
emplacement de l'cron
utilisateur est différent de celui de l' utilisateur connecté. C'est,environment
c'est différent! Le PATH fait partie de laenvironment
, et il est généralement différent pour l'cron
utilisateur. Le problème est que leenvironment
forcron
n’est pas le même pour toutes les distributions * nix et qu’il existe plusieurs versions decron
Une solution simple à ce problème consiste à donner à l'
cron
utilisateur une spécification de chemin complète dans l'crontab
entrée:Quel est l'
cron
utilisateurenvironment
?Dans certains cas, nous pouvons avoir besoin de connaître la
environment
spécification complète decron
notre système (ou nous pouvons simplement être curieux). Quel est leenvironment
pour l'cron
utilisateur, et en quoi est-il différent du nôtre? En outre, nous pouvons avoir besoin de connaître leenvironment
pour un autrecron
utilisateur -root
par exemple ... qu'est-ce que l'root
utilisateurenvironment
utilisecron
? Une façon d’apprendre cela est de demandercron
à nous dire:~/
) comme suit (ou avec l'éditeur de votre choix):/home/you/envtst.sh.out
. Cette sortie montrera votre environnement actuel en tant que$USER
vous êtes connecté en tant que:crontab
pour édition:crontab
:REPONSE: Le fichier de sortie
/home/you/envtst.sh.out
contiendra une liste desenvironment
"utilisateurs cron root". Une fois que vous savez cela, ajustez votrecrontab
saisie en conséquence.Je ne peux pas spécifier le calendrier dont j'ai besoin dans mon
crontab
entrée:L'entrée de programme pour
crontab
est bien sûr définie dansman crontab
, et vous devriez la lire. Cependant, lireman crontab
et comprendre l'horaire sont deux choses différentes. Et les essais et erreurs sur une spécification de programme peuvent devenir très fastidieux. Heureusement, il existe une ressource qui peut aider: le gourou crontab. . Entrez les spécifications de votre emploi du temps, qui expliquera l’emploi du temps en anglais clair.Enfin, et au risque d’être redondant avec l’une des réponses données ici, ne vous laissez pas prendre au piège en pensant que vous êtes limité à une seule
crontab
entrée car vous avez un travail à programmer. Vous êtes libre d'utiliser autant d'crontab
entrées que nécessaire pour obtenir l'horaire dont vous avez besoin.la source