Ich habe ein Programm, das einen großen Teil der Arbeit erledigt (dauert ungefähr 4-5 Stunden), das von cron gestartet wird, wenn alle Daten, mit denen es arbeitet, verfügbar werden. Manchmal, wenn ich darauf warte, dass es zu Ende ist, möchte ich, dass ein anderes (interaktives) Programm startet, wenn es zu Ende ist. Der Warteanruf sieht vielversprechend aus, wird aber nur auf Kinder warten.
shell-script
process
hildred
quelle
quelle
ipc
auch Interprozesskommunikation verwenden.man ipc
.Antworten:
Ich bevorzuge definitiv die EDIT # 3- Lösung (siehe unten).
Wenn es sich nicht in derselben Shell befindet, verwenden Sie eine while- Schleife mit der Bedingung ps -p, die true zurückgibt . Setzen Sie einen Schlaf in die Schleife, um die Prozessorauslastung zu reduzieren.
oder wenn Ihr UNIX / proc unterstützt (z. B. HP-UX immer noch nicht).
Wenn Sie eine Auszeit wünschen
EDIT # 1
Es gibt einen anderen Weg: Verwenden Sie kein Cron . Verwenden Sie den Batch - Befehl , um Ihre Aufträge zu stapeln.
Zum Beispiel könnten Sie täglich alle Ihre Jobs stapeln. Der Stapel kann so optimiert werden, dass eine gewisse Parallelität besteht, sodass ein blockierter Job nicht den gesamten Stapel stoppt (dies hängt vom Betriebssystem ab).
EDIT # 2
Erstellen Sie ein FIFA in Ihrem Home-Verzeichnis:
am Ende deines Jobs:
zu Beginn des anderen Jobs (derjenige, der wartet):
Es ist keine Abfrage, es ist alt, gut, IO zu blockieren.
EDIT # 3
Signale verwenden:
Zu Beginn des Skripts:
am ende deiner langen arbeit:
quelle
Sie können Ihren Cron-Job so ändern, dass er ein Flag verwendet.
Anstatt
Sie können verwenden
Und überwachen Sie diese Datei einfach im Skript oder sogar manuell. Wenn es existiert, läuft Ihr Programm. Ansonsten können Sie tun, was Sie wollen.
Das Skriptbeispiel:
Falls Sie es nicht verwenden
sleep
möchten, können Sie das Skript ändern und es einmal pro X Minuten über cron ausführen.In diesem Fall lautet das Skriptbeispiel:
Dieser Weg ist etwas einfacher, da Sie die PID Ihres Cron-Prozesses nicht finden müssen.
quelle
Es gibt keine Möglichkeit, dass ein Prozess auf den Abschluss eines anderen Prozesses wartet, außer dass ein Elternteil auf den Abschluss eines seiner untergeordneten Prozesse wartet. Wenn Sie können, starten Sie das Programm über ein Skript:
Wenn Sie das beispielsweise nicht können, bevor Sie die große Menge an Arbeit von einem Cron-Job, aber dem interaktiven Programm aus dem Kontext Ihrer Sitzung heraus starten möchten, nehmen Sie dies vor
Es gibt verschiedene Möglichkeiten zur Implementierung
notify_completion
. Einige Desktop-Umgebungen bieten einen Benachrichtigungsmechanismus ( Öffnen eines Fensters auf einer Remote-X-Anzeige (warum "Anzeige kann nicht geöffnet werden"?) Kann hilfreich sein). Sie können auch eine Benachrichtigung über Dateiänderungen erstellen. Unter Linux ist die Benachrichtigungsfunktion für Dateiänderungen inotify .Um auf die Schaffung von zu reagieren
/path/to/finished.stamp
:Wenn Sie die Art des
do_large_amount_of_work
Aufrufs nicht ändern können , aber wissen, welche Datei zuletzt geändert wurde , können Sie auf dieselbe Weise reagieren, wenn diese Datei geschlossen wird. Sie können auch auf andere Ereignisse wie das Umbenennen einer Datei reagieren (inotifywait
eine Liste der Möglichkeiten finden Sie im Handbuch).quelle
Wenn das Skript vom Cronjob ausgelöst wird, rufen Sie ein leeres Shell-Skript auf, in das Sie bei Bedarf Folgeaufgaben einfügen können.
Es ist Gilles 'Ansatz sehr ähnlich.
cronjob-task.sh
enthält:Wo
post-execute.sh
ist in der Regel leer, es sei denn, Sie sehen, dass Sie eine Folgeaufgabe auslösen müssen.quelle