Normalerweise habe ich verschiedene Probleme mit der Ausführung von Skripten durch cron, da meine Umgebung normalerweise nicht eingerichtet ist. Gibt es eine Möglichkeit, bash (?) Auf die gleiche Weise wie cron aufzurufen, damit ich Skripte testen kann, bevor ich sie installiere?
253
Antworten:
Fügen Sie dies Ihrer Crontab hinzu (vorübergehend):
Führen Sie nach dem Ausführen folgende Schritte aus:
Dies setzt voraus, dass Ihr Cron / bin / sh ausführt. Dies ist die Standardeinstellung, unabhängig von der Standard-Shell des Benutzers.
quelle
env -
cat ~ / cronenv` / bin / sh` auch als cron job geschrieben werden? Bitte geben Sie ein BeispielCron bietet standardmäßig nur diese Umgebung:
HOME
Home-Verzeichnis des BenutzersLOGNAME
Benutzer LoginPATH=/usr/bin:/usr/sbin
SHELL=/usr/bin/sh
Wenn Sie mehr benötigen, können Sie ein Skript erstellen, in dem Sie Ihre Umgebung vor der Planungstabelle in der Crontab definieren.
quelle
.
istPATH
aus Sicherheitsgründen normalerweise nicht mehr Teil von .Einige Ansätze:
Exportieren Sie cron env und beziehen Sie es:
Hinzufügen
Lassen Sie es einmal laufen, schalten Sie es wieder aus und laufen Sie dann zu Ihrem Crontab
Und Sie befinden sich jetzt in einer
sh
Sitzung mit Cron-UmgebungBringen Sie Ihre Umgebung zu cron
Sie könnten über die Übung hinausgehen und einfach einen
. ~/.profile
Job vor Ihrem Cron machen, zBildschirm verwenden
Die beiden oben genannten Lösungen schlagen immer noch fehl, da sie eine Umgebung bereitstellen, die mit einer laufenden X-Sitzung verbunden ist, auf die
dbus
usw. zugegriffen werden kann. Unter Ubuntunmcli
funktioniert (Network Manager) beispielsweise in den beiden oben genannten Ansätzen, schlägt jedoch in cron immer noch fehl.Fügen Sie die obige Zeile zu cron hinzu, lassen Sie es einmal laufen und schalten Sie es wieder aus. Stellen Sie eine Verbindung zu Ihrer Bildschirmsitzung her (Bildschirm -r). Wenn Sie die Bildschirm - Sitzung Überprüfung erstellt wurde (mit
ps
) bewusst sein , dass sie manchmal in Großbuchstaben (zBps | grep SCREEN
)Jetzt wird sogar
nmcli
und ähnlich scheitern.quelle
Du kannst rennen:
Dadurch wird Ihr Befehl mit einer leeren Umgebung ausgeführt.
quelle
env - HOME="$HOME" LOGNAME="$USER" PATH="/usr/bin:/bin" SHELL="$(which sh)" command arguments
was den Trick zu tun scheintAbhängig von der Shell des Kontos
oder
Von http://matthew.mceachen.us/blog/howto-simulate-the-cron-environment-1018.html
quelle
Antwort sechs Jahre später: Das Problem der Nichtübereinstimmung der Umgebung ist eines der Probleme, die von
systemd
"Timern" als Cron-Ersatz gelöst werden . Unabhängig davon, ob Sie den systemd "Service" über die CLI oder über cron ausführen, erhält er genau dieselbe Umgebung, wodurch das Problem der Nichtübereinstimmung der Umgebung vermieden wird.Das häufigste Problem, das dazu führt, dass Cron-Jobs fehlschlagen, wenn sie manuell übergeben werden, ist der
$PATH
von cron festgelegte restriktive Standard , der unter Ubuntu 16.04 verwendet wird:Im Gegensatz dazu ist der unter Ubuntu 16.04
$PATH
festgelegte Standardsystemd
:Es besteht also bereits eine bessere Chance, dass ein Systemd-Timer ohne weiteren Aufwand eine Binärdatei findet.
Der Nachteil bei systemd-Timern ist, dass etwas mehr Zeit zum Einrichten bleibt. Sie erstellen zuerst eine "Service" -Datei, um zu definieren, was Sie ausführen möchten, und eine "Timer" -Datei, um den Zeitplan für die Ausführung zu definieren, und "aktivieren" schließlich den Timer, um ihn zu aktivieren.
quelle
Erstellen Sie einen Cron-Job, der env ausführt und stdout in eine Datei umleitet. Verwenden Sie die Datei neben "env -", um dieselbe Umgebung wie ein Cron-Job zu erstellen.
quelle
Vergessen Sie nicht, dass crons übergeordnetes Element init ohne steuerndes Terminal ausführt. Sie können dies mit einem Tool wie diesem simulieren:
http://libslack.org/daemon/
quelle
Standardmäßig werden
cron
die Jobs mit den Vorstellungen Ihres Systems ausgeführtsh
. Dies könnte die tatsächliche Bourne - Shell oder seindash
,ash
,ksh
oderbash
(oder ein anderer) symlinked zush
(und als Folge in POSIX - Modus ausgeführt wird ).Am besten stellen Sie sicher, dass Ihre Skripte das haben, was sie benötigen, und nehmen an, dass nichts für sie bereitgestellt wird. Daher sollten Sie vollständige Verzeichnisspezifikationen verwenden und Umgebungsvariablen wie Sie
$PATH
selbst festlegen .quelle
0 0 * * 1 /path/to/executable >/dev/null 2>&1
und dann würde ich innerhalb von "ausführbar" Werte für$PATH
usw. festlegen und vollständige Verzeichnisspezifikationen zum Eingeben und/path/to/do_something /another/path/input_file /another/path/to/output_file
Eine andere einfache Möglichkeit, die ich gefunden habe (die jedoch möglicherweise fehleranfällig ist und die ich noch teste), besteht darin, die Profildateien Ihres Benutzers vor Ihrem Befehl zu erstellen.
Bearbeiten eines /etc/cron.d/-Skripts:
Würde sich verwandeln in:
Schmutzig, aber es hat den Job für mich erledigt. Gibt es eine Möglichkeit, ein Login zu simulieren? Nur ein Befehl, den Sie ausführen könnten?
bash --login
hat nicht funktioniert. Es klingt so, als wäre das der bessere Weg.EDIT: Dies scheint eine solide Lösung zu sein: http://www.epicserve.com/blog/2012/feb/7/my-notes-cron-directory-etccrond-ubuntu-1110/
quelle
Die akzeptierte Antwort bietet eine Möglichkeit, ein Skript mit der Umgebung auszuführen, die cron verwenden würde. Wie andere betonten, ist dies nicht das einzige erforderliche Kriterium für das Debuggen von Cron-Jobs.
In der Tat verwendet cron auch ein nicht interaktives Terminal ohne angeschlossenen Eingang usw.
Wenn das hilft, habe ich ein Skript geschrieben, mit dem ein Befehl / Skript schmerzlos ausgeführt werden kann, wie es von cron ausgeführt wird. Rufen Sie es mit Ihrem Befehl / Skript als erstem Argument auf und Sie sind gut.
Dieses Skript wird auch auf Github gehostet (und möglicherweise aktualisiert) .
quelle
Die Antwort https://stackoverflow.com/a/2546509/5593430 zeigt, wie Sie die Cron-Umgebung abrufen und für Ihr Skript verwenden. Beachten Sie jedoch, dass die Umgebung je nach verwendeter Crontab-Datei unterschiedlich sein kann. Ich habe drei verschiedene Cron-Einträge erstellt, um die Umgebung über zu retten
env > log
. Dies sind die Ergebnisse unter Amazon Linux 4.4.35-33.55.amzn1.x86_64.1. Global / etc / crontab mit Root-Benutzer
2. Benutzer crontab von root (
crontab -e
)3. Skript in /etc/cron.hourly/
Am wichtigsten ist
PATH
,PWD
undHOME
unterscheiden. Stellen Sie sicher, dass Sie diese in Ihren Cron-Skripten festlegen, um eine stabile Umgebung zu gewährleisten.quelle
Ich glaube nicht, dass es das gibt; Die einzige Möglichkeit, einen Cron-Job zu testen, besteht darin, ihn so einzurichten, dass er in Zukunft ein oder zwei Minuten lang ausgeführt wird, und dann zu warten.
quelle