Warum funktioniert meine Crontab nicht und wie kann ich Fehler beheben?

225

Dies ist eine kanonische Frage zur Verwendung von cron & crontab.

Sie wurden hierher geleitet, weil die Community ziemlich sicher ist, dass die Antwort auf Ihre Frage unten zu finden ist. Wenn Ihre Frage im Folgenden nicht beantwortet wird, helfen Ihnen die Antworten dabei, Informationen zu sammeln, die der Community helfen, Ihnen zu helfen. Diese Informationen sollten in Ihre ursprüngliche Frage eingearbeitet werden.

Die Antwort für ' Warum funktioniert meine Crontab nicht und wie kann ich Fehler beheben? 'kann unten gesehen werden. Dies adressiert das cronSystem mit der hervorgehobenen Crontab.

Eric Leschinski
quelle
2
Dies ist ein Riesenschwindel von Gründen, warum crontab auf AskUbuntu nicht funktioniert .
Dan Dascalescu
1
@DanDascalescu Scheint, als müsste Eric mehr Wiederholung bekommen
ich bin die dümmste Person
1
Ich bin gerade bei Server Fault SE eingestiegen (also nur 101 Mitarbeiter), würde dieser Frage aber gerne eine -1 geben !! Wurde diese Frage nur gestellt, um Wiederholung zu bekommen? @IamtheMostStupidPerson Stimme dir
voll und ganz zu
Die westliche Ideologie dieser 13-jährigen Padawans ist sowohl lehrbuchartig als auch blendend wie eine Supernova. Um beide Fragen zu beantworten: Ja, ich habe es für den Repräsentanten getan, und ja, Eric muss mehr Ansehen erlangen. Wie viel mehr Repräsentanten brauche ich? Mehr. youtu.be/IaDt9T7BF38?t=262
Eric Leschinski

Antworten:

317

So beheben Sie all Ihre Probleme mit Crontab (Linux)


Dies ist ein Community-Wiki . Wenn Sie Fehler in dieser Antwort bemerken oder zusätzliche Informationen haben, bearbeiten Sie diese bitte.


Erstens grundlegende Terminologie:

  • cron (8) ist der Daemon, der geplante Befehle ausführt.
  • crontab (1) ist das Programm zum Ändern von Benutzer-crontab (5) -Dateien.
  • crontab (5) ist eine Benutzerdatei, die Anweisungen für cron (8) enthält.

Als nächstes Aufklärung über Cron:

Jeder Benutzer auf einem System verfügt möglicherweise über eine eigene crontab-Datei. Der Speicherort der Root- und Benutzer-Crontab-Dateien ist systemabhängig, liegt jedoch in der Regel darunter /var/spool/cron.

Es gibt eine systemweite /etc/crontabDatei, das /etc/cron.dVerzeichnis kann Crontab-Fragmente enthalten, die auch von Cron gelesen und bearbeitet werden. Einige Linux-Distributionen (z. B. Red Hat) haben /etc/cron.{hourly,daily,weekly,monthly}auch Verzeichnisse, Skripte, die jede Stunde / Tag / Woche / Monat mit Root-Rechten ausgeführt werden.

root kann immer den Befehl crontab verwenden. regulären Benutzern kann der Zugriff gewährt werden oder nicht. Wenn Sie die crontab-Datei mit dem Befehl bearbeiten crontab -eund speichern, überprüft crond sie auf ihre grundlegende Gültigkeit, garantiert jedoch nicht, dass Ihre crontab-Datei korrekt erstellt wurde. Es gibt eine Datei mit dem Namen, cron.denydie angibt, welche Benutzer Cron nicht verwenden können. Der cron.denyDateispeicherort ist systemabhängig und kann gelöscht werden, sodass alle Benutzer cron verwenden können.

Wenn der Computer nicht eingeschaltet ist oder der crond-Daemon nicht ausgeführt wird und das Datum und die Uhrzeit für die Ausführung eines Befehls abgelaufen sind, kann crond vergangene Abfragen nicht abrufen und ausführen.

crontab Angaben, wie man einen Befehl formuliert:

