Gdy próbuję wyjść z mojego serwera Linux, pojawia się komunikat:
Są zatrzymane prace.
: Czy istnieje jedno polecenie, aby je zabić?
shopt -s checkjobs
mój .bashrc
Gdy próbuję wyjść z mojego serwera Linux, pojawia się komunikat:
Są zatrzymane prace.
: Czy istnieje jedno polecenie, aby je zabić?
shopt -s checkjobs
mój .bashrc
Odpowiedzi:
Aby szybko zabić wszystkie zatrzymane zadania w ramach bash, wpisz:
kill -9 `jobs -ps`
jobs -ps
wyświetla identyfikatory procesów ( -p
) zatrzymanych ( -s
) zadań.
kill -9 `jobs -ps`
wysyła do wszystkich sygnały SIGKILL.
sudo kill `jobs -p`
nie działało, ale wyraźnie wpisało się PID.
kill
takie jak to nic nie zrobi, ponieważ procesy są zatrzymane, nie będą przetwarzać SIGTERM (-15), który jest do nich domyślnie wysyłany.
Spróbuj wpisać to:
kill -9 $(jobs -p)
Przyjęta odpowiedź zabiłaby wszystkie zadania (co w tym przypadku jest wystarczające), a nie tylko te zatrzymane. Jeśli chcesz zabić tylko tych Zatrzymanych, uruchom:
kill $(jobs -l | grep Stopped | cut -d' ' -f3)
awk '/Stopped/{print $3}')
-s
argumentem na przyjętych filtrów odpowiedział, tylko zatrzymany jedynek
Najłatwiej jest po prostu natychmiast spróbować ponownie wyjść; bash
oznacza to „zabij wszystkie zatrzymane zadania i wyjdź”.
for x in `jobs -p` ; do kill -9 $x ; done
Na wypadek, gdyby to pomogło komuś innemu - większość ludzi jest tutaj, ponieważ mają zatrzymane procesy, które uruchomili, być może w tle za pośrednictwem powłoki. Musiałem znaleźć procesy, jako root, zatrzymane przez innych użytkowników, dla których warianty jobs
polecenia nie będą działać.
Trochę grzebania w tym man ps
doprowadziło mnie do tego:
ps -a -o pid,user,cmd,state | grep 'T$'
Objaśnienie: -a
flaga mówi: pokaż wszystkie procesy, a następnie -o
kontroluje dane wyjściowe, jakie informacje będą wyświetlane o każdym procesie. Mam wyboru pid
, user
, cmd
(wiersz poleceń) i state
, co jest stan procesu .
Od man ps
:
PROCESS STATE CODES
Here are the different values that the s, stat and state output specifiers (header "STAT" or "S") will display to describe the
state of a process:
D uninterruptible sleep (usually IO)
R running or runnable (on run queue)
S interruptible sleep (waiting for an event to complete)
T stopped, either by a job control signal or because it is being traced
W paging (not valid since the 2.6.xx kernel)
X dead (should never be seen)
Z defunct ("zombie") process, terminated but not reaped by its parent
więc w końcu przesyłam do niego, grep T$
co mówi: pokaż mi wszystkie procesy, które mają T w ostatniej kolumnie.
A potem mam ładną listę wszystkich procesów od różnych użytkowników, którzy są w stanie zatrzymania.
$ ps -a -o pid,user,cmd,state | grep 'T$'
865 joson74+ python T
885 joson74+ sh -c less T
886 joson74+ less T
1014 minames+ python3.4 -i /home/minames T
5352 MooKo nano stdio.h T
7851 harry tmux attach T
12083 harry tmux attach T
13495 gorylla+ python3.4 -i /home/gorylla1 T
18009 conr1d vim T
19664 enythin+ python T
24906 wardlist python T
jobs -ps
jest prostsze niż ta odpowiedź. To powiedziawszy, ta odpowiedź nie pokazuje tylko zadań zatrzymanych za pośrednictwem Ctrl-Z
powłoki, ale wszystkich zatrzymanych zadań: innych powłok, innych użytkowników , w tym zadań debugowanych (np. Przez gdb).
ps -el | grep T
aby znaleźć procesy w stanie „T”.
Jeśli chcesz usunąć niektóre zatrzymane zadania, ale nie wszystkie, spróbuj tego:
Po pierwsze, wypisz listę zadań, otrzymasz coś takiego:
$ jobs -l
[2] 4813 Stopped ./parse < call.txt
[3]- 4819 Stopped ./parse < call.txt
wyślij kill do zatrzymanego zadania, nie zrobi nic poza kolejką niż wprowadzi go na pierwszy plan, zakończy działanie
$ fg %2
./parse < call.txt
Terminated
$ jobs -l
[3]- 4819 Stopped ./parse < call.txt
Zwykle jeśli otrzymasz tę wiadomość, musisz się dwukrotnie wylogować. Np. Najpierw Ctrl+Dwyświetla komunikat ostrzegawczy informujący o zatrzymanych zadaniach, naciśnięcie po raz drugi wyloguje cię z zabicia zleceń. To samo dotyczy poleceń logout
i exit
poleceń.
Aby je zabić ręcznie, spróbuj: kill $(jobs -p)
.
Jeśli nie chcesz zabijać zadań z bieżącej powłoki, możesz usunąć je z tabeli aktywnych zadań bez zabijania za pomocą disown
polecenia. Na przykład
$ sleep 1000 &
[1] 19404
$ jobs
[1]+ Running sleep 1000 &
$ disown
Zatrzymana praca może być także określana przez stan procesu ( T
znaków), co oznacza, że proces zatrzymano za pomocą sygnału, takich jak SIGSTOP
, SIGTSTP
lub inne (np SIGTTIN
lub SIGTTOU
).
W przypadku, gdy jobs
wbudowane polecenie powłoki nie jest dostępne, zatrzymane procesy można wyświetlić za pomocą następującego polecenia:
ps wuax | awk '$8 ~ "T"'
Aby zabić ich wszystkich, możesz w zasadzie wpisać:
kill -9 $(ps wuax | awk 'NR>1 && $8 ~ "T" {print $2}')
Oto prosty test:
$ sleep 1000 &
[1] 2014
$ sleep 1000 &
[2] 2015
$ sleep 1000 &
[3] 2016
$ sleep 1000 &
[4] 2017
$ killall -STOP sleep
[1] Stopped sleep 1000
[2] Stopped sleep 1000
[3] Stopped sleep 1000
[4] Stopped sleep 1000
$ ps wuax | awk '$8 ~ "T"'
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
vagrant 2014 0.0 0.0 7228 832 pts/0 T 20:38 0:00 sleep 1000
vagrant 2015 0.0 0.0 7228 708 pts/0 T 20:38 0:00 sleep 1000
vagrant 2016 0.0 0.0 7228 760 pts/0 T 20:38 0:00 sleep 1000
vagrant 2017 0.0 0.0 7228 828 pts/0 T 20:38 0:00 sleep 1000
$ kill -9 $(awk 'NR>1 && $8 ~ "T" {print $2}' <(ps wuax))
$ jobs
[1] Killed sleep 1000
[2] Killed sleep 1000
[3] Killed sleep 1000
[4] Killed sleep 1000