|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 mytomorrow 于 2019-12-18 13:35 编辑 ( U/ k: F/ A8 f# [+ G
) @2 [1 R! S. h9 O常规篇:8 Q7 N. @2 I) ^ J0 b: ?6 Y% [
2 _5 q; x f: J! r2 k# o, C! Q
首先,用ps查看进程,方法如下:
3 }; @) [* j3 V6 W9 x/ W! A& a
; C/ s6 H+ _5 ~8 i+ N" d; E' \$ ps -ef& a: K- T6 f, m, f X. M5 e
8 f4 E' B5 J' m7 U- G6 }( R! I1 d; K
……
* O/ N L! k V9 tsmx 1822 1 0 11:38 ? 00:00:49 gnome-terminal
# M4 r, Y) V# P# ~smx 1823 1822 0 11:38 ? 00:00:00 gnome-pty-helper
5 h: D' U f3 b. Osmx 1824 1822 0 11:38 pts/0 00:00:02 bash
# T3 h: D: F: c. K1 \smx 1827 1 4 11:38 ? 00:26:28 /usr/lib/firefox-3.6.18/firefox-bin
, K0 \, D* A( D4 Ssmx 1857 1822 0 11:38 pts/1 00:00:00 bash# N, x" N" y7 G( ^5 A& `
smx 1880 1619 0 11:38 ? 00:00:00 update-notifier
' D. y# y8 J w9 n2 p……( G6 a- P$ \% ]7 b: `" b7 i
smx 11946 1824 0 21:41 pts/0 00:00:00 ps -ef
3 N3 N x: m+ c/ E$ c, l
) Q b/ U) M/ ^# W- n% h1 j或者:2 x. H: a9 b* ^$ b3 W9 s \& O! H6 o
# d% ?' u |- g' K
$ ps -aux
7 H7 [" G6 o4 Q+ {$ |
$ }. z2 [" O2 x; C……/ t( Q6 g+ d8 w% K3 ~, U7 e
2 B% W- ~0 r& x/ I! r6 V. s* Bsmx 1822 0.1 0.8 58484 18152 ? Sl 11:38 0:49 gnome-terminal
+ |9 a9 e$ p, Y; _ qsmx 1823 0.0 0.0 1988 712 ? S 11:38 0:00 gnome-pty-helper
( a/ q/ } I& u( W' a$ \5 m+ Qsmx 1824 0.0 0.1 6820 3776 pts/0 Ss 11:38 0:02 bash- W# Q# d8 A- ^5 o4 v9 ?9 I g
smx 1827 4.3 5.8 398196 119568 ? Sl 11:38 26:13 /usr/lib/firefox-3.6.18/firefox-bin0 m B" o/ U) p. P5 U1 X
smx 1857 0.0 0.1 6688 3644 pts/1 Ss 11:38 0:00 bash9 `. |& K6 G9 I6 d
smx 1880 0.0 0.6 41536 12620 ? S 11:38 0:00 update-notifier
3 ~1 d9 w$ o/ n- k……
o5 r0 \2 O. a% U1 hsmx 11953 0.0 0.0 2716 1064 pts/0 R+ 21:42 0:00 ps -aux
( f5 p: l* h3 T( Q0 o8 i
; a& P+ S7 |- n' X& _ Q此时如果我想杀了火狐的进程就在终端输入:5 H0 b. h( Q. c7 e8 W0 V P3 l% P
' R0 T- X7 ]5 j$ {# D$ kill -s 9 1827$ F. |, _9 _: N5 n P1 }
" p" g2 s8 u" U& u其中-s 9 制定了传递给进程的信号是9,即强制、尽快终止进程。各个终止信号及其作用见附录。
( i5 P6 I7 J* l8 g
1 M6 v, k( S2 L; w5 Q$ K- o* ^1827则是上面ps查到的火狐的PID。$ ?9 U: i# Z, G2 s+ J" ?
$ G: M, u: w, U) R, p% t
简单吧,但有个问题,进程少了则无所谓,进程多了,就会觉得痛苦了,无论是ps -ef 还是ps -aux,每次都要在一大串进程信息里面查找到要杀的进程,看的眼都花了。9 _: ^/ K* i9 @* A$ L2 c3 b
" g) M& N$ @: v; R进阶篇:' k" v# T4 q; y
6 _6 t* K1 O" I4 ^0 H7 N# i改进1:
}5 Q. Y' A% ^5 j& p) I4 V" ]" M- m/ p+ p7 y
把ps的查询结果通过管道给grep查找包含特定字符串的进程。管道符“|”用来隔开两个命令,管道符左边命令的输出会作为管道符右边命令的输入。 P; r2 S" ] z# {5 [" O
* B8 r q7 z! `. U$ ps -ef | grep firefox! e" s' w7 O8 E
smx 1827 1 4 11:38 ? 00:27:33 /usr/lib/firefox-3.6.18/firefox-bin, R% i+ }: @' Z" J
smx 12029 1824 0 21:54 pts/0 00:00:00 grep --color=auto firefox
& I( Y2 z2 m$ l3 h+ o" z6 u$ J+ O I, c1 N. `
这次就清爽了。然后就是- ?& a' e: ? }( O
' j% I' i" n) F' K8 `; L$kill -s 9 18275 u. k% \" a# W C
: N! ?% ]8 s9 r! Y
还是嫌打字多?
9 {; p" U G2 P) g# t% X3 q) m8 N% [* x# D
改进2——使用pgrep:. F J) V$ ~! h* b6 `" ]
0 T$ S) j6 j: @$ {% A3 X一看到pgrep首先会想到什么?没错,grep!pgrep的p表明了这个命令是专门用于进程查询的grep。1 \1 d8 z3 m$ L8 B2 k; _* s6 l' z
9 o3 |% _5 R4 D( x( t4 o$ pgrep firefox
$ T9 d" A- \$ F: }+ ^0 a% s1827
* [5 T1 I3 K, S% e# ]! ^
, _4 ?% H1 \8 W# K" b4 T看到了什么?没错火狐的PID,接下来又要打字了:
, U- A, ]( R& d+ d2 ?7 e8 c' G
- r* a6 O2 h( Y4 s% ^) V8 z; w$kill -s 9 1827
5 T D, j' T9 U7 @, x8 i9 o
- C0 }7 j4 [) n改进3——使用pidof:
. O0 F- h. D2 c W3 H7 X
5 L3 N* W, R( J看到pidof想到啥?没错pid of xx,字面翻译过来就是 xx的PID。# [: G0 l+ j+ h# H6 q8 z
% Z; g }3 D* b
$ pidof firefox-bin, g4 b! P& ^- w& g# ]
1827: F! Z9 u, g4 l% e
和pgrep相比稍显不足的是,pidof必须给出进程的全名。然后就是老生常谈:# d' f$ `: f+ B
9 F; t6 @" J( c4 J7 q8 E$kill -s 9 1827
% f+ z! [ h$ f# n/ b% K/ a5 N. ^7 |) `9 u! _5 S6 w
无论使用ps 然后慢慢查找进程PID 还是用grep查找包含相应字符串的进程,亦或者用pgrep直接查找包含相应字符串的进程PID,然后手动输入给kill杀掉,都稍显麻烦。有没有更方便的方法?有!
' {2 _3 K- s: ^ U+ W: E: g% T) J; \9 G
改进4:
( I4 F1 E q) S; ]! X9 d' g! x* d, N
$ps -ef | grep firefox | grep -v grep | cut -c 9-15 | xargs kill -s 9
7 {& J# B0 h/ G5 o/ [# w0 {, O
( L! S% ~) h# P说明:
8 M$ P- R3 H, f" }9 F) W" T4 N; i9 I" H( p2 W7 f
“grep firefox”的输出结果是,所有含有关键字“firefox”的进程。3 G7 A3 s2 V" r7 K: K: U5 g8 ]$ z7 k q
6 L$ r Z- M. ?3 Z* E; X) F) o2 C
“grep -v grep”是在列出的进程中去除含有关键字“grep”的进程。
" b+ l) M4 q( M6 J3 ^
2 W( n8 x% c0 E0 g1 r“cut -c 9-15”是截取输入行的第9个字符到第15个字符,而这正好是进程号PID。" l6 ~" _& v4 x( F$ \
6 g* I' y) k1 W$ e“xargs kill -s 9”中的xargs命令是用来把前面命令的输出结果(PID)作为“kill -s 9”命令的参数,并执行该命令。“kill -s 9”会强行杀掉指定进程。3 n; ~$ i; b- B3 B1 l7 z. D
# \ ]2 l4 g9 M1 ]
难道你不想抱怨点什么?没错太长了
( s' M) t& \( e* `) j
7 m4 v0 U+ z0 M改进5: B' P/ S' P! T: U. U. J
; v f# t0 M" F9 L" c, S
知道pgrep和pidof两个命令,干嘛还要打那么长一串!/ W: ~& b5 `4 i3 r& x6 M0 a
& |5 U- ~! x" f8 S6 l3 i$ pgrep firefox | xargs kill -s 91 }" Q$ l/ q( g% J
$ q3 ~1 |3 ]0 y8 i J! ]
改进6:
! u- d" i, W* B! f6 B6 ^8 j; P$ O$ ?1 d3 b, N" r3 b
$ ps -ef | grep firefox | awk '{print $2}' | xargs kill -9
$ o+ y% K2 y% B0 _! g: B# ~2 e n" ~. ~kill: No such process
: Q6 w Y. |) n: B6 {# `1 w. u& D; w% Q: c; C
有一个比较郁闷的地方,进程已经正确找到并且终止了,但是执行完却提示找不到进程。; c2 c0 l) ?5 e* u3 E5 I5 r0 f
7 @: f7 R: Q a6 M* l! o" v
其中awk '{print $2}' 的作用就是打印(print)出第二列的内容。根据常规篇,可以知道ps输出的第二列正好是PID。就把进程相应的PID通过xargs传递给kill作参数,杀掉对应的进程。
# ^: c$ J# i# p
% K( K3 t4 f L! j% D( G6 j改进7:# ?( p+ n! e# I) c7 R
2 B i1 F5 G& e- ^难道每次都要调用xargs把PID传递给kill?答案是否定的:" f8 |2 h: o7 s8 ]/ `4 o0 T. t
* K3 O0 p3 d! z0 [7 f0 k7 l+ C/ h
$kill -s 9 `ps -aux | grep firefox | awk '{print $2}'`
1 y# p: F' U5 a1 E# b$ Q" ]8 ]4 |. w) F$ j7 B) Z# ]$ f6 G* F
改进8:
/ z) Y, [5 j( m0 Z* k' h7 l5 @9 }1 L( `2 j) X$ n# T
没错,命令依然有点长,换成pgrep。
! j! L0 v+ d" D0 O3 ^+ |1 J4 g/ V# E1 V5 x
$kill -s 9 `pgrep firefox`% n' |; s0 v/ I+ H, F
7 z0 m7 x9 J5 k. `( q7 B1 T# ^改进9——pkill:1 K( o, c* H; l. \6 r
- Y( I0 B& E$ p/ ^. {" S看到pkill想到了什么?没错pgrep和kill!pkill=pgrep+kill。) Y' [/ E& }/ R! p+ P5 b% j& Z( {
! [/ [, M2 l$ W* B* d: ^, _$pkill -9 firefox
) H5 a0 C; b C3 d- V4 [- q0 Z, s2 F4 F
说明:"-9" 即发送的信号是9,pkill与kill在这点的差别是:pkill无须 “s”,终止信号等级直接跟在 “-“ 后面。之前我一直以为是 "-s 9",结果每次运行都无法终止进程。4 A$ p& D8 V* F. m9 r2 E3 z. l3 N
! i5 ^! K m/ |9 O/ w: x$ M5 u改进10——killall:( L1 e5 n1 g' F8 C% ]. W
8 B r) Z0 H4 ~2 F8 B( M1 l
killall和pkill是相似的,不过如果给出的进程名不完整,killall会报错。pkill或者pgrep只要给出进程名的一部分就可以终止进程。+ F- ~% D3 X' h+ A. |+ L+ Z% q
$ G, U0 }( d) p2 \( H
$killall -9 firefox
% A1 _3 x- s1 O4 C3 m2 {; S
1 h- [/ f, T. a1 X1 ?) F( ^7 C9 C+ a. A4 S, B( B
g: a4 r* r4 [% }# Y
附录:各种信号及其用途
. c! B6 M3 q' @( m3 Y. {Signal | Description | Signal number on Linux x86[1] | | SIGABRT | Process aborted | 6 | | SIGALRM | Signal raised by alARM | 14 | | SIGBUS | Bus error: "access to undefined portion of memory object" | 7 | | SIGCHLD | Child process terminated, stopped (or continued*) | 17 | | SIGCONT | Continue if stopped | 18 | | SIGFPE | Floating point exception: "erroneous arithmetic operation" | 8 | | SIGHUP | Hangup | 1 | | SIGILL | Illegal instruction | 4 | | SIGINT | Interrupt | 2 | | SIGKILL | Kill (terminate immediately) | 9 | | SIGPIPE | Write to pipe with no one reading | 13 | | SIGQUIT | Quit and dump core | 3 | | SIGSEGV | Segmentation violation | 11 | | SIGSTOP | Stop executing temporarily | 19 | | SIGTERM | Termination (request to terminate) | 15 | | SIGTSTP | Terminal stop signal | 20 | | SIGTTIN | Background process attempting to read from tty ("in") | 21 | | SIGTTOU | Background process attempting to write to tty ("out") | 22 | | SIGUSR1 | User-defined 1 | 10 | | SIGUSR2 | User-defined 2 | 12 | | SIGPOLL | Pollable event | 29 | | SIGPROF | Profiling timer expired | 27 | | SIGSYS | Bad syscall | 31 | | SIGTRAP | Trace/breakpoint trap | 5 | | SIGURG | Urgent data available on socket | 23 | | SIGVTALRM | Signal raised by timer counting virtual time: "virtual timer expired" | 26 | | SIGXCPU | CPU time limit exceeded | 24 | | SIGXFSZ | File size limit exceeded | 25 | a+ p4 ^3 Q# C5 g
" Y! g4 @3 U/ @4 |
+ }" ~6 `7 q- e" K: H |
|