Czy ktoś mógłby mi wyjaśnić różnicę między kill
i killall
? Dlaczego nie killall
widzi tego ps
, co pokazuje?
# ps aux |grep db2
root 1123 0.0 0.8 841300 33956 pts/1 Sl 11:48 0:00 db2wdog
db2inst1 1125 0.0 3.5 2879496 143616 pts/1 Sl 11:48 0:02 db2sysc
root 1126 0.0 0.6 579156 27840 pts/1 S 11:48 0:00 db2ckpwd
root 1127 0.0 0.6 579156 27828 pts/1 S 11:48 0:00 db2ckpwd
root 1128 0.0 0.6 579156 27828 pts/1 S 11:48 0:00 db2ckpwd
# killall db2ckpwd
db2ckpwd: no process found
# kill -9 1126
# kill -9 1127
# kill -9 1128
System to SuSe 11.3 (64-bitowy); jądro 2.6.34-12; procps wersja 3.2.8; killall z PSmisc 22.7; zabij z GNU coreutils 7.1
Odpowiedzi:
Czy to na Linuksie?
Istnieje rzeczywiście mało subtelnie różne wersje nazwy poleceń, które są wykorzystywane przez
ps
,killall
itdDwa główne warianty to: 1) długa nazwa polecenia, którą otrzymujesz po uruchomieniu
ps u
; oraz 2) krótka nazwa polecenia, którą otrzymujesz, gdy biegnieszps
bez żadnych flag.Prawdopodobnie największa różnica zdarza się, jeśli twój program jest skryptem powłoki lub czymkolwiek wymagającym interpretera, np. Python, Java itp.
Oto naprawdę trywialny skrypt, który pokazuje różnicę. Nazwałem to
mycat
:Po uruchomieniu, oto dwa różne typy
ps
.Po pierwsze bez
u
:Po drugie, z
u
:Zauważ, jak zaczyna się druga wersja
/bin/sh
?Teraz, o ile mogę powiedzieć,
killall
faktycznie czyta/proc/<pid>/stat
i chwyta drugie słowo pomiędzy parens jako nazwę polecenia, więc tak naprawdę musisz określić, kiedy biegnieszkillall
. Logicznie rzecz biorąc, powinno to być to samo, co napisaneps
bezu
flagi, ale dobrze byłoby sprawdzić.Rzeczy do sprawdzenia:
cat /proc/<pid>/stat
nazwa polecenia?ps -e | grep db2
nazwa polecenia?ps -e | grep db2
ips au | grep db2
pokazać tę samą nazwę polecenia?Notatki
Jeśli używasz także innych flag ps, możesz łatwiej użyć
ps -o comm
krótkiej nazwy ips -o cmd
długiej nazwy.Możesz także znaleźć
pkill
lepszą alternatywę. W szczególnościpkill -f
próbuje dopasować przy użyciu pełnej nazwy polecenia, tj. Nazwy polecenia wydrukowanej przezps u
lubps -o cmd
.źródło
ps -e |grep db2 gives me
3084? 00:00:00 db2syscr` i ps aux | grep db2 daje miroot 3084 0.0 0.6 579292 28304 ? S 13:02 0:00 db2ckpwd
. Mógłby to skomentować. Jestem trochę zagubiony.ls -l /proc/3084/exe
mówi Cowhich
lubwhence
lubtype
, aby znaleźć plik, a następniels
itype
zobaczyć czy jest to dowiązanie lub skrypt lub binarny?lrwxrwxrwx 1 root root 0 Jun 6 16:49 /proc/3084/exe -> /var/lib/db2/db2inst1/sqllib/adm/db2syscr
-r-sr-s--- 1 root db2iadm1 147K Feb 1 23:32 /var/lib/db2/db2inst1/sqllib/adm/db2syscr*
/var/lib/db2/db2inst1/sqllib/adm/db2syscr is /var/lib/db2/db2inst1/sqllib/adm/db2syscr
killall próbuje dopasować nazwę procesu (ale nie jest tak dobra w dopasowywanej części).
A ponieważ „ps | grep” i „ps | grep | kill” wykonują znacznie lepszą robotę, ktoś uprościł to i stworzył pgrep i pkill. Przeczytaj te polecenia, takie jak „ps grep” i „ps kill”, ponieważ to polecenie ps najpierw grep, a jeśli chcesz zabija.
źródło
Miałem podobny problem, ale
/proc/<pid>/stat
zawierałem oczekiwany ciąg. Korzystając ze strace, mogłem zobaczyć, że killall również miał dostęp/proc/<pid>/cmdline
.Kontynuowałem badanie za pomocą gdb, aby stwierdzić, że w moim przypadku nie udało się sprawdzić mojej komendy do pełnej komendy, w tym wszystkich znalezionych argumentów
/proc/<pid>/cmdline
. Wyglądało na to, że ta ścieżka kodu została uruchomiona, ponieważ nazwa pliku jest dłuższa niż 15 znaków (co jest zakodowaną wartością w źródle killall). Nie w pełni zbadałem, czy uda mi się w jakiś sposób zmusić go do współpracy z killall.Ale jak wspomniano w innych komentarzach, pkill jest lepszą alternatywą, która nie ma tych samych problemów.
Kod źródłowy
pkill
można znaleźć tutaj https://github.com/acg/psmisc dla zainteresowanych.źródło
W systemach Ubuntu 16 / proc / pid / stat będzie zawierał nazwę wątku (który program może wykonać poprzez wywołanie systemowe pthread_setname_np .
źródło