Ich habe versucht, einen Root-Cron-Job einzurichten, um ein Bash-Skript als Root auszuführen, das in Minute 7,37 ausgeführt wird, jede Stunde, jeden Tag im Monat, jeden Monat. Dieses Skript befindet sich in /usr/bin
und heißt tunlrupdate.sh
. Es aktualisiert den DNS von Tunlr.
$ ls -l /usr/bin/tunlrupdate.sh
-rwxr-xr-x 1 root root 2133 Sep 24 15:42 /usr/bin/tunlrupdate.sh
Dieses Bash-Skript finden Sie hier .
Beim Aufrufen schreibt das Skript, was in einem Protokoll in passiert /var/log/tunlr.log
Um diesen root-cron-Job hinzuzufügen, habe ich den Standard für die crontab von root verwendet
sudo crontab -e
Und diese 2 Zeilen am Ende eingefügt. Ich erwarte, dass cron das Skript als root ausführt.
# check for updated Tunlr DNS every 30 minutes at the hour + 7 mn and hour + 37 mn
07,37 * * * * root /usr/bin/tunlrupdate.sh
Ein späterer Befehl sudo crontab -l
bestätigte, dass der Cron-Job eingefügt wurde.
Ich habe Ubuntu neu gestartet und habe in der Protokolldatei überprüft, ob der Cron-Job ordnungsgemäß gestartet wurde. Die Protokolldatei enthält jedoch nichts, /var/log/tunlr.log
was bedeutet, dass der Job nie erfolgreich gestartet wurde.
Ich habe das überprüft, wenn ich das Skript über die Befehlszeile ausführe
sudo /usr/bin/tunlrupdate.sh
dann wird die Logdatei entsprechend aktualisiert.
Warum läuft dieser Cron-Job in meinem System nicht wie geplant?
UPDATE 1: Alle bisher vorgeschlagenen Lösungen funktionieren nicht. Ich danke Olli für eine CLI, die das Systemprotokoll auflistet sudo grep CRON /var/log/syslog
. Allerdings habe ich einen CRON-Fehler bekommen
CRON[13092]: (root) CMD ( [ -x /usr/lib/php5/maxlifetime ] && [ -d /var/lib/php5 ]
&& find /var/lib/php5/ -depth -mindepth 1 -maxdepth 1 -type f -cmin +$(/usr/lib/php
/maxlifetime) ! -execdir fuser -s {} 2>/dev/null \; -delete)
mit dem vorgeschlagenen PATH = Einfügen und Verwenden des absoluten Pfads von root für Funktionen im Skript oder ohne diese hier vorgeschlagenen Lösungen. Ich bekomme immer noch diesen Fehler.
Nach einiger Suche geortet ich in der Datei die Fehler /usr/lib/php5/maxlifetime
wie erklärt hier :Change #!/bin/sh -e --> #!/bin/sh -x
Dann das CRON-Fehlerprotokoll in meinem System auflisten
sudo grep CRON /var/log/syslog
Feb 11 18:07:01 Marius-PC CRON[14067]: (root) CMD (root /usr/bin/tunlrupdate.sh)
Feb 11 18:07:01 Marius-PC CRON[14066]: (root) MAIL (mailed 1 byte of output; but got
status 0x00ff, #012)
Das Bash-Skript wird immer noch nicht ausgeführt. Dieses Mal wird kein Fehler im Protokoll angezeigt. Um sicherzugehen, dass dies nicht der Inhalt des Skripts war, habe ich das Skript auf die folgenden 3 Zeilen reduziert:
#!/bin/bash
LOGFILE=/var/log/tunlr.log
echo $LOGFILE >> $LOGFILE
Ich bekomme den Cronjob immer noch nicht durch. In die Protokolldatei wird nichts geschrieben. So kann sogar ein leeres Skript nicht in Cron ausgeführt werden? Ich verstehe es nicht. Ich weiß, dass ich ein Skript probiere, das auf diese zwei Zeilen reduziert ist:
#!/bin/bash
exit 0
Und immer noch das gleiche Fehlerprotokoll. Das Cron-Skript geht nicht durch ...
Antworten:
Wenn Sie ein Skript als normaler Benutzer ausführen möchten :
Und füge die Zeile hinzu:
Wenn Sie Ihr Skript als root ausführen möchten :
Und füge die gleiche Zeile hinzu:
quelle
sudo crontab -e
stattcrontab -e
) ausprobiert . Oder etwas anderes, trotzdem funktioniert esNun, endlich die funktionierende Lösung. Im Syslog sah ich die sich wiederholenden und faszinierenden:
Das klingt so, als ob root nicht als cmd erkannt wurde. Da habe ich schon den Cron des Roots mit benutzt
$ sudo /usr/bin/tunlrupdate.sh
. Dann habe ich mit dem Originalskript (korrigiert für einen Fehler im UNIX-Cmd-Datum:% m, was Monat ist, wurde für Minuten verwendet, was% M ist) Folgendes versucht (was die Wurzel aus der Cron-Zeile entfernt):Dies stellte sich als endgültige Lösung heraus. [Obwohl ich zahlreiche Literaturstellen gefunden habe, in denen die fehlerhafte Linie mit der Wurzel in der Cron-Linie angegeben ist. Das war ein Fehler].
quelle
crontab
Befehl bearbeiten sollten (außer Crontab-Dateien unter/etc
)./etc/crontab
(der systemweiten crontab) verwendet. Wennsudo crontab -e
Sie mit root's crontab arbeiten, finden Sie es normalerweise in/var/spool/cron/crontabs
Ein "Problem" bei Cron ist das Fehlen von Umgebungsvariablen (aus offensichtlichen Sicherheitsgründen). Vermutlich fehlen Ihnen PATH und HOME. Sie können diese direkt im Skript oder in der crontab-Datei definieren.
Sie müssen testen, bis alle erforderlichen Variablen gemäß den Anforderungen des Skripts definiert sind.
quelle
/etc/crontab
Datei kopiert und in die eingefügt,sudo crontab -e
und der Befehl wurde problemlos als root ausgeführt. Vielen Dank!Cron-Fehlermeldungen werden normalerweise standardmäßig per E-Mail gesendet. Sie können überprüfen, ob es eine E-Mail für root gibt
sudo mail
, oder indem Sie nur den Inhalt von/var/mail/root
zsudo less /var/mail/root
.Wenn E-Mail-Nachrichten nicht helfen, überprüfen Sie auch
/var/log/syslog
:Wie Alexis Wilke bereits sagte, haben Crons unterschiedliche Mechanismen zum Setzen von Umgebungsvariablen.
Dein Drehbuch braucht
zur Crontab.
HOME
sollte nicht nötig sein. Sie sollten absolute Pfade in Ihre Skripte verwenden, zB/bin/date
stattdate
. Sie können geeignete Pfade für jeden Befehl findenwhich command_name
, zquelle
/var/mail/root
. Sie können entweder das Problem beheben oder es mitPATH=...
Sie können diese Zeile in Ihr Skript einfügen. Nachdem Sie die Cron-Protokolle überprüft und bestätigt haben, dass Ihr Auftrag ausgeführt wurde, können Sie den gleichen $ PATH von Crontabs erhalten.
Und wahrscheinlich ist das Beste, was Sie tun können, um Probleme in Cron-Skripten zu diagnostizieren, alle Umgebungsvariablen von SO mit dem Befehl env in Ihrem Skript abzurufen. Fügen Sie diese Zeile einfach zu Ihrem Skript hinzu. Dann können Sie die Ausgabe analysieren
allEvnVars.txt
Ein weiterer Trick besteht darin, die Ausgabe des Skripts an eine bestimmte Stelle zu lenken. Hinzufügen der
/root/log.log
. Auf diese Weise bleibt die gesamte Ausgabe des Skripts erhalten/root/log.log
Sie können das Skript auch so planen, dass es jede Minute ausgeführt wird, um die Tests und Überprüfungen zu erleichtern.
quelle