Proces Linux w tle - ponowne logowanie - jak przywrócić proces na pierwszy plan?

4

Rozpoczynam proces, umieszczam go w tle, a następnie wylogowuję się, a następnie zaloguj ponownie i chcę ponownie uruchomić proces. Szukałem „ps aux” dla PID, ale nie zostanie on umieszczony na pierwszym planie za pomocą „fg ###”. Jaka jest właściwa droga?

(Używam tego samego konta do obu sesji logowania).

Jonny
źródło

Odpowiedzi:

10

Najczęstszym sposobem osiągnięcia tego jest prawdopodobnie ekran GNU .

Screen to pełnoekranowy menedżer okien, który multipleksuje fizyczny terminal między kilkoma procesami, zwykle interaktywnymi powłokami.

Zasadniczo będziesz:

  • Upewnij się, że screenjest zainstalowany. Zazwyczaj jest to pakiet screenw większości dystrybucji Linuksa. Jest instalowany domyślnie w systemie Mac OS X.
  • Wykonać screen

alternatywny tekst

alternatywny tekst

  • Uruchom program, który chcesz „w tle”. Na przykład zaczynam dostosowywać plik dziennika:

alternatywny tekst

  • Naciśnij, Ctl-a, daby odłączyć ekran.

  • Wyloguj się, rób inne rzeczy, co chcesz. Tutaj wyślę wiadomość do dziennika.

alternatywny tekst

  • Po ponownym zalogowaniu się wpisz, screen -raby ponownie dołączyć do sesji, którą wcześniej prowadziłeś. Tutaj możesz zobaczyć wiadomość, którą wysłałem do dziennika (oraz wcześniejszy test).

alternatywny tekst

Screen jest uważany przez wielu za narzędzie dla zaawansowanych użytkowników Linux / Unix i jestem skłonny się zgodzić!

Aby uzyskać więcej informacji o ekranie, zobacz jego stronę główną lub ten szczegółowy artykuł z Ars Technica .

jtimberman
źródło
4

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.

quack quixote
źródło