Jak mogę umieścić bieżący proces linux w tle? [Zamknięte]

111

Mam polecenie, które przesyła pliki za pomocą gita na zdalny serwer z powłoki Linux i zajmie to wiele godzin.

Jak mogę umieścić ten uruchomiony program w tle? Żebym nadal mógł pracować nad powłoką i ten proces również został zakończony?

Miraż
źródło
Zgaduję, ale czy próbowałeś ctrl + z lub uruchomić polecenie w ten sposób; #command &
EralpB
Polecenie już działa, więc nie mam innej opcji. Nie jestem pewien, którego polecenia spróbować. nie chciałem przerywać obecnego procesu, więc nie eksperymentowałem z nim
Mirage
Powinniśmy więc poczekać na bardziej profesjonalną odpowiedź :) Miałem na myśli, gdybyś miał szansę zacząć wszystko od nowa. (Polecenie i rzecz)
EralpB
Zaakceptowana osoba odpowiadająca na to pytanie wyjaśnia trzy kroki, które należy wykonać: stackoverflow.com/questions/625409/ ...
Leonard Saers
Możesz także po prostu otworzyć drugą instancję kitu i ponownie połączyć się z serwerem, aby uzyskać kolejną powłokę. Chociaż rozwiązanie z ctrl+zjest świetne.
Ela782

Odpowiedzi:

207

Wstrzymaj proces za pomocą CTRL + Z, a następnie użyj polecenia, bgaby wznowić go w tle. Na przykład:

sleep 60
^Z  #Suspend character shown after hitting CTRL+Z
[1]+  Stopped  sleep 60  #Message showing stopped process info
bg  #Resume current job (last job stopped)

Więcej o kontroli zadań i bgużyciu na bashstronie podręcznika:

KONTROLA ZADAŃ
Wpisanie znaku zawieszenia (zwykle ^ Z, Control-Z) podczas działania procesu powoduje zatrzymanie tego procesu i powrót sterowania do bash. [...] Użytkownik może następnie manipulować stanem tego zadania, używając polecenia bg, aby kontynuować je w tle, [...]. A ^ Z działa natychmiast i ma dodatkowy efekt uboczny polegający na odrzucaniu oczekującego wyjścia i typu naprzód.

bg [ jobspec ...]
Wznowienie zawieszonej każdej pracy jobspec w tle, jak gdyby zostały uruchomione z &. Jeśli nie ma specyfikacji zadania, używane jest pojęcie powłoki dotyczące bieżącego zadania .

EDYTOWAĆ

Aby rozpocząć proces, w którym można nawet zabić terminal, który nadal działa

nohup [command] [-args] > [filename] 2>&1 &

na przykład

nohup /home/edheal/myprog -arg1 -arg2 > /home/edheal/output.txt 2>&1 &

Aby po prostu zignorować dane wyjściowe (niezbyt mądre), zmień nazwę pliku na /dev/null

Aby komunikat o błędzie był ustawiony na inny plik, zmień &1go na nazwę pliku.

Ponadto: jobsPolecenie umożliwia wyświetlenie zindeksowanej listy procesów działających w tle. Proces działający w tle można zabić, uruchamiając go kill %1lub kill %2z numerem będącym indeksem procesu.

Ed Heal
źródło
próbowałem, ale jako coś wypisuje, ponownie pojawia się na pierwszym planie z% pokazującym, ile danych zostało przesłanych
Mirage
Proces zapisze dane wyjściowe na terminalu, zgodnie z poleceniem, aby zrobić to na początku. Będziesz musiał go ponownie uruchomić, aby uzyskać wyjście do zapisu do pliku lub /dev/null. Zobacz edycję powyżej.
Ed Heal
więc oznacza to, że jeśli proces już się rozpoczął, nie ma możliwości przekierowania wyjścia
Mirage
W rzeczy samej. Nie możesz wpływać na proces tylko na powłokę, z której jest uruchomiony. Możesz zrobić, kill -9 <pid of your shella wtedy proces będzie nadal działał, a dane wyjściowe zostaną wyrzucone - ale będziesz musiał zalogować się ponownie, aby uruchomić nową powłokę.
Ed Heal
Możesz również użyć disownpolecenia, jeśli chcesz wylogować się z sesji terminala i chcesz, aby nadal działało.
kirk roerig