`
heipark
  • 浏览: 2094615 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Linux中Kill进程的N种方法(转)

 
阅读更多

long long ago,曾有一个想法,就是完全脱离windows,使用linux生活、工作。以前迫于各种专业工具不支持linux,只能无奈的使用xp。最近工作内 容是android移植+单片机开发,android就不说了,必须用linux开发。单片机也找到一些linux的工具,于是乎有不少时间是在 linux上进行开发工作。自然而然的,经常要进程管理。linux的进程管理手段丰富。想怎么杀进程都可以。废话少说,正题开始:

常规篇

首先,用ps查看进程,方法如下:

[plain] view plaincopy
 
  1. $ ps -ef  
  2.   
  3. ……  
  4. smx       1822     1  0 11:38 ?        00:00:49 gnome-terminal  
  5. smx       1823  1822  0 11:38 ?        00:00:00 gnome-pty-helper  
  6. smx       1824  1822  0 11:38 pts/0    00:00:02 bash  
  7. smx       1827     1  4 11:38 ?        00:26:28 /usr/lib/firefox-3.6.18/firefox-bin  
  8. smx       1857  1822  0 11:38 pts/1    00:00:00 bash  
  9. smx       1880  1619  0 11:38 ?        00:00:00 update-notifier  
  10. ……  
  11. smx      11946  1824  0 21:41 pts/0    00:00:00 ps -ef  



或者:

[plain] view plaincopy
 
  1. $ ps -aux  
  2.   
  3. ……  
  4.   
  5. smx       1822  0.1  0.8  58484 18152 ?        Sl   11:38   0:49 gnome-terminal  
  6. smx       1823  0.0  0.0   1988   712 ?        S    11:38   0:00 gnome-pty-helper  
  7. smx       1824  0.0  0.1   6820  3776 pts/0    Ss   11:38   0:02 bash  
  8. smx       1827  4.3  5.8 398196 119568 ?       Sl   11:38  26:13 /usr/lib/firefox-3.6.18/firefox-bin  
  9. smx       1857  0.0  0.1   6688  3644 pts/1    Ss   11:38   0:00 bash  
  10. smx       1880  0.0  0.6  41536 12620 ?        S    11:38   0:00 update-notifier  
  11. ……  
  12. smx      11953  0.0  0.0   2716  1064 pts/0    R+   21:42   0:00 ps -aux  



此时如果我想杀了火狐的进程就在终端输入:

 

[plain] view plaincopy
 
  1. $ kill -s 9 1827  



 

其中-s 9 制定了传递给进程的信号是9,即强制、尽快终止进程。各个终止信号及其作用见附录。

1827则是上面ps查到的火狐的PID。

简单吧,但有个问题,进程少了则无所谓,进程多了,就会觉得痛苦了,无论是ps -ef 还是ps -aux,每次都要在一大串进程信息里面查找到要杀的进程,看的眼都花了。

进阶篇:

改进1

把ps的查询结果通过管道给grep查找包含特定字符串的进程。管道符“|”用来隔开两个命令,管道符左边命令的输出会作为管道符右边命令的输入。

 

[plain] view plaincopy
 
  1. $ ps -ef | grep firefox  
  2. smx       1827     1  4 11:38 ?        00:27:33 /usr/lib/firefox-3.6.18/firefox-bin  
  3. smx      12029  1824  0 21:54 pts/0    00:00:00 grep --color=auto firefox  



 

这次就清爽了。然后就是

 

[plain] view plaincopy
 
  1. $kill -s 9 1827  



 

还是嫌打字多?

改进2——使用pgrep

一看到pgrep首先会想到什么?没错,grep!pgrep的p表明了这个命令是专门用于进程查询的grep。

 

[plain] view plaincopy
 
  1. $ pgrep firefox  
  2. 1827  



 

看到了什么?没错火狐的PID,接下来又要打字了:

 

[plain] view plaincopy
 
  1. $kill -s 9 1827  



 

改进3——使用pidof:

看到pidof想到啥?没错pid of xx,字面翻译过来就是 xx的PID。

 

[plain] view plaincopy
 
  1. $ pidof firefox-bin  
  2. 1827  



和pgrep相比稍显不足的是,pidof必须给出进程的全名。然后就是老生常谈:

 

 

[plain] view plaincopy
 
  1. $kill -s 9 1827  



 

无论使用ps 然后慢慢查找进程PID 还是用grep查找包含相应字符串的进程,亦或者用pgrep直接查找包含相应字符串的进程PID,然后手动输入给kill杀掉,都稍显麻烦。有没有更方便的方法?有!

改进4:

 

[plain] view plaincopy
 
  1. $ps -ef | grep firefox | grep -v grep | cut -c 9-15 | xargs kill -s 9  



 

说明:

“grep firefox”的输出结果是,所有含有关键字“firefox”的进程。

“grep -v grep”是在列出的进程中去除含有关键字“grep”的进程。

“cut -c 9-15”是截取输入行的第9个字符到第15个字符,而这正好是进程号PID。

“xargs kill -s 9”中的xargs命令是用来把前面命令的输出结果(PID)作为“kill -s 9”命令的参数,并执行该命令。“kill -s 9”会强行杀掉指定进程。

难道你不想抱怨点什么?没错太长了

改进5:

知道pgrep和pidof两个命令,干嘛还要打那么长一串!

 

[plain] view plaincopy
 
  1. $ pgrep firefox | xargs kill -s 9  



 

改进6:

 

[plain] view plaincopy
 
  1. $ ps -ef | grep firefox | awk '{print $2}' | xargs kill -9  
  2. kill: No such process  



 

有一个比较郁闷的地方,进程已经正确找到并且终止了,但是执行完却提示找不到进程。

其中awk '{print $2}' 的作用就是打印(print)出第二列的内容。根据常规篇,可以知道ps输出的第二列正好是PID。就把进程相应的PID通过xargs传递给kill作参数,杀掉对应的进程。

改进7

难道每次都要调用xargs把PID传递给kill?答案是否定的:

 

[plain] view plaincopy
 
  1. $kill -s 9 `ps -aux | grep firefox | awk '{print $2}'`  



 

改进8:

没错,命令依然有点长,换成pgrep。

 

[plain] view plaincopy
 
  1. $kill -s 9 `pgrep firefox`  



 

改进9——pkill:

看到pkill想到了什么?没错pgrep和kill!pkill=pgrep+kill。

 

[plain] view plaincopy
 
  1. $pkill -9 firefox  



 

说明:"-9" 即发送的信号是9,pkill与kill在这点的差别是:pkill的信号直接跟在 “-“ 后面,“-sxx”不是用来传递信号。之前我一直以为是 "-s 9",结果每次运行都无法终止进程。

改进10——killall

killall和pkill是相似的,不过如果给出的进程名不完整,killall会报错。pkill或者pgrep只要给出进程名的一部分就可以终止进程。

 

[plain] view plaincopy
 
  1. $killall -9 firefox  



 

总结:

1、

1)kill传递给要终止的进程的信号,实际上是POSIX信号,它们在signal.h里面定义附录摘录了部分POSIX信号,及其相关说明。支持两种方式传递终止信号:

[plain] view plaincopy
 
  1. (1)kill -s signal PID  
  2. 比如  
  3. $ kill -s 9 1234  

 

(2)kill -signal PID

$kill -9 1234

2)kill传递的信号也支持两种表示方式:信号名和信号数:

kill -s 9 1234 和kill -s KILL 1234 (SIGKILL)

kill -15 1234 和kill -TERM 1234 (SIGTERM)

当然其他信号也可以这样表示。

2、

上面各种改进方法,设计到的技巧,有两个在其他地方也有借鉴意义。

1)、进程号的获取部分

用awk提取第2列或者用cut提取第8-15个字母。其他地方也可一用awk提取第n列,或者用cut提取第m-第n哥字母。

2)、进程号的传递

用xargs把进程号传递给后面的kill做参数运行;

直接用两个“`”(“~”下面那个后单引号)把命令放到对应参数的位置来传递参数。

 

