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 dashobsługuje nawet kontrolę zadań (uruchamiany interaktywnie lub z -m).
Interaktywny
- Ctrl+ zzawiesi program, który jest obecnie wyświetlany
bgutworzy tło dla ostatnio zawieszonego programu
(użyj bg %2z numerem zadania, który możesz sprawdzić jobs)
fg ujawni ostatnio zawieszony program
W zshmożesz napisać powiązanie klucza, aby niejawnie uruchamiać się fgz 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ć bgzawieszenie, 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 %1Zamiast 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 sudopolecenia), 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
CONTSygnał do programu zatrzymana Ctrl+ z(a nie bg„d) wznowi swoje postępy (na pierwszym planie), tak samo jak gdybyś fgnim.
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 fgEnterwystarczy 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 STOPsygnał za pomocą nieinteraktywnych metod powyżej. To powinno zwolnić twój ekran (być może uderzył Enterkilka razy lub uruchom clearlub Ctrl+ L), abyś mógł następnie uruchomić jobsznaleźć deskryptor zadania, a następnie uruchomić fg %Ntam, gdzie Njest ta liczba.