Ein crontab-Befehl wird durch eine einzelne Zeile dargestellt. Sie können \einen Befehl nicht über mehrere Zeilen erweitern. Das hash ( #) -Zeichen stellt einen Kommentar dar, was bedeutet, dass alles in dieser Zeile von cron ignoriert wird. Führende Leerzeichen und Leerzeilen werden ignoriert.

Seien Sie SEHR vorsichtig, wenn Sie das Prozentzeichen ( %) in Ihrem Befehl verwenden. Sofern sie nicht \%maskiert werden , werden sie in Zeilenumbrüche umgewandelt und alles, was nach dem ersten nicht maskierten Zeilenumbruch %passiert, wird auf stdin an Ihren Befehl übergeben.

Es gibt zwei Formate für Crontab-Dateien:

  • Benutzer 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
    
  • Systemweit /etc/crontabund /etc/cron.dFragmente

    # 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
    

Beachten Sie, dass letzteres einen Benutzernamen erfordert. Der Befehl wird als benannter Benutzer ausgeführt.

Die ersten 5 Felder der Zeile geben die Zeiten an, zu denen der Befehl ausgeführt werden soll. In der Zeitangabe können Sie Zahlen oder ggf. Tag- / Monatsnamen verwenden.

  • Die Felder sind durch Leerzeichen oder Tabulatoren getrennt.
  • Ein Komma ( ,) wird verwendet, um eine Liste anzugeben, z. B. 1,4,6,8, was 1,4,6,8 bedeutet.
  • Bereiche werden mit einem Bindestrich ( -) angegeben und können mit Listen kombiniert werden, z. B. 1-3,9-12, dh zwischen 1 und 3, dann zwischen 9 und 12.
  • Das /Zeichen kann verwendet werden, um einen Schritt einzuführen, z. B. 2/5, was bedeutet, dass bei 2 alle 5 begonnen wird (2,7,12,17,22 ...). Sie wickeln sich nicht über das Ende hinaus.
  • Ein Sternchen ( *) in einem Feld kennzeichnet den gesamten Bereich für dieses Feld (z. B. 0-59für das Minutenfeld).
  • Bereiche und Schritte können kombiniert werden, z. B. */2bedeutet beginnend mit dem Minimum für das betreffende Feld alle 2, z. B. 0 für Minuten (0,2 ... 58), 1 für Monate (1,3 ... 11) usw.

Debuggen von Cron-Befehlen

Schauen Sie sich ihre E-Mails an!

Standardmäßig sendet cron alle Ausgaben des Befehls per E-Mail an den Benutzer, unter dem der Befehl ausgeführt wird. Wenn es keine Ausgabe gibt, gibt es keine Post. Wenn Sie möchten, dass cron E-Mails an ein anderes Konto sendet, können Sie die Umgebungsvariable MAILTO in der crontab-Datei festlegen, z

[email protected]
1 2 * * * /path/to/your/command

Erfassen Sie die Ausgabe selbst

Sie können stdout und stderr in eine Datei umleiten. Die genaue Syntax zum Erfassen der Ausgabe kann je nach verwendetem Shell-Cron variieren. Hier sind zwei Beispiele, die alle Ausgaben in einer Datei speichern /tmp/mycommand.log:

1 2 * * * /path/to/your/command &>/tmp/mycommand.log
1 2 * * * /path/to/your/command >/tmp/mycommand.log 2>&1

Schauen Sie sich die Protokolle an

Cron protokolliert seine Aktionen über Syslog, das (abhängig von Ihrem Setup) häufig auf /var/log/cronoder zugreift /var/log/syslog.

Bei Bedarf können Sie die cron-Anweisungen mit zB filtern

grep CRON /var/log/syslog 

Nachdem wir uns nun mit den Grundlagen von Cron befasst haben, wo sich die Dateien befinden und wie sie verwendet werden, wollen wir uns einige häufige Probleme ansehen.

Überprüfen Sie, ob cron läuft

Wenn cron nicht läuft, werden Ihre Befehle nicht eingeplant ...

ps -ef | grep cron | grep -v grep

sollte dir sowas besorgen

root    1224   1  0 Nov16 ?    00:00:03 cron

oder

root    2018   1  0 Nov14 ?    00:00:06 crond

Wenn nicht, starten Sie es neu

/sbin/service cron start

oder

/sbin/service crond start

Es kann andere Methoden geben; Verwenden Sie, was Ihre Distribution bietet.

cron führt Ihren Befehl in einer eingeschränkten Umgebung aus.

Welche Umgebungsvariablen verfügbar sind, ist wahrscheinlich sehr begrenzt. Normalerweise werden Sie nur wenige Variablen definiert, wie erhalten $LOGNAME, $HOMEund $PATH.

Besonders hervorzuheben ist die PATHBeschränkung auf /bin:/usr/bin. Die überwiegende Mehrheit der Probleme mit "Mein Cron-Skript funktioniert nicht" wird durch diesen restriktiven Pfad verursacht . Wenn sich Ihr Befehl an einem anderen Ort befindet, können Sie dies auf verschiedene Arten lösen:

  1. Geben Sie den vollständigen Pfad zu Ihrem Befehl an.

    1 2 * * * /path/to/your/command
    
  2. Geben Sie einen geeigneten PFAD in die crontab-Datei ein

    PATH=/usr:/usr/bin:/path/to/something/else
    1 2 * * * command 
    

Wenn Ihr Befehl andere Umgebungsvariablen erfordert, können Sie diese auch in der crontab-Datei definieren.

cron führt Ihren Befehl mit cwd == $ HOME aus

Unabhängig davon, wo sich das von Ihnen ausgeführte Programm im Dateisystem befindet, ist das aktuelle Arbeitsverzeichnis des Programms, wenn es von cron ausgeführt wird, das Ausgangsverzeichnis des Benutzers . Wenn Sie auf Dateien in Ihrem Programm zugreifen, müssen Sie dies berücksichtigen, wenn Sie relative Pfade verwenden, oder (vorzugsweise) überall nur vollqualifizierte Pfade verwenden, und allen eine Menge Verwirrung ersparen.

Der letzte Befehl in meiner Crontab wird nicht ausgeführt

Cron verlangt im Allgemeinen, dass Befehle mit einer neuen Zeile abgeschlossen werden. Bearbeiten Sie Ihre Crontab; Gehen Sie zum Ende der Zeile, die den letzten Befehl enthält, und fügen Sie eine neue Zeile ein (drücken Sie die Eingabetaste).

Überprüfen Sie das Crontab-Format

Sie können keine benutzer-crontab-formatierte crontab für / etc / crontab oder die Fragmente in /etc/cron.d und umgekehrt verwenden. Eine vom Benutzer formatierte crontab enthält keinen Benutzernamen an der sechsten Position einer Zeile, während eine vom System formatierte crontab den Benutzernamen enthält und den Befehl als dieser Benutzer ausführt.

Ich habe eine Datei in /etc/cron.{hourly,daily,weekly,monthly} abgelegt und sie wird nicht ausgeführt

  • Stellen Sie sicher, dass der Dateiname keine Erweiterung hat, siehe run-parts
  • Stellen Sie sicher, dass die Datei über Ausführungsberechtigungen verfügt.
  • Teilen Sie dem System mit, was beim Ausführen Ihres Skripts verwendet werden soll (z. B. #!/bin/shoben setzen)

Cron date bezogene Bugs

Wenn Ihr Datum kürzlich von einem Benutzer- oder Systemupdate, einer Zeitzone oder einem anderen geändert wurde, verhält sich crontab fehlerhaft und weist bizarre Fehler auf, die manchmal funktionieren, manchmal aber nicht. Dies ist der Versuch von crontab, zu versuchen, "zu tun, was Sie wollen", wenn sich die Zeit darunter ändert. Das Feld "Minute" wird unwirksam, nachdem die Stunde geändert wurde. In diesem Szenario werden nur Sternchen akzeptiert. Starten Sie cron neu und versuchen Sie es erneut, ohne eine Verbindung zum Internet herzustellen (damit das Datum nicht auf einen der Zeitserver zurückgesetzt werden kann).

Wieder Prozentzeichen

Um den Rat zu Prozentzeichen hervorzuheben, hier ein Beispiel, was cron mit ihnen macht:

# cron entry
* * * * * cat >$HOME/cron.out%foo%bar%baz

erstellt die ~ / cron.out-Datei mit den 3 Zeilen

foo
bar
baz

Dies ist besonders aufdringlich bei der Verwendung des dateBefehls. Achten Sie darauf, den Prozentzeichen zu entkommen

* * * * * /path/to/command --day "$(date "+\%Y\%m\%d")"
Eric Leschinski
quelle
Möglicherweise möchten Sie auch im Abschnitt 'restricted env' erwähnen, dass für LD_LIBRARY_PATH möglicherweise zusätzliche Verzeichnisse festgelegt werden müssen, falls Ihre Cron-Task fehlschlägt, da gemeinsam genutzte Bibliotheken nicht gefunden werden können.
DavidJ
Beachten Sie, dass Sie sogar so etwas schreiben können: 35 1,5-23 / 2 * * * do_something statt 35,1,5,7,9, .. * * * Zusätzlich übersetzt dieser crontab.guru die Einträge, die Sie machen menschliche Sprache.
Dennis Nolte
1
Die Ausgabeerfassung funktioniert bei mir nicht, kann an der sh-Shell liegen. Ich denke, das ist tragbarer: ... /path/to/your/command >/tmp/mycommand.log 2>&1
Chus
das hat bei mir funktioniert:sudo apt-get install postfix
jmunsch
hängt cron job auch davon ab, wie schwer die datei ist? Da ich einfache Hallo Welt in Python mit Cron lief, hat es funktioniert. Aber mein zweiter Code war ein bisschen schwer und läuft normalerweise, aber mit cron gibt er keine Ausgabe in die Datei.
Devendra Bhat
22

Debian Linux und sein Derivat (Ubuntu, Mint usw.) weisen einige Besonderheiten auf, die möglicherweise die Ausführung Ihrer Cron-Jobs verhindern. insbesondere die Dateien in /etc/cron.d, /etc/cron.{hourly,daily,weekly,monthly}müssen:

  • im Besitz von root sein
  • nur von root beschreibbar sein
  • Nicht beschreibbar für Gruppen oder andere Benutzer
  • habe einen Namen ohne Punkte '.' oder ein anderes Sonderzeichen als '-' und '_'.

Der letzte verletzt regelmäßig ahnungslose Benutzer; insbesondere jedes Skript in einem dieser Ordner genannt whatever.sh, mycron.py, testfile.pletc. wird nicht immer ausgeführt werden.

Nach meiner Erfahrung war dieser spezielle Punkt bei weitem der häufigste Grund für einen nicht ausgeführten Cronjob auf Debian und Derivaten.

Sehen Sie man cronfür weitere Informationen, falls erforderlich.

Wazoox
quelle
19

Wenn Ihre Cronjobs nicht mehr funktionieren, stellen Sie sicher, dass Ihr Kennwort nicht abgelaufen ist. Sobald dies der Fall ist, werden alle Cronjobs gestoppt.
Es werden Meldungen /var/log/messagesähnlich der folgenden angezeigt, die Probleme bei der Benutzerauthentifizierung aufzeigen:

(username) FAILED to authorize user with PAM (Authentication token is no longer valid; new one required)

Munkeh72
quelle
2
Habe das auch bekommen (Fehlermeldung Datei / var / log / syslog für mich). In meinem Fall eine DigitalOcean-Box, die beim Erstellen das Root-Passwort (optional) auf ein anderes zurücksetzt, und anscheinend werden alle Cron-Jobs nicht ausgeführt, bis Sie dorthin gehen und es ändern. Schade. Fix ist so etwas wiesudo -u root passwd
Rogerdpack
12

Gelegentlich und unregelmäßig

Alles in allem ist Cron ein sehr grundlegender Scheduler, und die Syntax ermöglicht es einem Administrator nicht leicht, etwas ungewöhnlichere Zeitpläne zu formulieren.

Betrachten Sie den folgenden Job, der normalerweise als " commandalle 5 Minuten ausgeführt" bezeichnet wird :

*/5 * * * * /path/to/your/command

gegen:

*/7 * * * * /path/to/your/command

was nicht immercommand alle 7 Minuten läuft .

Denken Sie daran , dass das /können Zeichen verwendet werden , um einen Schritt einzuführen , sondern dass Schritte wickeln nicht über das Ende einer Serie zB */7die jede 7. Minute aus dem Protokoll übereinstimmt , 0-59 dh 0,7,14,21,28,35,42,49, 56 aber zwischen einer Stunde und den nächsten wird es nur 4 Minuten zwischen den Chargen , nachdem 00:56eine neue Serie startet bei 01:00, 01:07usw. (und Chargen werden nicht ausgeführt auf 01:03, 01:10, 01:17etc.).


Was ist stattdessen zu tun?

Erstellen Sie mehrere Stapel

Erstellen Sie anstelle eines einzelnen Cron-Jobs mehrere Stapel, die zusammen den gewünschten Zeitplan ergeben.

Um beispielsweise alle 40 Minuten einen Stapel auszuführen (00:00, 00:40, 01:20, 02:00 usw.), erstellen Sie zwei Stapel, von denen einer zweimal zu geraden und der andere nur zu ungeraden Stunden ausgeführt wird:

# The following lines create a batch that runs every 40 minutes i.e.

# runs on   0:00, 0:40,        02:00, 02:40         04:00 etc to 22:40
0,40 */2 * * * /path/to/your/command

# runs on               01:20,               03:20,       etc to 23:20
20 1/2 * * * /path/to/your/command

# Combined: 0:00, 0:40, 01:20, 02:00, 02:40, 03:20, 04:00 etc.

Führen Sie Ihre Stapel weniger häufig aus

Anstatt Ihren Stapel alle 7 Minuten auszuführen, was ein schwieriger Zeitplan für die Aufteilung in mehrere Stapel ist, führen Sie ihn stattdessen einfach alle 10 Minuten aus.

Starten Sie Ihre Stapel häufiger (aber verhindern Sie, dass mehrere Stapel gleichzeitig ausgeführt werden)

Viele ungewöhnliche Zeitpläne entwickeln sich, weil die Stapellaufzeiten zunehmen / schwanken und die Stapel dann mit einer zusätzlichen Sicherheitsmarge geplant werden, um zu verhindern, dass sich nachfolgende Läufe desselben Stapels überlappen und gleichzeitig ausgeführt werden.

Denken Sie stattdessen anders und erstellen Sie einen Cronjob, der ordnungsgemäß fehlschlägt, wenn ein vorheriger Lauf noch nicht abgeschlossen ist, der jedoch ansonsten ausgeführt wird. Lesen Sie diese Fragen und Antworten :

* * * * * /usr/bin/flock -n /tmp/fcj.lockfile /usr/local/bin/frequent_cron_job 

Damit wird fast sofort ein neuer Lauf gestartet, sobald der vorherige Lauf von / usr / local / bin / frequent_cron_job abgeschlossen ist.

Starten Sie Ihre Stapel häufiger (aber beenden Sie sie ordnungsgemäß, wenn die Bedingungen nicht stimmen).

Da die Cron-Syntax eingeschränkt ist, können Sie entscheiden, komplexere Bedingungen und Logik im Stapeljob selbst (oder in einem Wrapper-Skript um den vorhandenen Stapeljob herum) zu platzieren. Auf diese Weise können Sie die erweiterten Funktionen Ihrer bevorzugten Skriptsprachen nutzen, Ihren Code kommentieren und schwer lesbare Konstrukte im crontab-Eintrag selbst vermeiden.

In bash seven-minute-jobwürde das dann ungefähr so ​​aussehen:

#!/bin/bash
# seven-minute-job
# This batch will only run when 420 seconds (7 min) have passed
# since the file /tmp/lastrun was either created or updated

if [ ! -f /tmp/lastrun ] ; then
    touch /tmp/lastrun
fi

if [ $(( $(date +%s) - $(date -r /tmp/lastrun +%s) )) -lt 420 ] ; then
     # The minimum interval of 7 minutes between successive batches hasn't passed yet.
    exit 0
fi

####  Start running your actual batch job below

/path/to/your/command

#### actual batch job is done, now update the time stamp
date > /tmp/lastrun
#EOF

Was Sie dann sicher (versuchen) können, jede Minute zu laufen:

* * * * * /path/to/your/seven-minute-job

Ein anderes, aber ähnliches Problem würde eine Charge planen am ersten Montag eines jeden Monats (oder zweiten Mittwoch) usw. einfach plant den Stapel laufen jeden Montag und Ausgang zu laufen , wenn Datum weder zwischen dem 1 st oder 7 th und der Wochentag ist nicht Montag.

#!/bin/bash
# first-monday-of-the-month-housekeeping-job

# exit if today is not a Monday (and prevent locale issues by using the day number) 
if [ $(date +%u) != 1 ] ; then
  exit 0
fi

# exit if today is not the first Monday
if [ $(date +%d) -gt 7 ] ; then
  exit 0
fi

####  Start running your actual batch job below

/path/to/your/command

#EOF

Was Sie dann sicher (versuchen) können, jeden Montag auszuführen:

0 0 * * 1 /path/to/your/first-monday-of-the-month-housekeeping-job

Verwenden Sie kein Cron

Wenn Ihre Anforderungen komplex sind, sollten Sie ein fortschrittlicheres Produkt verwenden, das für die Ausführung komplexer Zeitpläne (verteilt auf mehrere Server) ausgelegt ist und Trigger, Jobabhängigkeiten, Fehlerbehandlung, Wiederholungsversuche und Wiederholungsüberwachung usw. unterstützt. Die Fachsprache lautet "Unternehmen" " Job Scheduling und / oder" Workload Automation ".

HBruijn
quelle
8

PHP-spezifisch

Wenn du einen Cron Job hast wie:

php /bla/bla/something.php >> /var/logs/somelog-for-stdout.log

Und im Falle von Fehlern erwarten Sie, dass sie an Sie gesendet werden, aber sie nicht - überprüfen Sie dies.

PHP sendet standardmäßig keine Fehler an STDOUT. @siehe https://bugs.php.net/bug.php?id=22839

Um dies zu beheben, fügen Sie in cli`s php.ini oder in Ihrer Zeile (oder in Ihrem Bash-Wrapper für PHP) Folgendes hinzu:

  • --define display_startup_errors = 1
  • --define display_errors = 'stderr'

Mit der ersten Einstellung können Sie Fatals wie 'Memory oops' und mit der zweiten Einstellung alle nach STDERR umleiten. Erst wenn Sie gut schlafen können, werden alle an die Mail Ihres Roots gesendet, anstatt nur angemeldet zu sein.

gaRex
quelle
2
Dieser Fehlerbericht wurde 2007 mit dem Status des Patches geschlossen, der den PHP 5.2+ -Zweigen hinzugefügt wurde. Sind Sie sicher, dass dies benötigt wird? Ich habe gerade PHP 5.4 ausprobiert und es scheint gut zu funktionieren. (Es wird aber immer noch für PHP 4 benötigt).
Xeoncross
@Xeoncross siehe Datum der Antwort :)
gaRex
1
Ja, das hat mich verwirrt, seitdem Sie 2013 geantwortet haben und das Ticket '07 war.
Xeoncross
0

Hinzufügen meine Antwort von hier der Vollständigkeit halber, und das Hinzufügen eines weiteren potenziell hilfreiche Ressource:

Der cronBenutzer hat eine andere $PATHals Sie:

Ein häufiges Problem, das Benutzer bei crontabEingaben machen, besteht darin, dass sie vergessen, dass croneine andere environmentals die als angemeldete Benutzer ausgeführt wird. Ein Benutzer erstellt beispielsweise ein Programm oder ein Skript in seinem $HOMEVerzeichnis und gibt den folgenden Befehl ein, um es auszuführen:

$ ./certbot ... 

Der Befehl läuft perfekt von seiner Kommandozeile aus. Der Benutzer fügt dann diesen Befehl zu seinem hinzu crontab, stellt jedoch fest, dass dies nicht funktioniert:

*/10 * * * * ./certbot ....

In diesem Fall liegt der Grund für den Fehler darin, dass ./der cronBenutzer einen anderen Speicherort als der angemeldete Benutzer hat. Das heißt, das environmentist anders! Der PFAD ist ein Teil von environment, und er ist normalerweise für den cronBenutzer unterschiedlich. Dieses Problem wird dadurch erschwert, dass das environmentfor cronnicht für alle * nix- Distributionen gleich ist und es mehrere Versionen von gibtcron

Eine einfache Lösung für dieses spezielle Problem besteht darin, dem cronBenutzer im crontabEintrag eine vollständige Pfadangabe zu geben :

0 22 * * * /path/to/certbot .....

Was ist der cronBenutzer environment?

In einigen Fällen müssen wir möglicherweise die vollständigen environmentSpezifikationen für cronunser System kennen (oder wir sind einfach nur neugierig). Was ist das environmentfür den cronBenutzer und wie unterscheidet es sich von unserem? Ferner müssen wir die wissen , environmentfür einen anderen cronBenutzer - rootzum Beispiel ... was das ist des rootBenutzers environmentverwendet cron? Eine Möglichkeit, dies zu lernen, besteht crondarin, uns Folgendes mitzuteilen:

  1. Erstellen Sie ein Shell-Skript in Ihrem Ausgangsverzeichnis ( ~/) wie folgt (oder mit dem Editor Ihrer Wahl):
$ nano ~/envtst.sh
  1. Geben Sie im Editor nach der Anpassung an Ihr System / Ihren Benutzer Folgendes ein:
#!/bin/sh 
/bin/echo "env report follows for user "$USER >> /home/you/envtst.sh.out 
/usr/bin/env >> /home/you/envtst.sh.out 
/bin/echo "env report for user "$USER" concluded" >> /home/you/envtst.sh.out
/bin/echo " " >> /home/you/envtst.sh.out
  1. Speichern Sie die Datei, beenden Sie den Editor und legen Sie die Dateiberechtigungen als ausführbar fest.
$ chmod a+rx ~/envtst.sh
  1. Führen Sie das soeben erstellte Skript aus und überprüfen Sie die Ausgabe in /home/you/envtst.sh.out. Diese Ausgabe zeigt Ihre aktuelle Umgebung an, als die $USERSie angemeldet sind als:
$ ./envtst.sh $$ cat /home/you/envtst.sh.out
  1. Öffnen Sie Ihr crontabzum Bearbeiten:
$ crontab -e -u root
  1. Geben Sie die folgende Zeile am unteren Rand Ihres ein crontab:
* * * * *  /home/you/envtst.sh >> /home/you/envtst.sh.err 2>&1

ANTWORT: Die Ausgabedatei /home/you/envtst.sh.outenthält eine Auflistung der environmentfür den "root cron user". Wenn Sie das wissen, passen Sie Ihre crontabEingabe entsprechend an.

Ich kann den Zeitplan, den ich benötige, in meinem crontabEintrag nicht angeben :

Der Zeitplaneintrag für crontabist natürlich in definiert man crontab, und Sie sollten dies lesen. Das Lesen man crontabund Verstehen des Zeitplans sind jedoch zwei verschiedene Dinge. Das Ausprobieren einer Zeitplanspezifikation kann sehr mühsam werden. Glücklicherweise gibt es eine Ressource, die helfen kann: den Crontab-Guru. . Geben Sie Ihre Zeitplanspezifikation ein und es wird der Zeitplan in einfacher englischer Sprache erklärt.

Denken Sie nicht, dass Sie sich auf einen einzelnen crontabEintrag beschränken, da Sie nur einen Job zu erledigen haben. Sie können beliebig viele crontabEinträge verwenden, um den gewünschten Zeitplan zu erhalten.

Seamus
quelle