Jak ustawić polecenie w tle, zamknąć terminal i przywrócić go do fg?

10

Próbuję dowiedzieć się, jak uruchomić polecenie w tle, a następnie przenieść je na pierwszy plan. Mam dość samouczków i odpowiedzi, w których ludzie twierdzą, że to proste, wystarczy dołączyć &na końcu polecenia, aby uruchomić go w tle. Działa tylko w jednym oknie terminala. Chcę umieścić polecenie w tle w jednym terminalu i przywrócić je na pierwszym planie po ponownym otwarciu terminalu

Przykład:

$ grunt &
$ jobs
$ [1]+  Running  grunt &

Oczywiście po zamknięciu terminalu nie znaleziono żadnej pracy.

Następny przykład:

$ grunt & disown #the same behavior has: $ setsid grunt &
$ jobs
$ [nothing] #but ps shows that grunt is working

after close terminal, grunt doesn't work

Co zrobiłem źle? Czy ktoś mógłby mi wyjaśnić, jak uruchomić polecenie w tle i przywrócić je na pierwszy plan.

Timur Fajzrakhmanov
źródło

Odpowiedzi:

11

Jest to niemożliwe tak, jak chcesz.

Przejrzyjmy kilka podstawowych pojęć:

  • Grupa procesów to zbiór powiązanych procesów, które wszystkie mogą być sygnalizowane jednocześnie.
  • Sesja to zbiór grup procesów, które są albo podłączone do pojedynczego urządzenia końcowego (znanego jako terminal sterujący), albo nie są podłączone do żadnego terminalu.

Jeśli zamkniesz terminal, wszystkie procesy w sesji są martwe, z wyjątkiem tych (demonów) związanych z procesem inicjowania. I nie ma sposobu, aby ponownie dać im terminal kontrolny.

Jednym słowem, reparenting procesu jest bardzo ograniczony w systemach POSIX (demonizacja jest wyjątkiem) i twoje wymagania nie mogą być spełnione.

sgx1
źródło
6
Technicznie jest to prawidłowa odpowiedź, ale uważam, że odwiedzający, którzy mają ten problem, znajdą „swoje rozwiązanie” w innych odpowiedziach dotyczących screen / byobu / tmux.
Programster
Masz rację .., ale z mojego punktu widzenia podstawowe pojęcia są ważniejsze, aby zrozumieć, że system działa lepiej i zrozumieć, co chcesz, a co źle. Dziękuję wam obu!
Timur Fayzrakhmanov
16
  1. Zainstaluj screen:

    sudo apt-get install screen
  2. Rozpocznij screen:

    screen -S session_name
  3. Wykonuj swoje polecenia, czego potrzebujesz.

  4. Odłącz screenod terminala (twoje polecenia będą nadal działać):

    Naciśnij CTRL+ a+d

  5. Zamknij terminal

  6. Otwórz inny terminal i podłącz ponownie ostatnią screensesję:

    screen -r

Aby uzyskać więcej informacji i dodatkowe opcje screenwyszukiwania man screen.

sokolnik
źródło
2
Screen lub byobu (szczególnie jeśli używasz Ubuntu). Byobu opiera się na ekranie, jeśli mam rację, ale uważam, że ma dodatkową funkcjonalność, która wydaje mi się przydatna i łatwiejsza w użyciu, ale to kwestia opinii.
Programster
Dziękuję dobrą sugestię! Może będzie to potrzebne w filmie!) Z Rosji z miłością <3
Timur Fayzrakhmanov
@Programster, tak, Byobu jest ex. ekran. Ma zarówno byobu-screen, jak i byobu-tmux.
user.dz
1
Polecam tmuxjako alternatywę dla screen.
gerrit
5

Czy próbowałeś: byobulub tmuxktóre są terminalowymi multiplekserami. Nie do końca to, czego szukasz, ale ma podobne zachowanie.

byobu-screen

Następnie uruchom polecenie, aby odłączyć:

byobu-screen -d

Aby wznowić:

byobu-screen -r

Zobacz https://help.ubuntu.com/community/Screen

user.dz
źródło
Te też +1.
sokolnik