Są zatrzymane zadania (przy wyjściu z bash)


157

Dostaję ten komunikat, There are stopped jobs.gdy czasami próbuję wyjść z powłoki bash. Oto powtarzalny scenariusz w Pythonie 2.x:

  • ctrl+ cjest traktowany przez tłumacza jako wyjątek.
  • ctrl+ z„zatrzymuje” proces.
  • ctrl+ dwychodzi z Pythona dla reali.

Oto kilka rzeczywistych danych wyjściowych terminala:

example_user@example_server:~$ python
Python 2.7.3 (default, Sep 26 2013, 20:03:06) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 

ctrl+z

[1]+  Stopped                 python
example_user@example_server:~$ exit
logout
There are stopped jobs.

Bash nie wyszedł, muszę exitponownie wyjść z powłoki bash.

  • P: Co to jest „zatrzymana praca” lub co to oznacza?
  • P: Czy można wznowić zatrzymany proces?
  • P: Czy pierwszy exitzabija zatrzymane zadania?
  • P: Czy istnieje sposób na wyjście z powłoki za pierwszym razem? (bez exitpodwójnego wejścia )

ctrl + shift + \ spowoduje także zamknięcie Pythona.
ThorSummoner

Odpowiedzi:


205

Zatrzymane zadanie to takie, które zostało tymczasowo umieszczone w tle i nie jest już uruchomione, ale nadal korzysta z zasobów (tj. Pamięci systemowej). Ponieważ to zadanie nie jest dołączone do bieżącego terminala, nie może generować danych wyjściowych i nie otrzymuje danych wejściowych od użytkownika.

Możesz zobaczyć zadania uruchomione za pomocą jobswbudowanego polecenia w bash, prawdopodobnie także inne powłoki. Przykład:

user@mysystem:~$ jobs
[1] + Stopped                python
user@mysystem:~$ 

Możesz wznowić zatrzymane zadanie za pomocą fgwbudowanego polecenia bash (pierwszego planu). Jeśli masz wiele zatrzymanych poleceń, musisz określić, które z nich należy wznowić, podając numer wiersza zadania w wierszu polecenia fg. Jeśli zatrzymany jest tylko jeden program, możesz użyć fgsamego:

user@mysystem:~$ fg 1
python

W tym momencie powróciłeś do interpretera języka Python i możesz wyjść, używając control-D.

I odwrotnie, możesz killużyć polecenia z jego specyfikacją zadania lub PID. Na przykład:

user@mysystem:~$ ps
  PID TTY          TIME CMD
16174 pts/3    00:00:00 bash
17781 pts/3    00:00:00 python
18276 pts/3    00:00:00 ps
user@mysystem:~$ kill 17781
[1]+  Killed                  python
user@mysystem:~$ 

Aby użyć specyfikacji zadania, poprzedź liczbę kluczem procentowym (%):

user@mysystem:~$ kill %1
[1]+  Terminated              python

Jeśli wydasz polecenie wyjścia z zatrzymanymi zadaniami, zostanie wyświetlone ostrzeżenie. Zadania pozostaną uruchomione dla bezpieczeństwa. Ma to na celu upewnienie się, że próbujesz zabić zlecenia, o których mogłeś zapomnieć, że przestałeś. Przy drugim użyciu polecenia exit zadania zostają zakończone i powłoka zostaje zamknięta. Może to powodować problemy dla niektórych programów, które nie są przeznaczone do zabijania w ten sposób.

W bash wydaje się, że możesz użyć logoutpolecenia, które zabije zatrzymane procesy i zakończy działanie. Może to powodować niepożądane wyniki.

Należy również pamiętać, że niektóre programy mogą nie wyjść po zakończeniu w ten sposób, a twój system może skończyć się wieloma osieroconymi procesami zużywającymi zasoby, jeśli nauczysz się tego robić.

Pamiętaj, że możesz utworzyć proces w tle, który zatrzyma się, jeśli będą wymagały danych wejściowych użytkownika:

user@mysystem:~$ python &
[1] 19028
user@mysystem:~$ jobs
[1]+  Stopped                 python

Możesz wznowić i zabić te zadania w taki sam sposób, jak te, które zostały zatrzymane z Ctrl-zprzerwaniem.


4
Kłóciłbym się z twoim drugim zdaniem. Powinien powiedzieć: „Ponieważ zadanie jest zatrzymane , nie może podjąć żadnych działań - we / wy pliku, we / wy sieci, we / wy terminala ani żadnego innego przetwarzania”
Scott,

2
To mi bardzo pomaga.
shellbye

Doskonały post świetna pomoc dla każdego!
George Udosen,

18

P: Co to jest „zatrzymana praca” lub co to oznacza?

Zadanie zatrzymane oznacza proces, który odebrał sygnał zatrzymania ( SIGSTOP/ SIGTSTP) z klawiatury (znak zawieszenia Ctrl-Z), polecenia (np. kill -STOP [PID]) Lub innego procesu (np. Jądro, gdy w systemie brakuje zasobów) i jest w stanie wstrzymanym, więc informuje system o zatrzymaniu / zawieszeniu proces, więc nie wykona żadnego wykonania / przetwarzania.

Aktywne zadania powłoki mogą być wymienione przez: jobs.

P: Czy można wznowić zatrzymany proces?

Zatrzymany proces wznowi wykonywanie tylko wtedy, gdy zostanie wysłany SIGCONTsygnał. Można to osiągnąć przez fg(lub fg ID), który przeniesie zadanie na pierwszy plan, czyniąc go bieżącym, bgkontynuując w tle lub wysyłając SIGCONTsygnał (np kill -CONT [PID].).

P: Czy pierwsze wyjście zabija zatrzymane zadania?

Za pierwszym razem, gdy wpiszesz exit/ logoutlub naciśniesz Ctrl-D, powłoka wypisuje ostrzeżenie o bieżących aktywnych zadaniach, które są powiązane z twoim terminalem, dlatego nie zabije ich bez twojego pozwolenia, potwierdzając akcję po raz drugi. Jeśli checkjobsopcja jest włączona ( shopt -s checkjobs), może także wyświetlać listę zadań z ich statusami.

P: Czy istnieje sposób na wyjście z powłoki za pierwszym razem? (bez dwukrotnego wchodzenia do wyjścia)

Możesz nacisnąć Ctrl+Ddwukrotnie lub przytrzymać dłużej, spowoduje to, że powłoka będzie cicho szybko zabijać bieżące zatrzymane / uruchomione zadania shel.

Alternatywnie wyprzeć je ( disown), aby je zostawić lub zabić je ręcznie: kill $(jobs -p).

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.