Mam proces pierwotnie uruchomiony na pierwszym planie. Zawiesiłem przez Ctrl+ Z, a następnie wznowiłem jego działanie w tle przez bg <jobid>
.
Zastanawiam się, jak zawiesić proces działający w tle?
Jak mogę przenieść proces tła na pierwszy plan?
Edytować:
Proces wysyła dane do stderr, więc jak mam wydać polecenie, fg <jobid>
gdy proces wysyła dane do terminala?
fg <jobid>
aby zrobić to na pierwszym planie?Odpowiedzi:
Jak powiedział Tim, wpisz,
fg
aby sprowadzić ostatni proces z powrotem na pierwszy plan.Jeśli w tle działa więcej niż jeden proces, wykonaj następujące czynności:
fg %3
abyvim 23
proces ten powrócił na pierwszy plan.Aby zawiesić proces działający w tle, użyj:
Sygnał SIGSTOP zatrzymuje (zatrzymuje) proces w zasadzie w taki sam sposób, jak Ctrl+ Z.
Przykład:
kill -STOP %3
.źródła: Jak wysyłać sygnały do procesów w Linuksie i Uniksie oraz Jak zarządzać zadaniami w tle i na pierwszym planie .
źródło
SIGCONT
dla mnie; I tak używamkill -STOP
ikill -CONT
wolę zapamiętywać liczby, ale możesz sprawdzić,kill -l
aby przypomnieć sobie o wartościach liczbowychjob
ifg <jobid>
kiedy proces wysyła dane do terminala?kill -STOP %job_id
jak wyjaśnionoPowinno to dotyczyć każdej powłoki z kontrolą zadań, którą (w przeważającej części) możesz brać za pewnik, chyba że masz do czynienia z naprawdę starożytną powłoką. Jest w standardzie POSIX , więc
dash
obsługuje nawet kontrolę zadań (uruchamiany interaktywnie lub z-m
).Interaktywny
bg
utworzy tło dla ostatnio zawieszonego programu(użyj
bg %2
z numerem zadania, który możesz sprawdzićjobs
)fg
ujawni ostatnio zawieszony programW
zsh
możesz napisać powiązanie klucza, aby niejawnie uruchamiać sięfg
z wiersza polecenia za pomocą innego znaku Ctrl+ z:Prawdopodobnie istnieje również sprytny sposób, aby pośrednio uruchomić
bg
zawieszenie, ale wydaje się to nierozsądne; przynajmniej dla mnie większość mojego Ctrl+ zużycia wynika z tego, że Ctrl+ cnie wybucha; Chcę podążać za tym np.kill %1
Zamiastbg
, a na pewno nie chcę domyślnie zabijać! (Ta logika rozciąga się również na to, dlaczego nie używam już tego powiązania klawiszy: jeśli wbijam Ctrl+, zaby zatrzymać proces, ostatnią rzeczą, którą chcę, to wznowienie!)Nieinteraktywny
Jeśli jesteś w innej instancji powłoki (lub innym użytkowniku, czasem zawierającym
sudo
polecenia), prawdopodobnie nie będziesz mógł używać numerów zadań.Nadal możesz działać na innym procesie, gdy znasz jego identyfikator procesu (PID). Możesz uzyskać PID za pomocą
pgrep …
, lubps aux |grep …
(lub z tej samej powłokijobs -l
, lub$!
), a następnie możesz uruchomić:Jeśli nie znasz identyfikatora procesu i nie martwisz się zawieszeniem innych instancji procesu według nazwy, możesz przekazać sygnały do jednego z tych:
CONT
Sygnał do programu zatrzymana Ctrl+ z(a niebg
„d) wznowi swoje postępy (na pierwszym planie), tak samo jak gdybyśfg
nim.Odp: Błąd standardowy
Edycja tego pytania dotyczy standardowego błędu:
O ile dane zadanie nie zawiera składników, które są w tle (lub całe zadanie jest w tle, być może za pośrednictwem
kill -CONT
), tak naprawdę nie powinieneś widzieć wyjścia, gdy jest zawieszone.Jeśli nadal wyprowadza dane (czy to na standardowe wyjście, czy na standardowy błąd), z pewnością spowoduje to, że twój terminal będzie zaśmiecony wizualnie, ale wszystkie te dane wyjściowe zostaną zignorowane, ponieważ nie są częścią twojego wejścia. Może to utrudnić stwierdzenie, że nie wprowadzono żadnych literówek, ale
fg
Enterwystarczy wpisać (na ślepo) (chyba, że masz wiele zadań, a to, o którym mowa, nie jest najnowsze, w takim przypadku rzeczywiście potrzebujesz deskryptora zadania ).Jeśli potrzebujesz znaleźć deskryptor zadania, użyj innego terminala, aby wysłać mu
STOP
sygnał za pomocą nieinteraktywnych metod powyżej. To powinno zwolnić twój ekran (być może uderzył Enterkilka razy lub uruchomclear
lub Ctrl+ L), abyś mógł następnie uruchomićjobs
znaleźć deskryptor zadania, a następnie uruchomićfg %N
tam, gdzieN
jest ta liczba.źródło
CONT
sygnał do procesu (zadanie / potok) zatrzymanego za pomocą Ctrl + Z, wznowi się w tle, nawet jeśli go nie zrobiłeśbg
.Wpisz,
fg
aby przenieść go na pierwszy plan.źródło
fg <jobid>
gdy proces wysyła dane do terminala?jobs
poleceniafg
; na przykład:fg %4
CTRL Z
aby zawiesićbg %4
źródło
Zakończenie procesu można wykonać na kilka różnych sposobów. Często po wydaniu polecenia opartego na konsoli wysłanie Ctrlcnaciśnięcia klawisza (domyślny znak przerwania) spowoduje wyjście z polecenia. Działa to, gdy proces działa w trybie pierwszego planu.
Jeśli proces działa w tle, najpierw musisz uzyskać jego identyfikator zadania za pomocą
ps
polecenia, a następnie możesz użyć polecenia kill, aby zabić proces w następujący sposób:Tutaj
kill
polecenie zakończyfirst_one
proces. Jeśli proces ignoruje zwykłekill
polecenie, możesz użyćkill -9
identyfikatora procesu w następujący sposób:źródło