Praktycznie potrzebuję procesu, który zachowuje się tak, jakbym naciskał Ctrl+Z
zaraz po jego rozpoczęciu.
Mamy nadzieję, że można to zrobić za pomocą skryptu powłoki.
(Wiedząc, że wynikowy PID byłby świetny, żebym mógł kontynuować proces później).
linux
process
background-process
java.is.for.desktop
źródło
źródło
#!/bin/bash
[enter]$@ &
[enter]PID=$!
[enter]kill -STOP $PID
[enter]echo "Suspended: $PID, press ENTER to continue it"
[enter]read
[enter]kill -CONT $PID
[enter]wait $PID
[enter]echo
Z jakiego środowiska tworzysz proces?
Jeśli robisz to ze środowiska takiego jak kod C, możesz rozwidlić (), a następnie w dziecku wysłać do siebie SIGSTOP przed exec (), uniemożliwiając dalsze wykonanie.
Bardziej ogólnym rozwiązaniem (prawdopodobnie najlepszym) byłoby utworzenie kodu pośredniczącego, który to robi. Zatem program pośredniczący:
Zapewni to, że unikniesz jakichkolwiek warunków wyścigowych związanych z zbyt dużym wyprzedzeniem nowego przetwarzania, zanim będziesz mógł wysłać do niego sygnał.
Przykład dla powłoki:
I używając powyższego kodu:
jobs -l
Pokazuje PID. Ale jeśli robisz to z powłoki, nie potrzebujesz bezpośrednio PID. Możesz po prostu:kill -CONT %1
(zakładając, że masz tylko jedną pracę).Robisz to z więcej niż jedną pracą? Pozostawiono jako ćwiczenie dla czytelnika :)
źródło
Odpowiedź MikeyB jest poprawna. Od tego pytania na temat superużytkownika, oto bardziej zwięzła wersja:
Aby to zrozumieć, należy zrozumieć, w jaki sposób procesy są uruchamiane w
exec
systemie uniksowym: wywołanie systemowe zastępuje aktualnie działający program nowym , zachowując istniejący PID. Więc drodze niezależny proces jest tworzony jest pierwszyfork
, a następnieexec
, zastępując program uruchomiony w procesie potomnym z żądanego programu.Składniki tego polecenia powłoki to:
(...)
rozpoczynają podpowłokę: kolejne wystąpienie BASH.kill
Komenda wysyła sygnał STOP, aby ten proces, co stawia go w stanie zawieszenia.CONT
sygnał),exec
polecenie powoduje, że zamienia się ono na żądany program.my_command
zachowuje oryginalny PID podpowłoki.$!
zmiennej, aby uzyskać PID procesu.źródło
-s STOP
zamiast-SIGSTOP
). Wciąż zastanawiam się, dlaczego to musi być$BASHPID
zamiast$$
? (Może naprawdę nie rozumiem różnicy).$$
vs$BASHPID
sprawdzam, że ten ostatni to PID podpowłoki, a nie ten pierwszy. Jest zabawny problem: zastosowanie końcówki w skrypcie bash najczęściej kończy się niepowodzeniem, a ja muszę zrobić coś takiego:PID=$!; ps -p $PID; kill -s CONT $PID;
… kończy się niepowodzeniem, jeśli usunęps -p $PID
część: proces wydaje się zniknąć (zabity?) Bez nigdzie komunikatu o błędzie . Z interaktywnej powłoki jest OK, problem pochodzi tylko ze skryptu. To zbyt tajemnicze.$BASHPID
na pociski inne niż bash, zobacz tutaj