Jak mogę zamknąć terminal bez zabijania jego dzieci (bez uprzedniego uruchomienia `screen`)?

35

czasami uruchamiam aplikację na terminalu gnome, ale potem nagle muszę ponownie uruchomić gnome lub coś w tym rodzaju. Wydaje mi się, że odpowiedź na pytanie jest również przydatna, więc chcę odłączyć się od SSH, w którym coś się dzieje.

Drzewo terminali Gnome wygląda następująco:

gnome-terminal
    bash
        some-boring-process

Nie mogę odłączyć " bashod gnome-terminal(lub odłączyć some-boring-processod bash i przekierowanie jej gdzieś wyjściowego)? Jeśli tylko zabiję gnome-terminal, zabiją mnie bashwszystkie podprocesy

valya
źródło

Odpowiedzi:

48

Jeśli some-boring-processtrwa bieżąca sesja bash:

  1. zatrzymaj to, ctrl-zaby dać ci monit bash
  2. umieść to w tle za pomocą bg
  3. zanotuj numer zadania lub użyj jobspolecenia
  4. odłącz proces od tej sesji bash za pomocą disown -h %1(zamień tam rzeczywisty numer zadania).

To nie robi nic, aby przekierować wyjście - musisz o tym pomyśleć po uruchomieniu nudnego procesu. [Edytuj] Wydaje się, że istnieje sposób na przekierowanie go https://gist.github.com/782263

Ale poważnie, spójrz na ekran. Mam powłoki na zdalnym serwerze, które działają od miesięcy.

Glenn Jackman
źródło
Dziękuję Ci. Wybrałem twoją odpowiedź, ponieważ była to jedyna odpowiedź na pytanie (dotyczyła już uruchomionego procesu). screenCzasami już używam , chociaż ma to swoje problemy i nie chcę go używać do każdej sesji bash w moim życiu
valya
Nie używasz go do każdej sesji bash, ale do każdej zdalnej maszyny, na której spędzasz dużo czasu.
glenn jackman
Pozwoliłem sobie na dodanie informacji o przekierowaniu wyjścia, proszę przejrzyj je!
valya
[root @ server ~] # bg -bash: bg: current: brak takiej pracy
Muhammad Dyas Yaskur
Dlaczego mam bash: bg: current: no such job?
Muhammad Dyas Yaskur
10

Właśnie do tego stworzono screen i tmux . Uruchamiasz powłokę w sesji screen / tmux i możesz dowolnie rozłączać / łączyć się ponownie. Możesz również mieć wiele sesji powłoki uruchomionych w jednym terminalu gnome.

jsbillings
źródło
Dzięki, ale jak skomentowałem przyjętą odpowiedź: 1. pytanie dotyczyło już uruchomionego procesu. 2. screenma swoje problemy i nie mam ochoty używać go do każdej sesji bash w moim życiu
valya
6

screen, tmuxlub dtach(prawdopodobnie z dvtm) są do tego świetne, ale jeśli jest to coś, w którym nie pomyślałeś o użyciu jednego z nich, możesz być w stanie wykorzystać nohup.

Hank Gay
źródło
Dzięki, ale jak skomentowałem przyjętą odpowiedź: 1. pytanie dotyczyło już uruchomionego procesu. 2. screenma swoje problemy i nie mam ochoty używać go do każdej sesji bash w moim życiu
valya
@valya Cieszę się, że znalazłeś rozwiązanie. Jednak dla jasności, nohupdziała on na działającym procesie przy użyciu -popcji (jeśli jest dostępna).
Hank Gay
@Hank Gay: Nie widzę -popcji na nohupstronach podręcznika; na jakim systemie jesteś?
Mikel
@Mikel Zanim nauczyłem się przestać martwić i pokochałem tmux, skorzystałem z -popcji na pudełku Solaris. Mam również niejasne wspomnienia z robienia tego na pudełku CentOS kundla (być może zshma wbudowaną, która to obsługuje?), Ale nie mogę znaleźć żadnych dokumentów na ten temat.
Hank Gay
@Hank Gay: Ani bash, ani zshw moim systemie Ubuntu Linux dostarczyć nohup.
Mikel
4

Jeśli chcesz nadal wchodzić w interakcje z procesem potomnym, a nie tylko tworzyć jego tło i kontynuować, istnieje program o nazwie retty, który jest dowodem koncepcji „kradzieży” procesu z jego bieżącego tty i ponownego przyłączenia go do obecny.

Robi to jednak okropne rzeczy, w tym przyklejenie kodu asemblera do stosu ponownie dołączonej aplikacji. I ten kod nie został zaktualizowany dla x86_64.

Istnieje inny program, który może być lepszym rozwiązaniem, zamrażając proces w przestrzeni użytkownika do pliku, z którego można go później przywrócić (być może na innym tty). To jest kriopid , a ten projekt również wydaje się być zatrzymany w faza weryfikacji koncepcji i nie działa z nowoczesnym Linuksem w obecnym kodzie. Ach tak.

Pomyślałem, że to powinno być tutaj dla kompletności. Jeśli nie masz nic przeciwko uciekaniu się do okropnego voodoo, jest to możliwe - przynajmniej teoretyczna.

mattdm
źródło
1
to przypomina mi gist.github.com/782263 ... och, ta treść wydaje się również odpowiadać na moje pytanie
valya
2

Jeśli odpalę coś, co chcę zakończyć bez względu na wszystko (poza ponownym uruchomieniem systemu), używam go nohupi uruchamiam w tle. W przeciwieństwie do ekranu i podobnych nie można ponownie podłączyć się do procesów. Jednak blokowanie przekierowania w innym miejscu można znaleźć w dowolnym pliku wyjściowym nohup.out.

Używam, screengdy chcę być w stanie przełączać terminale dla procesu. Takich jak rozpoczęcie procesu od domu / pracy i przejście do drugiego. Jak każda inna sesja wyjściowa, wynik ostatecznie przewinie górną część bufora.

EDYCJA: Jeśli proces został już uruchomiony, możesz disowngo zablokować, aby zapobiec HUPwysyłaniu sygnału po zamknięciu procesu.

BillThor
źródło
Dzięki, ale jak skomentowałem przyjętą odpowiedź: 1. pytanie dotyczyło już uruchomionego procesu. 2. screenma swoje problemy i nie mam ochoty używać go do każdej sesji bash w moim życiu
valya
@valya Widziałem odniesienia do odłączania działającego procesu od grupy programów. Nie znam jednak żadnych narzędzi. Narzędzie prawdopodobnie musiałoby również przekierować standardowe kanały IO. Myślę, że raz mogłem go uruchomić, ale zdecydowałem, że nie ma nic prostszego.
BillThor
1

Możesz sprawić, aby proces (PID) nie odbierał sygnału HUP po zakończeniu sesji terminala. Użyj następującego polecenia:

nohup -p PID
Tony
źródło
nohup: invalid option -- 'p'. Jakiej wersji nohupużywasz na jakim systemie?
Anthon
Najczęściej używam Solaris i AIX. W systemie Linux powinieneś sprawdzić polecenie disown.
Tony
Tak, nie ma -popcji w Linuksie, więc ta odpowiedź jest specyficzna dla Solaris i AIX.
Warto
1

Ten skrypt odłącza proces potomny od rodzica i przypisuje go do procesu inicjowania :

toDetach=$1

./$toDetach & # Runs the process - script on background

disown -h %$(jobs -l | grep $(ps -A | grep $toDetach | cut --delimiter=' ' -f1) | cut --delimiter=' ' -f1 | tr -d '[]+') # and then disowns it from parents process
mark_infinite
źródło