Mam program, który wykonuje dużą część pracy (zajmuje około 4-5 godzin), którą uruchamia cron, gdy wszystkie dane, z którymi współpracuje, stają się dostępne. Czasami, kiedy czekam na zakończenie, chciałbym mieć możliwość uruchomienia innego (interaktywnego) programu po jego zakończeniu. połączenie oczekujące wygląda obiecująco, ale będzie czekać tylko na dzieci.
shell-script
process
Hildred
źródło
źródło
ipc
również z komunikacji międzyprocesowej.man ipc
.Odpowiedzi:
Zdecydowanie wolę rozwiązanie EDIT # 3 (patrz poniżej).
jeśli nie jest w tej samej powłoki użyć while pętlę Warunkiem PS -p powrocie prawdziwe. Położyć spać w pętlę, aby zmniejszyć zużycie procesora.
lub jeśli twój system UNIX obsługuje / proc (na przykład HP-UX nadal nie obsługuje).
Jeśli chcesz przekroczyć limit czasu
EDYCJA 1
Jest inny sposób: nie używaj crona . Użyj polecenia wsadowego do układania zadań w stos.
Na przykład możesz codziennie układać wszystkie swoje prace. Partię można dostroić, aby umożliwić pewną równoległość, dzięki czemu zablokowane zadanie nie zatrzyma całego stosu (zależy to od systemu operacyjnego).
EDYCJA 2
Utwórz fifo w swoim katalogu domowym:
pod koniec pracy:
na początku innej pracy (tej, która czeka):
To nie odpytywanie, to stare dobre blokowanie IO.
EDYCJA # 3
Za pomocą sygnałów:
Na początku skryptu (ów), który (e) czeka:
pod koniec długiej pracy:
źródło
Możesz zmodyfikować swoje zadanie cron, aby użyć flagi.
Zamiast
Możesz użyć
I po prostu monitoruj ten plik w skrypcie lub nawet ręcznie. Jeśli istnieje, oznacza to, że Twój program działa; w przeciwnym razie możesz robić, co chcesz.
Przykład skryptu:
Jeśli nie chcesz używać
sleep
, możesz zmodyfikować skrypt i uruchamiać go przez cron raz na X minut.W takim przypadku przykładowym skryptem będzie:
W ten sposób jest trochę łatwiej, ponieważ nie musisz znajdować PID procesu cron.
źródło
Nie ma możliwości, aby proces czekał na zakończenie innego procesu, z wyjątkiem sytuacji, gdy rodzic czeka na zakończenie jednego z procesów potomnych. Jeśli możesz, uruchom program za pomocą skryptu:
Jeśli nie możesz tego zrobić, na przykład przed rozpoczęciem dużej ilości pracy z zadania cron, ale programu interaktywnego z kontekstu sesji, zrób to
Istnieje kilka sposobów wdrożenia
notify_completion
. Niektóre środowiska graficzne zapewniają mechanizm powiadamiania ( otworzyć okno na wyświetlaczu zdalnego X (dlaczego „nie można otworzyć ekran”)? Może być przydatne). Możesz także zrobić to za pomocą powiadomień o zmianie pliku. W systemie Linux funkcja powiadamiania o zmianie pliku jest niedostępna .Aby zareagować na utworzenie
/path/to/finished.stamp
:Jeśli nie możesz zmienić sposobu, w jaki
do_large_amount_of_work
jest wywoływany, ale wiesz, który plik modyfikuje jako ostatni, możesz użyć tego samego mechanizmu, aby zareagować, gdy plik zostanie zamknięty. Możesz także reagować na inne zdarzenia, takie jak zmiana nazwy pliku (inotifywait
lista możliwości znajduje się w instrukcji obsługi).źródło
Wywołanie skryptu przez cronjob wywołuje pusty skrypt powłoki, do którego można wstawiać kolejne zadania, jeśli są potrzebne.
Jest to bardzo podobne do podejścia Gillesa.
cronjob-task.sh
zawiera:gdzie
post-execute.sh
jest zwykle puste, chyba że widzisz, że musisz uruchomić kolejne zadanie.źródło