首页 > 代码库 > 杀死Linux Shell进程
杀死Linux Shell进程
1、查找目标shell进程:
比如:我想要查找 odm_clean 脚本执行进程
ps -ef | grep "odm_clean"
hadoop 3702 46809 0 17:17 pts/16 00:00:00 grep odm_clean
hadoop 28376 28349 0 13:47 pts/11 00:00:00 bash ./odm_clean.sh 2015-06-16 2015-06-20
username pid
2、杀死进程:
kill -9 28376
Killed
具体介绍:
1. ps简单介绍
ps命令就是最根本对应情况下也是相当强大地进程查看命令.运用该命令能够确定有哪些进程正在执行和执行地状态、进程是否结束、进程有没有僵死、哪些进程占用了过多地资源等等.总之大部分信息均为能够通过执行该命令得到地.
2. ps命令及其參数
ps命令最常常使用地还是用于监控后台进程地工作情况,由于后台进程是不和屏幕键盘这些标准输入/输出设
备进行通信地,所以假设须要检測其情况,便能够运用ps命令了.
该命令语法格式例如以下:
ps [选项]
-e 显示全部进程,环境变量
-f 全格式
-h 不显示标题
-l 长格式
-w 宽输出
a 显示终端上地全部进程,包含其它用户地进程
r 仅仅显示正在执行地进程
x 显示没有控制终端地进程
O[+|-] k1 [,[+|-] k2 [,…]] 依据SHORT KEYS、k1、k2中快捷键指定地多级排序顺序显示进程列表.
对于ps地不同格式都存在着默认地顺序指定.这些默认顺序能够被用户地指定所覆盖.在这里面“+”字符是可选地,“-”字符是倒转指定键地方向.
pids仅仅列出进程标识符,之间运用逗号分隔.该进程列表必须在命令行參数地最后一个选项后面紧接着给出,中间不能插入空格.比方:ps -f1,4,5.
下面介绍长命令行选项,这些选项都运用“--”开头:
--sort X[+|-] key [,[+|-] key [,…]] 从SORT KEYS段中选一个多字母键.“+”字符是可选地,由于默认地方向就是按数字升序或者词典顺序.比方: ps -jax -sort=uid,-ppid,+pid.
--help 显示帮助信息.
--version 显示该命令地版本号信息.
在前面地选项说明中提到了排序键,接下来对排序键作进一步说明.须要注意地是排序中运用地值是ps运用地内部值,并不是仅用于某些输出格式地伪值.排序键列表见表4-3.
表4-3 排序键列表
c
cmd
可运行地简单名称
C
cmdline
完整命令行
f
flags
长模式标志
g
pgrp
进程地组ID
G
tpgid
控制tty进程组ID
j
cutime
累计用户时间
J
cstime
累计系统时间
k
utime
用户时间
K
stime
系统时间
m
min_flt
次要页错误地数量
M
maj_flt
重点页错误地数量
n
cmin_flt
累计次要页错误
N
cmaj_flt
累计重点页错误
o
session
对话ID
p
pid
进程ID
P
ppid
父进程ID
r
rss
驻留大小
R
resident
驻留页
s
size
内存大小(千字节)
S
share
共享页地数量
t
tty
tty次要设备号
T
start_time
进程启动地时间
U
uid
UID
u
user
username
v
vsize
总地虚拟内存数量(字节)
y
priority
内核调度优先级
3. 常常使用ps命令參数
最常常使用地三个參数是u、a、x,以下将通过样例来说明其详细使用方法.
[例20] 以root身份登录系统,查看当前进程状况
$ ps
PID TTY TIME COMMAND
5800 ttyp0 00:00:00 bash
5835 ttyp0 00:00:00 ps
能够看到,显示地项目共分为四项,依次为PID(进程ID)、TTY(终端名称)、TIME(进程运行时间)
、COMMAND(该进程地命令行输入).
能够运用u选项来查看进程全部者及其它少许具体信息,例如以下所看到的:
$ ps u
USER PID %CPU %MEM USZ RSS TTY STAT START TIME COMMAND
test 5800 0.0 0.4 1892 1040 ttyp0 S Nov27 0:00 -bash
test 5836 0.0 0.3 2528 856 ttyp0 R Nov27 0:00 ps u
在bash进程前面有条横线,意味着该进程便是用户地登录shell,所以对于一个登录用户来说带短横线地进程仅仅有一个.还能够看到%CPU、%MEM两个选项,前者指该进程占用地CPU时间和总时间地百分比;后者指该进程占用地内存和总内存地百分比.
在这样的情况下看到了全部控制终端地进程;当然对于其它那些没有控制终端地进程还是没有观察到,所以这时就须要运用x选项.运用x选项能够观察到全部地进程情况.
-----------------------------------------------------------------------------------
KILL
-----------------------------------------------------------------------------------
因为职责的要求,你不得不费力地阅读那些令你感到费解的晦涩的Linux应用程序的说明文件。
然后,你将执行指令和编辑设置文件。一切都在正常 执行。生活真美好。可是,你知道,好时光不会永远持续下去。当你遇到令人恐惧的“send the process a SIGHUP”提示时,好时光结束了。
什么是“SIGHUP(启动信号)”,你怎样发送它?它像是你送给你的恋人的一束花吗?
尽管你能够肯定这不是一个命令行指令,只是,你还是试着 键入它。
当然。这没有结果。然后,你检查一下键盘。哦。没有SIGHUP键。于是你又又一次阅读这个应用程序的參考指南,看到以下这段文字:
当收到一个hangup(进程结束)信号时,sshd程序会又一次阅读配置文件。通过运行启动程序时的命令及选项来发送SIGHUP信号,如:/usr/sbin/sshd。
哦。原来是这样。
程序猿 VS 使用者
LINUX程序的在线參考指南作者一般都要既照应到终于用户的需求也要照应到高级程序猿的需求。
因此,有些说明比較难懂。
只是,不要操心。如今我们就要揭开覆盖在这些让人迷惑的内容上面那神奇的面纱。
信号与进程控制
这个问题主要属于信号和进程控制的范畴。对于我们系统管理员和普通用户来说,我们主要关心的是启动、停止和又一次启动服务、停止失控的进程和被挂起的进程。而且尽可能不中断系统执行。由于不同的
操作系统和不同的命令外壳处理信号的方式都不同样,我们这里仅仅介绍Linux操作系统和bash外壳。
信号是用来与守护程序和进程通信的。不论什么活动任务都是一个进程。而守护程序是等待对某些事件做出反应或者依照日程安排运行任务的后台服务。一个 程序必须有建在当中的信号处理程序用于捕获和应答信号。在LINUX中的signal 參考指南解释了各种不同信号和这些信号的用途。
信号是由“kill”命令发出的。kill -l命令能够显示一个可用信号列表及其编号。
全部的守护程序和进程都有一个进程ID(PID),比如使用ps命名所显示的内容:
$ ps aux
USER PID %CPU %MEM TTY STAT COMMAND
root 1 0.0 0.1 ? S init [2]
105 7783 0.0 0.2 ?
Ss /usr/bin/dbus-daemon --system
hal 7796 0.0 0.7 ? Ss /usr/sbin/hald
postfix 7957 0.0 0.2 ? S qmgr -l -t fifo -u -c
nagios 8371 0.0 0.2 ?
SNs /usr/sbin/nagios /etc/nagios/nagios.cfg
这个输出是经过简化的。你在系统中能够看到很多其它的行和栏目。假设某些进程消耗了你的所有CPU或者内存,你能够在这个输出的%CPU和%MEM 列中发现它们。找到失控的进程的一种更快捷的方法是使用top命令。由于依照默认的设置。使用占用CPU资源最多的进程在最上面显示。
我们能够使用一条 “yes”命令来測试一下:
$ yes carla is teh awesum
这个命令将以非常高的速度重复显示“carla is teh awesum”。直到你停止它执行。这将使你的CPU使用率达到警戒线。
$ top
...
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
12144 carla 25 0 31592 17m 13m R 93.4 3.5 0:50.26 konsole
22236 carla 15 0 2860 468 400 S 4.3 0.1 0:00.97 yes
分析一下这个结果,你会发现一些有趣的事,你会发现,占用CPU最多的程序是konsole虚拟终端程序,而不是“yes”命令,这是由于 “yes”命令是在konsole终端程序中执行的。
假设在一个“真正的”控制台(按Ctrl+alt+f2键)中执行相同的命令序列,你将看到 “yes”命令被排在第一位。
有很多停止“yes”命令执行的方式。假设你要回到执行它的shell中,按CTRL+c键就能够了。或者你能够在还有一个shell中用“kill”命令停止“yes”命令的执行,Kill命令后面跟PID或者命令名称,例如以下如示:
$ kill 22236
或者
$ killall yes
按CTRL+c键发出一个SIGINT(信号2),这个信号是键盘要求取得控制权的中断信号。kill和killall这两个命令依照默认的设 置都发出一个SIGTERM信号(编号15)。
程序中能够设置对SIGTERM信号(15)是捕捉或者忽略,或者以不同的方式解释。因此。假设你的程序对 于 KILL命令的反应与你预期不同,非常可能是被KILL的目标程序的问题。
终止一个父进程通常也终止了它的子进程。只是,情况并不总是如此。你知道子进程是什么吗?
使用ps命令加上-f选项就能够看到,例如以下所看到的:
$ ps axf
22371 ? R 2:35 _ konsole [kdeinit]
22372 pts/3 Ss 0:00 | _ /bin/bash
24322 pts/3 S+ 0:00 | | _ yes carla is teh awesum
22381 pts/4 Rs 0:00 | _ /bin/bash
24323 pts/4 R+ 0:00 | | _ ps axf
如今。回到SIGHUP的话题
SIGHUP的发音是“sig-hup”,是signal hangup的缩写,含义是“中止信号”。你怎样发送一个SIGHUP信号呢?这里有几种方式:
# kill -HUP [pid]
# killall -HUP [process-name]
# kill -1 [pid]
# killall -1 [process-name]
因此,你能够使用PID或者名称。信号名称或者号码。
那么为什么要这样做而不使用/etc/init.d/foo命令又一次启动呢?使用它们自己 的 init(初始化)文件来控制服务是优先选择的方式,由于这些文件通常包括健全和错误检查以及额外的功能。使用“kill”命令和信号的主要原因是尽可能 明白地终止挂起和失控的进程,而不必又一次启动或者登出。
终止进程
正如你在关于信号的man page中所示,有十几种控制进程的方法。以下是一些经常使用的方法:
kill -STOP [pid]
发送SIGSTOP (17,19,23)停止一个进程。而并不消灭这个进程。
kill -CONT [pid]
发送SIGCONT (19,18,25)又一次開始一个停止的进程。
kill -KILL [pid]
发送SIGKILL (9)强迫进程马上停止,而且不实施清理操作。
kill -9 -1
终止你拥有的所有进程。
SIGKILL和SIGSTOP信号不能被捕捉、封锁或者忽略,可是,其他的信号能够。
所以这是你的终极武器。
Bash shell的Kil命令l
Bash外壳包括一个内置的kill命令,当运行以下命令:
$ type -all kill
kill is a shell built-in
kill is /bin/kill
命令的结果表明有两个kill命令,一个是BASH的内置命令,还有一个是/bin/kill可运行程序。一般来说这两个命令不太可能遇到冲突的情况。只是,假设你确实遇到了kill命令行为异常时,你能够明白的指定/bin/kill命令。
你一定要进一步查阅以下的资源中列出的參考资源来了解Linux中kill的妙用,由于这是你进入维护Linux系统领域的门票。这些知识可以让你像做外科手术一样对系统进行维护。而不用在遇到问题时每一次都又一次启动系统。就像我们知道的某些蹩脚的
操作系统那样。
资源
Linux Cookbook一书的第七章“開始和终止Linux”
bash (1) - GNU Bourne-Again Shell
yes (1) - 在被终止前重复打印字符
signal (7) - 可用信号列表
ps (1) - 报告当前进程的快照
kill (1) - 向一个进程发出信号
killall (1) - 按名字消灭进程
pkill (1) - 依据名字和其他属性查看或者发出进程信号
skill (1) - 发送一个信号或者报告进程状态
xkill (1) - 依照X资源消灭一个客户程序
杀死Linux Shell进程