|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 mytomorrow 于 2019-12-18 13:35 编辑
, Z6 B! E0 h" D
7 d% n4 x" p; T$ n+ t2 p: _4 R常规篇:
) u: ~; V" {2 E4 k4 V: R
, i! p+ a) E8 |5 G 首先,用ps查看进程,方法如下:
* f5 G, B+ I1 D( K/ r1 L( Z. U
1 a$ h! v5 W1 x; ~! S, T$ ps -ef( @% l. }) @8 m8 S b
0 ^) Q. N3 x" Z* [
……" a' |& ~8 @6 _1 J9 v% G9 Q
smx 1822 1 0 11:38 ? 00:00:49 gnome-terminal+ E* x4 p% |9 L
smx 1823 1822 0 11:38 ? 00:00:00 gnome-pty-helper
9 m* F S! ]# W) b4 Nsmx 1824 1822 0 11:38 pts/0 00:00:02 bash
u' U: H$ r- G. h$ F5 `/ i; L4 Ssmx 1827 1 4 11:38 ? 00:26:28 /usr/lib/firefox-3.6.18/firefox-bin
2 b t* K# q; ^1 o' O5 hsmx 1857 1822 0 11:38 pts/1 00:00:00 bash
2 j0 a: ?8 X0 u) `9 i" s4 `2 Ismx 1880 1619 0 11:38 ? 00:00:00 update-notifier' h7 H, {1 x/ K' p" b2 A+ ^ l
……/ U' f6 e! s) A# l# t
smx 11946 1824 0 21:41 pts/0 00:00:00 ps -ef0 O M& s: z- W6 W5 N& Z8 k
% J6 R7 T% R) p或者:! Y, [! o! D U
4 T3 u. v3 E9 D! u& E2 q$ f
$ ps -aux. ^0 L0 u( [/ D8 a' [
- \( V9 O4 u+ @
……3 J& e- r/ t% x7 D. Q) f9 `& R
1 Q$ v$ i6 W5 k' z" r7 \smx 1822 0.1 0.8 58484 18152 ? Sl 11:38 0:49 gnome-terminal
% W; d" ^6 {" A7 w5 O0 esmx 1823 0.0 0.0 1988 712 ? S 11:38 0:00 gnome-pty-helper6 m6 n! |% ^9 P; f4 \
smx 1824 0.0 0.1 6820 3776 pts/0 Ss 11:38 0:02 bash# V" M+ R: E# Z# l& q* _
smx 1827 4.3 5.8 398196 119568 ? Sl 11:38 26:13 /usr/lib/firefox-3.6.18/firefox-bin1 M" x. }( ]8 p4 d( S5 a' i
smx 1857 0.0 0.1 6688 3644 pts/1 Ss 11:38 0:00 bash7 j. l$ N, n% }4 `0 _( l: Q) d7 p
smx 1880 0.0 0.6 41536 12620 ? S 11:38 0:00 update-notifier
/ W2 [! s0 |6 P: Y' W……0 ]3 L/ Y0 a; D( n3 Y* z$ p5 i7 C7 R1 L& `
smx 11953 0.0 0.0 2716 1064 pts/0 R+ 21:42 0:00 ps -aux
M5 ~) |) X: C* X% q; G& ?% ?$ L* H3 [
此时如果我想杀了火狐的进程就在终端输入:
( l, K8 Y1 W. Y* W5 P1 Q
' e$ u0 s7 b/ m6 D2 u$ kill -s 9 18273 {, S: a1 b7 U% B0 @' T
: T0 [. ^) L5 g+ _ c! \$ p其中-s 9 制定了传递给进程的信号是9,即强制、尽快终止进程。各个终止信号及其作用见附录。8 h6 |" X* H( k! }
1 L2 W: Y0 K) G9 g1827则是上面ps查到的火狐的PID。$ [" f9 D B; H! J
- u" T# A- c& C简单吧,但有个问题,进程少了则无所谓,进程多了,就会觉得痛苦了,无论是ps -ef 还是ps -aux,每次都要在一大串进程信息里面查找到要杀的进程,看的眼都花了。
' k4 {* [8 j% J1 y' \+ \. H9 W+ D
进阶篇:( m+ A/ ?9 V+ `+ q- b
5 E8 d1 V: J% r9 M改进1:- y* [' K$ h$ P& I, e- X0 t
3 k# b7 @& ^9 {' g把ps的查询结果通过管道给grep查找包含特定字符串的进程。管道符“|”用来隔开两个命令,管道符左边命令的输出会作为管道符右边命令的输入。 S/ V' H- U0 M5 B- K; a8 O
& R4 V) P6 U4 U6 W
$ ps -ef | grep firefox; h+ _1 H, W$ z5 h0 c4 a
smx 1827 1 4 11:38 ? 00:27:33 /usr/lib/firefox-3.6.18/firefox-bin" W/ z+ \" T3 a- c, j" ^3 J
smx 12029 1824 0 21:54 pts/0 00:00:00 grep --color=auto firefox! ]9 F W/ f. h
( j' H1 n0 i$ b9 k5 A3 O/ M& a' v% o这次就清爽了。然后就是
9 k+ q6 l% q+ C: D4 h; r' S% a2 [. ]# d# g9 t. g2 a! }
$kill -s 9 1827
4 e" |& D+ d8 Q: G! k* d7 k! P- P
还是嫌打字多?
% G' F! Z3 A. b) E8 P+ L3 s$ m0 R4 o8 O! w! ~
改进2——使用pgrep:
# N3 O5 z" @) o* Y& X0 k
+ D! P( {" i7 r& ?" {% ?一看到pgrep首先会想到什么?没错,grep!pgrep的p表明了这个命令是专门用于进程查询的grep。/ E$ v9 d- v2 t9 ~) ^
1 o$ F; ~' u+ O) x& V% Y' \$ pgrep firefox5 _% v. N- C1 Q3 i, h! Q
1827
6 j3 s9 D6 E/ p0 p1 q+ Q+ E# P) U5 M; |
看到了什么?没错火狐的PID,接下来又要打字了:7 g" X7 F; n. d
0 `. T4 S8 p! l' b+ C
$kill -s 9 1827
1 F. @" a7 Z+ Q
* b! P( H( h3 V$ ~改进3——使用pidof:
4 h! V% L M8 |# K+ o r6 z* G! C+ J- a
看到pidof想到啥?没错pid of xx,字面翻译过来就是 xx的PID。
1 r1 r# ]* ^1 T1 I7 |! P4 q5 F
6 _2 z$ C9 |8 B, X$ pidof firefox-bin3 t+ C; m' g- X4 C
1827
% j j$ F! r M2 W和pgrep相比稍显不足的是,pidof必须给出进程的全名。然后就是老生常谈:1 o/ t W8 g/ q/ \( b) l* M
7 o G* x! H$ z) k# N
$kill -s 9 1827# D: ] ^" j; _ H3 Y d, d) ?
* z" R' l0 d X0 t, w) o+ A2 W无论使用ps 然后慢慢查找进程PID 还是用grep查找包含相应字符串的进程,亦或者用pgrep直接查找包含相应字符串的进程PID,然后手动输入给kill杀掉,都稍显麻烦。有没有更方便的方法?有!$ a* a& y% R/ a; o
% d( F: i& f6 c3 x9 \7 Z# r改进4:7 Q* I' D. e! C3 k8 d1 D0 r& Z
( O! E3 K7 ^0 H$ B) W$ps -ef | grep firefox | grep -v grep | cut -c 9-15 | xargs kill -s 9! G5 R/ [" n6 T3 z
# Q/ \: Z# C# W& R- S0 g& I说明:
) |7 j$ f. o2 }, w( b% D
0 }) f: Y+ X' {# O“grep firefox”的输出结果是,所有含有关键字“firefox”的进程。! J, |0 B/ j+ _- J0 c, e
2 _) i; j( a$ K' J% k3 u“grep -v grep”是在列出的进程中去除含有关键字“grep”的进程。; v2 T4 K7 W. n$ @8 X J+ M3 c8 a) D
) r" M/ G% N" L4 |* c“cut -c 9-15”是截取输入行的第9个字符到第15个字符,而这正好是进程号PID。$ m/ _' c- F `* s; t9 _ D
/ j5 V( l/ t3 C5 E- P, [“xargs kill -s 9”中的xargs命令是用来把前面命令的输出结果(PID)作为“kill -s 9”命令的参数,并执行该命令。“kill -s 9”会强行杀掉指定进程。
: k# W; S3 U8 e9 L+ z( D& F' W$ e7 G+ z" ?7 k% Q
难道你不想抱怨点什么?没错太长了% A0 q) t9 f9 e# V" `- _% T! H4 d& r
( ~- r a% C7 n F
改进5:9 h( ?7 {/ r9 a% s5 f
8 b3 ^+ G2 I5 \! b1 w/ [4 q知道pgrep和pidof两个命令,干嘛还要打那么长一串!
( @8 X, s0 o: ?/ T( w6 q- y
7 m- t1 b k& w2 L% {. h* g9 K$ pgrep firefox | xargs kill -s 9
5 O S+ w! R' L' n" s* \5 H# y9 D0 ?1 t) }" m) p5 Z, [) Y
改进6:9 M2 q, P, B0 i5 h
4 Q8 _/ }- ?% Z$ ps -ef | grep firefox | awk '{print $2}' | xargs kill -9 ?0 Z: D9 b$ _& G) K0 m) c% R) x
kill: No such process# S1 v) k" ]/ T5 B/ D7 A; W
" w( x) h7 p- }( \! b# @6 Q有一个比较郁闷的地方,进程已经正确找到并且终止了,但是执行完却提示找不到进程。
) @% a8 Q. }* Z/ J& j: X7 X, s' b: Y- |9 h3 \' y. y
其中awk '{print $2}' 的作用就是打印(print)出第二列的内容。根据常规篇,可以知道ps输出的第二列正好是PID。就把进程相应的PID通过xargs传递给kill作参数,杀掉对应的进程。+ Y& C" n* e: w
4 `6 \/ L* V6 b- i, F
改进7:- g, A/ i, X# Q" |5 e3 w0 U
6 G3 c3 s) h2 t8 w8 Q难道每次都要调用xargs把PID传递给kill?答案是否定的:
" F e* ]* x& j4 S/ i8 K2 a- P! w" V; \
$kill -s 9 `ps -aux | grep firefox | awk '{print $2}'`# X0 Z) m6 t+ c0 S; i3 N9 p
3 ^4 E8 k9 S/ f9 y( P, n
改进8:
" E6 Y8 k6 y" h1 F/ \; F2 |, V- l3 @# T0 O" h
没错,命令依然有点长,换成pgrep。6 ~# N3 a, H- |; [( E4 F2 t
! w5 g& m8 ]: U/ I: k( S
$kill -s 9 `pgrep firefox`( A. ~- {' x9 d& a+ B& H K" T
! k& s' k9 [0 J
改进9——pkill:/ I6 j* o/ _, @3 {
3 U5 f- e0 r) y9 c! m
看到pkill想到了什么?没错pgrep和kill!pkill=pgrep+kill。
8 H" w! k: ]" {2 l3 f: U! g; r3 i" l( a: }% I- F
$pkill -9 firefox. h- p1 {% T, l
+ J' z' \. l! e% r
说明:"-9" 即发送的信号是9,pkill与kill在这点的差别是:pkill无须 “s”,终止信号等级直接跟在 “-“ 后面。之前我一直以为是 "-s 9",结果每次运行都无法终止进程。
7 g5 A0 a+ p- f5 n
$ W: ]; v$ q8 a: f* W6 X- C" s3 ^改进10——killall:
8 H+ f6 \% `( {
3 Q( m& F! F6 I, N( T5 Okillall和pkill是相似的,不过如果给出的进程名不完整,killall会报错。pkill或者pgrep只要给出进程名的一部分就可以终止进程。# A$ }6 S6 x$ d* E- b) v! P$ k
4 h7 l) O) I5 Y+ w! K
$killall -9 firefox: M3 i) u" R j! [0 U
5 `- R$ T$ @1 c3 l( B7 W) P
+ c" h. p9 `) V& U: ]% V6 |% P. o9 J; q; ~ k% D
附录:各种信号及其用途
7 T( p; i% p pSignal | 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 | o9 @6 c/ a& y9 n
" _ d& X1 u- T! m* @
2 j( N1 F+ @4 b! @; c) W. I |
|