欧美一区2区三区4区公司二百,国产精品婷婷午夜在线观看,自拍偷拍亚洲精品,国产美女诱惑一区二区

歡迎來到云服務器

系統配置

killall,pidof和pkill命令的區別

總結1 :盡量避免使用 killall、pgrep 、ps | xargs kill 的方式

總計2 :盡量使用 pidof 或者 pidof | xargs kill 的組合來代替上面的幾個命令

平常大家 kill 進程,可能習慣使用如下的方式

1

killall bt_uinfo_memcached

1

ps -C bt_uinfo_memcached --format='pid' --noheaders | xargs kill

大部分情況下這個都是可以正常工作的,但我們來看一下下面的這個命令


[email protected]:~

root 8765 23103 0 14:13 pts/2 00:00:00 grep --color=auto bt_uinfo_memcached

root 26195 1 0 12:43 ? 00:00:32 ./bt_uinfo_memcached -p 20211 -u root -l 0.0.0.0 -m 3072 -d

root 26236 1 0 12:43 ? 00:00:30 ./bt_uinfo_memcached -p 20311 -u root -l 0.0.0.0 -m 3072 -d

root 26586 1 1 12:43 ? 00:01:15 ./bt_uinfo_memcached -p 20411 -u root -l 0.0.0.0 -m 3072 -d

[email protected]:~


[email protected]:~

bt_uinfo_memcached: no process found

[email protected]:~

killall 命令竟然找不到 bt_uinfo_memcached 進程? 上面 ps 命令是列出來了的 。換 pkill 試試,還是不行


[email protected]:~

[email protected]:~

[email protected]:~

root 17723 23103 0 14:19 pts/2 00:00:00 grep --color=auto bt_uinfo_memcached

root 26195 1 0 12:43 ? 00:00:36 ./bt_uinfo_memcached -p 20211 -u root -l 0.0.0.0 -m 3072 -d

root 26236 1 0 12:43 ? 00:00:34 ./bt_uinfo_memcached -p 20311 -u root -l 0.0.0.0 -m 3072 -d

root 26586 1 1 12:43 ? 00:01:22 ./bt_uinfo_memcached -p 20411 -u root -l 0.0.0.0 -m 3072 -d

[email protected]:~

甚至連 ps 也有問題,當 -C(command) 選項的參數值超過15個字符時,實際上是會匹配到其他的進程


[email protected]:~$ ps -C bt_uinfo_memcachecd

PID TTY TIME CMD

26195 ? 00:01:44 bt_uinfo_memcac

26236 ? 00:01:41 bt_uinfo_memcac

26586 ? 00:03:23 bt_uinfo_memcac

[email protected]:~$ ps -C bt_uinfo_memcachecd123456

PID TTY TIME CMD

26195 ? 00:01:44 bt_uinfo_memcac

26236 ? 00:01:41 bt_uinfo_memcac

26586 ? 00:03:23 bt_uinfo_memcac

[email protected]:~$

為什么會這樣呢? 通過 strace 命令可以找到原因


[email protected]:~

open("/proc/31713/status", O_RDONLY) = 4

open("/proc/31713/cmdline", O_RDONLY) = 4

open("/proc/31716/status", O_RDONLY) = 4

open("/proc/31716/cmdline", O_RDONLY) = 4

open("/proc/31717/status", O_RDONLY) = 4

open("/proc/31717/cmdline", O_RDONLY) = 4

open("/proc/31720/status", O_RDONLY) = 4

open("/proc/31720/cmdline", O_RDONLY) = 4

open("/proc/31721/status", O_RDONLY) = 4

open("/proc/31721/cmdline", O_RDONLY) = 4

[email protected]:~

pkill 命令檢查的是 /proc/ 下面的 pid 目錄的 cmdline 文件和 status 文件。我們找其中一個 bt_uinfo_memcached 進程 ( 26195 ) 看一下,


[email protected]:~

./bt_uinfo_memcached -p 20211 -u root -l 0.0.0.0 -m 3072 -d [email protected]:~

[email protected]:~

[email protected]:~

Name: bt_uinfo_memcac

State: S (sleeping)

.....

可以看到 cmdline 是記錄完整命令行的 (pgrep 默認是部分匹配),而 status 這個文件里面的 Name 字段的值是 bt_uinfo_memcac 而不是 bt_uinfo_memcached ,也就是被截斷了(15個字符,OS 的限制) !!!
雖然 cmdline 文件里面記錄的命令是正確的,但我估計 pgrep 會對比 cmdline 第一個字段和 status 文件的 Name 字段的值是否相同,如果不同則跳過,所以雖然 cmdline 是對的,但 pkill 并不殺死該進程
下面再來看 killall 命令的


[email protected]:~$ strace -e trace=file killall bt_uinfo_memcached 2>&1 | grep open | tail

open("/proc/31705/stat", O_RDONLY) = 3

open("/proc/31708/stat", O_RDONLY) = 3

open("/proc/31709/stat", O_RDONLY) = 3

open("/proc/31712/stat", O_RDONLY) = 3

open("/proc/31713/stat", O_RDONLY) = 3

open("/proc/31716/stat", O_RDONLY) = 3

open("/proc/31717/stat", O_RDONLY) = 3

open("/proc/31720/stat", O_RDONLY) = 3

open("/proc/31721/stat", O_RDONLY) = 3

open("/proc/32553/stat", O_RDONLY) = 3

[email protected]:~$

killall 命令跟 pkill(pgrep) 不同,它查看的不是 /proc/pid/{cmdline,status} 文件,而是另外一個文件 /proc/pid/stat ,這個文件的內容


[email protected]:~$ cat /proc/26195/stat

26195 (bt_uinfo_memcac) S 1 26195 26195 0 -1 4202560 42735 0 0 0 3517 5339 0 0 20 0 6 0 293270594 475316224

36956 18446744073709551615 1 1 0 0 0 0 0 4097 2 18446744073709551615 0 0 17 9 0 0 0 0 0

[email protected]:~$

可以看到也是一樣被截斷了,所以 killall 沒殺死進程就是這個導致的。

把 killall 和 pkill 命令改為下面就可以了


[email protected]:~$ pgrep bt_uinfo_memcac

26195

26236

26586

[email protected]:~$

既然如此,那么有沒有 可靠一點的命令呢? 有,那就是 pidof 命令 。pidof 命令除了查找 cmdline 和 stat 文件外,還查找了 /proc/pid/exe 這個symbol link

所以對于那些二進制名超過 15 個字符,甚至啟動后改名的都可以找到, 最常見就是 myshard 的東東


open("26195/stat", O_RDONLY) = 4

fstat(4, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0

mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1c95e9d000

read(4, "26195 (bt_uinfo_memcac) S 1 2619"..., 1024) = 251

close(4) = 0

munmap(0x7f1c95e9d000, 4096) = 0

open("26195/cmdline", O_RDONLY) = 4

fstat(4, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0

mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1c95e9d000

read(4, "./bt_uinfo_memcached

主站蜘蛛池模板: 通城县| 神池县| 昭平县| 湖口县| 永州市| 安顺市| 广州市| 内乡县| 会理县| 湖口县| 久治县| 平塘县| 哈尔滨市| 兴国县| 平潭县| 阿勒泰市| 光山县| 九龙城区| 光泽县| 永宁县| 诸暨市| 泸定县| 西藏| 新巴尔虎左旗| 富蕴县| 塘沽区| 青浦区| 全南县| 五原县| 东方市| 莫力| 黄陵县| 绥化市| 宁武县| 叶城县| 龙陵县| 湖南省| 都昌县| 达州市| 新蔡县| 准格尔旗|