Comment résoudre tous vos problèmes de crontab (Linux)
Il s'agit d'un wiki communautaire Si vous remarquez une erreur dans cette réponse ou si vous avez des informations supplémentaires, veuillez la modifier.
Tout d'abord, la terminologie de base :
-
cron(8) est le démon qui exécute les commandes programmées.
-
crontab(1) est le programme utilisé pour modifier les fichiers crontab(5) des utilisateurs.
-
crontab(5) est un fichier par utilisateur qui contient les instructions pour cron(8).
Ensuite, éducation sur le cron :
Chaque utilisateur d'un système peut avoir son propre fichier crontab. L'emplacement des fichiers crontab de la racine et de l'utilisateur dépend du système, mais ils sont généralement situés aux endroits suivants /var/spool/cron
.
Il existe un système /etc/crontab
le fichier /etc/cron.d
peut contenir des fragments de crontab qui sont également lus et traités par cron. Certaines distributions de Linux (par exemple, Red Hat) disposent également de /etc/cron.{hourly,daily,weekly,monthly}
qui sont des répertoires, scripts à l'intérieur desquels seront exécutés toutes les heures/jours/semaines/mois, avec le privilège de root.
Le super-utilisateur peut toujours utiliser la commande crontab ; les utilisateurs ordinaires peuvent ou non obtenir un accès. Lorsque vous modifiez le fichier crontab avec la commande crontab -e
et le sauvegarder, crond vérifie sa validité de base mais ne garantit pas que votre fichier crontab soit correctement formé. Il existe un fichier appelé cron.deny
qui spécifiera quels utilisateurs ne peuvent pas utiliser cron. L'adresse cron.deny
L'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 sous tension ou que le démon crond n'est pas en cours d'exécution, et que la date/heure d'exécution d'une commande est passée, crond ne rattrapera pas et n'exécutera pas les requêtes passées.
Les particularités de la 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 dièse ( #
) représente un commentaire, ce qui signifie que tout ce qui se trouve sur cette ligne est ignoré par cron. Les espaces et les lignes vides sont ignorés.
Soyez TRÈS prudent lorsque vous utilisez le pourcentage ( %
) dans votre commande. À moins qu'ils ne soient échappés \%
ils sont convertis en nouvelles lignes et tout ce qui se trouve après le premier élément non échappé est converti en lignes. %
est transmis à votre commande sur stdin.
Il existe deux formats pour les fichiers crontab :
-
Utilisateur crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7)
# | | | | |
# * * * * * command to be executed
-
Dans tout le système /etc/crontab
y /etc/cron.d
fragments
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7)
# | | | | |
# * * * * * user-name command to be executed
Notez que ce dernier requiert un nom d'utilisateur. La commande sera exécutée en tant que l'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, le cas échéant, des noms de jour/mois dans la spécification de l'heure.
- Les champs sont séparés par des espaces ou des tabulations.
- Une virgule (
,
) est utilisé pour spécifier une liste, par exemple 1,4,6,8 qui signifie exécuter à 1,4,6,8.
- Les intervalles sont spécifiés avec un tiret (
-
) et peuvent être combinés avec des listes, par exemple 1-3,9-12 qui signifie entre 1 et 3 puis entre 9 et 12.
- El
/
peuvent être utilisés pour introduire une étape, par exemple 2/5, qui signifie que l'on commence à 2 puis tous les 5 (2,7,12,17,22...). Ils ne s'enroulent pas au-delà de la fin.
- Un astérisque (
*
) dans un champ signifie l'ensemble de la plage pour ce champ (ex. 0-59
pour le champ des minutes).
- Les gammes et les étapes peuvent être combinées, par exemple.
*/2
signifie qu'il faut commencer par le 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 courrier !
Par défaut, cron enverra toute sortie de la commande à l'utilisateur sous lequel il exécute la commande. S'il n'y a pas de sortie, il n'y aura pas de courrier. Si vous voulez que cron envoie le courrier à un autre compte, vous pouvez définir la variable d'environnement MAILTO dans le fichier crontab, par ex.
MAILTO=user@somehost.tld
1 2 * * * /path/to/your/command
Capturez vous-même le résultat
Vous pouvez rediriger stdout et stderr vers un fichier. La syntaxe exacte pour capturer la sortie peut varier en fonction de ce que Shell cron utilise. Voici deux exemples qui enregistrent toute la sortie dans un fichier à l'adresse /tmp/mycommand.log
:
1 2 * * * /path/to/your/command &>/tmp/mycommand.log
1 2 * * * /path/to/your/command >/tmp/mycommand.log 2>&1
Regardez les journaux
Cron enregistre ses actions via syslog, qui (en fonction de votre configuration) va souvent à /var/log/cron
o /var/log/syslog
.
Si nécessaire, vous pouvez filtrer les instructions cron avec, par exemple, les éléments suivants
grep CRON /var/log/syslog
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...
ps -ef | grep cron | grep -v grep
devrait vous donner quelque chose comme
root 1224 1 0 Nov16 ? 00:00:03 cron
または
root 2018 1 0 Nov14 ? 00:00:06 crond
Sinon, redémarrez-le
/sbin/service cron start
または
/sbin/service crond start
Il existe peut-être d'autres méthodes ; utilisez ce que votre distro fournit.
cron exécute votre commande dans un environnement restreint.
Les variables d'environnement disponibles sont probablement très limitées. Typiquement, vous n'aurez que quelques variables définies, telles que $LOGNAME
, $HOME
y $PATH
.
Il convient de noter que PATH
est limité à /bin:/usr/bin
. La grande majorité des problèmes "mon cron script ne fonctionne pas" sont causés par ce chemin restrictif. . Si votre commande se trouve à un autre endroit, vous pouvez résoudre ce problème de plusieurs façons :
-
Indiquez le chemin complet de votre commande.
1 2 * * * /path/to/your/command
-
Fournir un PATH approprié dans le fichier crontab
PATH=/bin:/usr/bin:/path/to/something/else
1 2 * * * command
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
Indépendamment de l'endroit où le programme que vous exécutez réside sur le système de fichiers, le répertoire de travail actuel du programme lorsque cron l'exécute sera le répertoire personnel de l'utilisateur . Si vous accédez à des fichiers dans votre programme, vous devrez en tenir compte si vous utilisez des chemins relatifs, ou (de préférence) utiliser des chemins entièrement qualifiés partout, et épargner à tout le monde beaucoup de confusion.
La dernière commande dans ma crontab ne s'exécute pas
Cron exige généralement que les commandes soient terminées par une nouvelle ligne. Editez 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érifiez le format de la crontab
Vous ne pouvez pas utiliser un crontab formaté utilisateur pour /etc/crontab ou les fragments dans /etc/cron.d et vice versa. Une crontab formatée utilisateur n'inclut pas le nom d'utilisateur en 6ème position d'une ligne, alors qu'une crontab formatée système inclut le nom d'utilisateur et exécute la commande en tant que cet utilisateur.
J'ai mis un fichier dans /etc/cron.{hourly,daily,weekly,monthly} et il ne fonctionne pas.
- Vérifiez que le nom du fichier n'a pas d'extension voir pièces de rechange
- Assurez-vous que le fichier a les droits d'exécution.
- Indiquer au système ce qu'il doit utiliser lors de l'exécution de votre script (ex. mettre
#!/bin/sh
en haut)
Bogues liés à la date Cron
Si votre date a été récemment modifiée par un utilisateur ou une mise à jour du système, un fuseau horaire ou autre, alors crontab commencera à se comporter de manière erratique et à présenter des bogues bizarres, parfois fonctionnant, parfois non. C'est la tentative de crontab d'essayer de "faire ce que vous voulez" lorsque l'heure change sous ses pieds. 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 à l'Internet (pour que la date n'ait pas la possibilité de se réinitialiser sur l'un des serveurs de temps).
Des signes de pourcentage, encore
Pour souligner l'importance des pourcentages, voici un exemple de ce que fait cron avec eux :
# cron entry
* * * * * cat >$HOME/cron.out%foo%bar%baz
créera le fichier ~/cron.out contenant les 3 lignes suivantes
foo
bar
baz
Cela est particulièrement gênant lorsque l'on utilise le date
commande. Assurez-vous d'échapper aux signes de pourcentage
* * * * * /path/to/command --day "$(date "+\%Y\%m\%d")"
Méfiez-vous du Sudo
lorsqu'il est exécuté en tant qu'utilisateur non root,
crontab -e
ouvrira la crontab de l'utilisateur, alors que
sudo crontab -e
ouvrira la crontab de l'utilisateur root. Il n'est pas recommandé d'exécuter des commandes sudo dans une tâche cron, donc si vous essayez d'exécuter une commande sudo dans le cron d'un utilisateur, essayez de déplacer cette commande dans le cron de root et supprimez sudo de la commande.
4 votes
C'est une énorme copie de Raisons pour lesquelles la crontab ne fonctionne pas sur AskUbuntu.
1 votes
Il semble qu'Eric ait besoin d'avoir plus de réputation.
1 votes
Je viens de rejoindre Server Fault SE (donc seulement 101 rep), mais j'aimerais donner un -1 à cette question ! Cette question a-t-elle été posée uniquement pour obtenir des points de fidélité ? @IamtheMostStupidPerson Totalement d'accord avec vous...
0 votes
Ha ha ha :) Bien dit.
0 votes
Chers lecteurs : Si vous cherchez une bonne réponse pour vous aider à dépanner votre
cron
vous devriez peut-être chercher ailleurs. Je suis no en disant que la réponse de l'OP est dépourvu d'intelligence mais elle semble faire défaut à bien des égards. Il est également assez vieux maintenant. Il est censé être largement copié, et il y a maintenant 34 révisions contre lui - ce qui ne veut pas dire qu'il n'a pas été révisé. nécessairement Ce sont de mauvaises choses, mais si vous considérez le fait que l'OP (le bénéficiaire de la représentation) de cette réponse n'a contribué qu'à un grand total de 115 caractères (tout cela dans une période de deux heures) de ces modifications, vous commencez à vous demander...