附录:各种信号及其用途

信号 描述 Linux x86[1] 的信号数
SIGABRT 进程退出 6
SIGALRM 计时器到时 14
SIGBUS 总线错误,进入内存对象未定义部分 7
SIGCHLD 子进程终止,停止或继续 17
SIGCONT 继续,如果停止 18
SIGFPE 浮点指针异常,错误的算数操作。 8
SIGHUP 挂起 1
SIGILL 非法指令 4
SIGINT 中断 2
SIGKILL 杀死(尽快终止) 9
SIGPIPE 无读操作时写入管道。 13
SIGQUIT 退出并转储核心 3
SIGSEGV 段非法 11
SIGSTOP 临时停止执行 19
SIGTERM 终止(要求终止) 15
SIGTSTP 由信号终止 20
SIGTTIN 后台进程试图从TTY 读入 ("in") 21
SIGTTOU 后台进程试图写入TTY ("out") 22
SIGUSR1 用户定义1 10
SIGUSR2 用户定义2 12
SIGPOLL Pollable event 29
SIGPROF 统计分布图用计时器到时 27
SIGSYS 不良的系统调用 31
SIGTRAP 跟踪/断点 陷阱 5
SIGURG I/O紧急信号,套接字紧急数据有效 23
SIGVTALRM 虚拟定时器超时 26
SIGXCPU 超出CPU时间限制 24
SIGXFSZ 超出文件大小限制 25

 

