Powinno 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
- Ctrl+ zzawiesi program, który jest obecnie wyświetlany
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 program
W zsh
możesz napisać powiązanie klucza, aby niejawnie uruchamiać się fg
z wiersza polecenia za pomocą innego znaku Ctrl+ z:
_zsh_cli_fg() { fg; }
zle -N _zsh_cli_fg
bindkey '^Z' _zsh_cli_fg
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
Zamiast bg
, 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 …
, lub ps aux |grep …
(lub z tej samej powłoki jobs -l
, lub $!
), a następnie możesz uruchomić:
kill -STOP $PID # suspend
kill -CONT $PID # continue (resume)
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:
killall -STOP program_name
pkill -STOP program_name
pkill -f -STOP program_name_or_args
CONT
Sygnał do programu zatrzymana Ctrl+ z(a nie bg
„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:
Proces wysyła dane do stderr, więc jak mam wydać polecenie, fg <jobid>
gdy proces wysyła dane do terminala?
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 uruchom clear
lub Ctrl+ L), abyś mógł następnie uruchomić jobs
znaleźć deskryptor zadania, a następnie uruchomić fg %N
tam, gdzie N
jest ta liczba.