AFAIK nie ma bezpośredniego sposobu na wykrycie procesu, który został uruchomiony i umieszczony w tle w innej powłoce. Istnieje jednak kilka sposobów na obejście tego.
Najlepszym sposobem jest użycie ekranu GNU . Rozpocznij sesję ekranu, rozpocznij proces, odłącz się od sesji ekranu, wyloguj się, zaloguj ponownie, ponownie podłącz do sesji ekranu. Proces jest nadal uruchomiony, a screen przechowuje dane wyjściowe w buforach okien. Nie musisz nawet tworzyć tła; możesz pozostawić go uruchomionym w jednym oknie ekranu i używać innych do innych zadań.
Brzydkim, hackerskim sposobem jest odłączenie go od terminala przed wylogowaniem. W bash disown -h %[jobid]
robi to; inne powłoki, takie jak tcsh, robią to automatycznie dla procesów w tle po wyjściu z powłoki. (Get $[jobid]
uruchamiając komendę jobs
.) Nie można ponownie podłączyć do procesu bezpośrednio, ale jeśli wszystko czego potrzebujesz to proces za stdout / stderr / stdin, to można użyć GDB do podróbkę doczepić. To jest częściowa instrukcja z tego źródła (pierwotnie zawarta w innej odpowiedzi ):
[...] przy niektórych brudnych włamaniach ponowne otwarcie procesu „stdout / stderr / stdin” nie jest niemożliwe.
Więc nadal możesz utworzyć puste okno (na przykład, które uruchamia tryb uśpienia).
A następnie użyj na przykład gdb, aby dołączyć do procesu, wykonaj kilka połączeń close (0)
call close (1)
call close (2)
call open ("/ dev / pts / xx", ...)
call dup (0)
zadzwoń dup (0)
odłącz
Dane wyjściowe procesu przejdą na ekran. Nie byłby dołączony do tego terminalu ekranowego, więc na przykład [sic] zabiłby polecenie „uśpienia”, a nie proces, ale to może wystarczyć dla OP.
Istnieje kilka sposobów dokonywania automatycznych bash nie wypiera , ale dotyczą one shopts lub nohup lub innych sztuczek bash, aby uniknąć automatycznego SIGHUP. bash nie jest tak pełen wdzięku jak tcsh w tym obszarze i musisz wiedzieć z wyprzedzeniem, że będziesz potrzebować tego, aby ustawić opcję. Nieco łatwiej jest pamiętać, aby uruchomić disown w zadaniu w tle przed wyjściem.