Die richtige Art und Weise mit einem Skript cron zu laufen?
Frage
Wenn Sie ein Skript mit cron ausgeführt wird, jede ausführbare Datei innerhalb aufgerufen werden, müssen Sie den vollständigen Pfad haben. Ich entdeckte diese versuchen zu laufen wondershaper , wenn viele Fehler zeigte, wenn es versucht, tc zu nennen. Also meine Frage ist, was der richtige Weg ist, dieses Problem zu überwinden?
Mögliche Lösungen:
- cd zum ausführbaren Ordner und bereiten symbolische Links zu anderen ausführbaren dort genannt (nicht sicher, ob es funktioniert - niedrige Portabilität)
- verwenden vollständige Pfade im Skript (es funktioniert - geringe Übertragbarkeit zwischen verschiedenen Distributionen)
- Pfadvariablen mit den benötigten Pfade im Script exportieren (nicht sicher, ob es funktioniert)
Nun, vielen Dank im Voraus für jedermann zu helfen.
Lösung
Variablen in Ihrem Cron-Job Deklarieren ist expliziter und leichter zu pflegen: alles, was Sie ändern müssen, ist in Ihrem Cron-Job enthalten sind, und Sie brauchen nicht mehrere Dateien zu übertragen, sollten Sie es auf ein anderes System verschieben
PATH=/usr/bin:/your/fancy/dir
MYAPPROOT=/var/lib/myapp
*/2 * * * * myappinpath
*/3 * * * * $MYAPPROOT/mylocalapp
Andere Tipps
Wenn Sie auf Linux / bsd / mac sind, können Sie einige Umgebungsvariablen wie PATH
direkt im crontab
gesetzt, und damit sind Sie in der Regel gut zu gehen.
Wenn Sie auf Solaris sind, na ja, ich bete für Sie. Aber ich habe eine Antwort zu: ich in der Regel Quelle .profile
vor der Ausführung etwas:
0 0 * * 0 . /home/myuser/.profile && cd /path && ./script
Wohlgemerkt, meine .profile
Lasten .bash_profile
und .bashrc
. Nur sicher sein, was Datei, die Sie Quelle hat, was Sie brauchen.
Da cron nicht ausgeführt Login, .profile und / etc / profile werden nicht gelesen. Daher PATH darf nicht auf den Wert, den Sie erwarten, eingestellt werden. Ich würde entweder
- gesetzt und export PATH auf einen entsprechenden Wert
- verwenden vollständige Pfade im Script
Ihr Trick mit Symlinks annimmt. PATH ist in und scheint einfach nicht schön
Meine Empfehlung:
Stellen Sie alle Variablen in einer externen Datei. Ich benutze ‚process_name.env‘ Datei im Verzeichnis / etc / process_name oder ähnlichem. Stellen Sie sich ein Backup-Skript haben. Dann sind Sie:
- Erstellen /etc/backup.env und alle Umgebungsvariablen für tun, um die „Sicherung“ Aufgabe benötigt setzen.
-
Ändern Sie bitte Ihre Backup-Skript und fügen Sie diese Zeile nach Shebang :
. /etc/backup.env #There ist ein Punkt und ein Leerzeichen vor vollständigem Pfad zur Backup-Umgebung.
IMO dieser Ansatz ist besser als Variablen bei CRON Definitionen erklärt, weil:
- Leicht zu pflegen. Bearbeiten Sie einfach eine Datei aus.
- Einfache Konfiguration / zentrale Konfiguration wechseln:
- Sie können mehrere .env für die Verwendung von Skripts in verschiedenen Situationen haben kann (zum Beispiel, betrachten Sie Backup-Speicherorte auf Ihrem .env haben, können Sie .env Lage als Argument übergeben und Ihre Cron-Job laufen täglich eine .env bietet mit wenige Standorte und wöchentlich mit verschiedenen Standorten durch einen anderen .env bietet, nur ein Beispiel).
- Sie können Ihre .env Dateien in einer VCS wie SVN oder Git halten.
- Viel einfach Ihre Skripte zu testen (es gibt keine Notwendigkeit, sie von cron ausführen).
Viele Grüße