转自:http://blog.csdn.net/smarxx/article/details/6664219

 

--end

 

 

分享到:
评论

相关推荐

    Linux系统中关于Kill命令的进程调度问题

    在Linux系统中,管理和调度进程是一项基本操作,而`kill`命令则是进行进程管理的关键工具。这个命令允许用户向进程发送各种信号,从而控制进程的行为,如终止、暂停或恢复进程。当我们需要中断一个前台进程时,通常...

    linux中的僵尸进程

    ### Linux中的僵尸进程详解 #### 一、僵尸进程的概念与形成原因 在Linux系统中,程序的执行是以进程的形式存在的。每一个进程都有一个父进程(除非是init进程,它的PID为1,没有父进程),而它自身又可以作为其他...

    终止进程或进程组

    在Linux系统中,kill命令用于终止进程或进程组。该命令可以发送指定的信号到指定的进程或进程组。 kill命令的基本用法 kill命令的基本语法为:`kill [ -s signal | -p ] [ -a ] [ -- ] pid ...` 其中,`pid`指定...

    Linux 进程管理命令

    Linux 进程管理是通过进程管理工具实现的,如 ps、kill、pgrep 等工具。 2.1 ps 监视进程工具 ps 命令用来查看进程的信息,提供了进程的一次性的查看结果,但不提供实时监控。ps 命令有很多选项参数,如 l、u、j、...

    Linux打印进程树_linux打印_

    在Linux操作系统中,打印进程树是一项非常实用的功能,它能够帮助系统管理员和开发者直观地查看系统中的进程结构,了解各个进程间的父子关系。这在排查问题、监控系统状态或者优化性能时都非常重要。本文将详细讲解...

    linux linux进程管理 常用命令

    Linux 进程管理常用命令 ...在使⽤Windows系统的过程中,使⽤任务管理器,很⼤程度上是为了强制关闭“未反应”的软件,也就是杀死进程,还有两种主要的作⽤是判断服务器的健康状态和查看系统中所有的进程。

    linux 下的进程

    本文主要介绍了Linux环境中进程的基础知识,包括进程的概念、查看进程信息的方法以及如何终止进程。此外,还简单提到了进程间的通信机制,这是高级编程中非常重要的概念。对于想要深入了解Linux编程的读者来说,掌握...

    c语言linux版本杀死指定名称的进程

    在Linux操作系统中,使用C语言编写程序来杀死指定名称的进程是一项常见的任务,这涉及到对系统调用和进程管理的理解。下面将详细讲解这个过程涉及的知识点。 首先,我们需要了解Linux中的进程标识符(PID)。每个...

    user_kill.rar_Linux kill_ROOT

    在Linux和Unix操作系统中,`kill`命令是一个用于发送信号到指定进程的工具,通常用于终止或控制进程的运行。然而,非root用户通常没有权限杀死其他用户的进程,除非他们有特定的权限设置或者进程所有者赋予了这种...

    linuxps命令、kill命令及kill函数概述.pdf

    Linux 操作系统中,ps 命令和 kill 命令是两个非常重要的命令,ps 命令用于显示当前系统中的所有进程信息,而 kill 命令用于结束某个进程。下面将详细介绍 ps 命令和 kill 命令的使用方法。 一、ps 命令 ps 命令是...

    7-linux进程管理ppt课件.ppt

    Linux 进程管理是 Linux 系统中的一项重要内容,它涉及到进程的定义、分类、启动方法、状态转换、管理命令等方面的知识。下面将对这些内容进行详细的讲解。 1. 进程的定义 进程是指一个具有独立功能的程序在一个...

    linux守护进程

    在Linux系统中,守护进程是一种后台服务程序,它们在启动后与控制终端脱离,并在后台持续运行,为用户提供服务或者执行特定的任务。守护进程是操作系统中最常见的进程类型之一,如网络服务(HTTP服务器如Apache)、...

    linux 查找进程及终止进程操作的相关命令.docx

    Linux 操作系统中有三种不同类型的进程:交互进程、批处理进程和监控进程。交互进程是由一个 Shell 启动的进程,可以在前台或后台运行。批处理进程和终端没有联系,是一个进程序列。监控进程是 Linux 系统启动时启动...

    Linux查看端口、进程情况及kill进程的方法

    在Linux系统管理中,了解如何查看端口和进程情况以及如何终止不需要的进程是非常重要的技能。下面我们将详细探讨这些知识点。 首先,查看端口的常用命令是`netstat`。当你想知道哪个进程正在监听特定端口时,可以...

    Linux进程管理和日志管理

    ### Linux 进程管理和日志管理 #### 进程管理 **1.... 使用 `chkconfig --list` 命令可以列出所有服务及其当前的状态...通过上述命令,你可以有效地管理和监控 Linux 系统中的进程和网络,提高系统的稳定性和安全性。

    ubuntu查杀进程方法

    `ps` 命令是Linux中最常用的进程状态查看命令之一。通过`ps`命令可以查看当前运行的所有进程信息。 - **基本用法**:`ps [选项]` - `-e`: 显示所有进程。 - `-a`: 显示终端中所有进程的信息。 - `-x`: 显示...

    20. Linux开发-Linux下进程编程.pdf

    在Linux操作系统中,进程是程序的执行实例,具有独立的内存空间和执行上下文。当一个程序被加载并开始执行时,它就成为一个进程。每个进程都有一个唯一的进程ID(PID),可以通过`ps`命令来查看系统中的所有进程,如...

    linux进程管理与命令

    Linux 进程管理是指在 Linux 系统中对进程的创建、管理和终止的过程。进程是计算机处理器(CPU)正在执行的计算机程序,是动态的。以下是 Linux 系统中常用的进程管理命令和用法: 1. 查看系统进程命令:ps aux ...

    linux系统基础强化:08linux进程管理.ppt

    Linux系统中的进程管理是操作系统的核心组成部分,它涉及到了系统资源的分配、调度以及程序的执行。在Linux环境下,每一个正在执行的程序都会被系统赋予一个唯一的进程标识符(PID),这是进行进程管理的基础。 ...

Global site tag (gtag.js) - Google Analytics