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ę exit
ponownie 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
exit
zabija zatrzymane zadania? - P: Czy istnieje sposób na wyjście z powłoki za pierwszym razem? (bez
exit
podwójnego wejścia )
Odpowiedzi:
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ą
jobs
wbudowanego polecenia w bash, prawdopodobnie także inne powłoki. Przykład:Możesz wznowić zatrzymane zadanie za pomocą
fg
wbudowanego 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 poleceniafg
. Jeśli zatrzymany jest tylko jeden program, możesz użyćfg
samego:W tym momencie powróciłeś do interpretera języka Python i możesz wyjść, używając control-D.
I odwrotnie, możesz
kill
użyć polecenia z jego specyfikacją zadania lub PID. Na przykład:Aby użyć specyfikacji zadania, poprzedź liczbę kluczem procentowym (%):
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ć
logout
polecenia, 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:
Możesz wznowić i zabić te zadania w taki sam sposób, jak te, które zostały zatrzymane z
Ctrl-z
przerwaniem.źródło
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
.Zatrzymany proces wznowi wykonywanie tylko wtedy, gdy zostanie wysłany
SIGCONT
sygnał. Można to osiągnąć przezfg
(lubfg ID
), który przeniesie zadanie na pierwszy plan, czyniąc go bieżącym,bg
kontynuując w tle lub wysyłającSIGCONT
sygnał (npkill -CONT [PID]
.).Za pierwszym razem, gdy wpiszesz
exit
/logout
lub 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ślicheckjobs
opcja jest włączona (shopt -s checkjobs
), może także wyświetlać listę zadań z ich statusami.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)
.źródło