Comment résoudre tous vos problèmes / problèmes liés à crontab (Linux)
Ceci est un wiki de communauté . Si vous remarquez quelque chose d’erreur avec cette réponse ou si vous avez des informations supplémentaires, veuillez le modifier.
Premièrement, la terminologie de base:
- cron (8) est le démon qui exécute les commandes planifiées.
- crontab (1) est le programme utilisé pour modifier les fichiers utilisateur crontab (5).
- crontab (5) est un fichier par utilisateur contenant des instructions pour cron (8).
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
# 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
Système /etc/crontab
et /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 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.
- Les champs sont séparés par des espaces ou des tabulations.
- Une virgule (
,
) est utilisée pour spécifier une liste, par exemple 1,4,6,8 qui signifie exécuter à 1,4,6,8.
- Les plages sont spécifiées par un tiret (
-
) 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.
- Le
/
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.
- Un astérisque (
*
) dans un champ indique toute la plage de ce champ (par exemple, 0-59
le champ des minutes).
- Les plages et les étapes peuvent être combinées, par exemple,
*/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:
MAILTO=user@somehost.tld
1 2 * * * /path/to/your/command
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
:
1 2 * * * /path/to/your/command &>/tmp/mycommand.log
1 2 * * * /path/to/your/command >/tmp/mycommand.log 2>&1
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,
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 obtenir quelque chose comme
root 1224 1 0 Nov16 ? 00:00:03 cron
ou
root 2018 1 0 Nov14 ? 00:00:06 crond
Si ce n'est pas le redémarrer
/sbin/service cron start
ou
/sbin/service crond start
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.
1 2 * * * /path/to/your/command
Fournissez un PATH approprié dans le fichier crontab
PATH=/usr:/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
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
- Vérifiez que le nom du fichier n’a pas d’extension voir run-parts
- Assurez-vous que le fichier dispose des autorisations d'exécution.
- Indiquez au système ce qu'il faut utiliser pour exécuter votre script (par exemple, mettre
#!/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:
# cron entry
* * * * * cat >$HOME/cron.out%foo%bar%baz
créera le fichier ~ / cron.out contenant les 3 lignes
foo
bar
baz
Ceci est particulièrement intrusif lorsque vous utilisez la date
commande. Assurez-vous d'échapper aux signes de pourcentage
* * * * * /path/to/command --day "$(date "+\%Y\%m\%d")"