(Ich habe bereits gelesen, wie ich ein neues Cron-Skript testen kann .)
Ich habe ein bestimmtes Problem (Cron-Job scheint nicht oder nicht ordnungsgemäß zu laufen), aber das Problem ist allgemein: Ich möchte Scripts debuggen, die cronned sind. Mir ist bewusst, dass ich eine * * * * * crontab-Leitung einrichten kann, aber das ist keine völlig zufriedenstellende Lösung. Ich möchte in der Lage sein, einen Cron-Job über die Befehlszeile auszuführen, als würde Cron ihn ausführen (derselbe Benutzer, dieselben Umgebungsvariablen usw.). Gibt es eine Möglichkeit, dies zu tun? Es ist nicht praktisch, 60 Sekunden warten zu müssen, um Skriptänderungen zu testen.
Antworten:
Hier ist, was ich getan habe, und es scheint in dieser Situation zu funktionieren. Zumindest wird mir ein Fehler angezeigt, wohingegen das Ausführen von der Befehlszeile aus, da der Benutzer den Fehler nicht anzeigt.
Schritt 1 : Ich habe diese Zeile vorübergehend in die crontab des Benutzers eingefügt:
dann nahm es heraus, sobald die Datei geschrieben wurde.
Schritt 2 : Ich habe ein kleines Run-as-Cron-Bash-Skript erstellt, das Folgendes enthält:
Also war ich als fraglicher Benutzer in der Lage
Diese Lösung könnte offensichtlich erweitert werden, um sudo oder dergleichen für mehr Flexibilität zu verwenden.
Hoffe das hilft anderen.
quelle
/usr/bin
. 2) Diecat …/cron-env
Ausgabe mehrerer Zeilen funktioniert nicht. Versuchen Sie einfach, das Programm/usr/bin/env -i $(cat cron-env) echo $PATH
im Terminal auszuführen . Es gibt die Umgebung buchstäblich aus, anstatt sie zu verwenden. 3) Die aktuelle Umgebung gelangt in die emulierte Cron-Umgebung. Versuchen:export foo=leaked; run-as-cron echo $foo
.cat
gibt mehrere Zeilen aus, die funktionieren, da die Shell-Ersetzung sie zu einer einzigen Zeile zusammenfasst, die Sie überprüfen könnenecho $(cat cron-env ) | wc
. Ihr Beispielbefehl,,/usr/bin/env -i $(cat cron-env) echo $PATH
ersetzt$PATH
die aufrufende Shell. Stattdessen sollte eine Unterschale aufgerufen werden, die in der Unterumgebung ersetzt werden soll, z/usr/bin/env -i $(cat cron-env) /bin/sh -c 'echo $PATH'
. 3. Sie haben den gleichen Fehler begangen, indem Sie erneut in der aufrufenden Shell und nicht in der Unterumgebung eingesetzt habenIch präsentiere eine Lösung basierend auf Pistos Antwort, aber ohne die Mängel.
Fügen Sie der Crontab die folgende Zeile hinzu, z. B. mit
crontab -e
Erstellen Sie ein Shell-Skript, das einen Befehl in derselben Umgebung ausführt, in der Cron-Jobs ausgeführt werden:
Verwenden:
z.B
Beachten Sie, dass das zweite Argument in Anführungszeichen gesetzt werden muss, wenn ein Argument erforderlich ist. Die erste Zeile des Skripts lädt eine POSIX-Shell als Interpreter. Die zweite Zeile enthält die Cron-Umgebungsdatei. Dies ist erforderlich, um die richtige Shell zu laden, die in der Umgebungsvariablen gespeichert ist
SHELL
. Anschließend wird eine leere Umgebung geladen (um zu verhindern, dass Umgebungsvariablen in die neue Shell gelangen), dieselbe Shell gestartet, die für Cronjobs verwendet wird, und die Cron-Umgebungsvariablen geladen. Schließlich wird der Befehl ausgeführt.quelle
Da Crontab den Job nicht erledigt, müssen Sie den Inhalt manipulieren:
Was es macht :
quelle
sudo -H -u otheruser bash -c 'crontab..."
die Crontab eines anderen Benutzers BTWStandardmäßig gibt es bei den meisten Standard-Cron-Daemons, die ich gesehen habe, einfach keine Möglichkeit, Cron anzuweisen, sofort hier zu laufen. Wenn Sie anacron verwenden, kann es sein, dass ich denke, dass im Vordergrund eine separate Instanz ausgeführt wird.
Wenn Ihre Skripte nicht ordnungsgemäß ausgeführt werden, berücksichtigen Sie dies nicht
Aus crontab (5):
Im Allgemeinen ist PFAD das größte Problem, daher müssen Sie Folgendes tun:
Wenn Sie das Skript als anderer Benutzer ohne Shell ausführen müssen (z. B. www-data), verwenden Sie sudo:
Zuallererst sollten Sie natürlich testen, ob Ihr Skript tatsächlich das tut, was es von der Befehlszeile aus tun soll. Wenn Sie es nicht über die Befehlszeile ausführen können, funktioniert es offensichtlich nicht mit cron.
quelle
Marcos Drehbuch funktionierte aus irgendeinem Grund nicht für mich. Ich hatte keine Zeit zum Debuggen, also schrieb ich ein Python-Skript, das dasselbe tut. Es ist länger, aber: Erstens funktioniert es für mich und zweitens finde ich es leichter zu verstehen. Ändern Sie "/ tmp / cron-env" in das Verzeichnis, in dem Sie Ihre Umgebung gespeichert haben. Hier ist es:
quelle
Nun, der Benutzer ist derselbe wie der, den Sie in den Crontab-Eintrag eingegeben haben (oder in dessen Crontab Sie ihn abwechselnd eingegeben haben). Das ist also ein Kinderspiel.
crontab
(5) Sollte man die Liste der Umgebungsvariablen einstellen, gibt es nur wenige.quelle
In den meisten Crontabs wie z. B. vixie-cron können Sie Variablen wie folgt in die Crontab selbst einfügen und dann mit / usr / bin / env prüfen, ob sie funktionieren. Auf diese Weise können Sie Ihr Skript in Crontab zum Laufen bringen, sobald Sie herausgefunden haben, was mit dem Run-as-Cron-Skript nicht stimmt.
quelle
Marcos Lösung hat bei mir nicht funktioniert, aber Noams Python-Skript hat funktioniert. Hier ist eine kleine Änderung an Marcos Skript, die es für mich zum Laufen gebracht hat:
Die hinzugefügten
set -a
Exportvariablen wurden in Skript $ 1 definiert und für Befehl $ 2 verfügbar gemachtps Noams Python hat funktioniert, weil es die Umgebung in den untergeordneten Prozess 'exportiert' hat.
quelle
Wenn es sich um ein Shell-Skript handelt, sollten Sie den größten Teil davon erhalten:
Es wird definitiv einige Probleme aufzeigen, wenn nicht sogar alles.
quelle
Ich habe noch nie eine Möglichkeit gefunden, Cron-Jobs manuell auszuführen. In diesem Artikel wird jedoch empfohlen, dieselbe Umgebung wie beim Cronjob festzulegen und das Skript manuell auszuführen.
quelle
Sie können den Job so programmieren, dass er in der nächsten Minute beginnt :)
quelle
Ich nudelte an Marcos Antwort. Der Code wird unten gezeigt, aber ich werde dieses Skript hier pflegen .
Angesichts dieser crontab:
Beispielgebrauchssitzung:
Dies
cronTest2
muss ordnungsgemäß aufgerufen werden, um die Umgebungsvariablen auf dieselbe Weise wie cron einzurichten:cronTest
LäuftcronTest2
mit den richtigen Umgebungsvariablen:quelle