Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2517851
  • 博文数量: 540
  • 博客积分: 11289
  • 博客等级: 上将
  • 技术积分: 6160
  • 用 户 组: 普通用户
  • 注册时间: 2008-02-11 20:27
个人简介

潜龙勿用,见龙在田

文章分类

全部博文(540)

文章存档

2018年(2)

2013年(5)

2012年(24)

2011年(104)

2010年(60)

2009年(217)

2008年(128)

分类:

2008-10-21 10:33:34

kill 命令详解
功能说明:删除执行中的程序或工作。

  语  法:kill [-s <信息名称或编号>][程序] 或 kill [-l <信息编号>]

  补充说明:kill可将指定的信息送至程序。预设的信息为SIGTERM(15),可将指定程序终止。若仍无法终止该程序,可使用SIGKILL(9)信息尝试强制删除程序。程序或工作的编号可利用ps指令或jobs指令查看。
  参  数:
  -l <信息编号>  若不加<信息编号>选项,则-l参数会列出全部的信息名称。
  -s <信息名称或编号>  指定要送出的信息。
  [程序]  [程序]可以是程序的PID或是PGID,也可以是工作编号

控制多个进程命令

Linux可使用户同时运行多个进程,还允许用户或系统管理员能控制正在运行的进程。

nohup命令

理论上,我们一般退出Linux系统时,会把所有的程序全部结束掉,包括那些后台程序。但有时候,例如您正在编辑一个很长的程序,但是您下 班或是有事需要先退出系统,这时您又不希望系统把您编辑那么久的程序结束掉,希望退出系统时,程序还能继续执行。这时,我们就可以使用nohup命令使进 程在用户退出后仍继续执行。

一般这些进程我们都是让它在后台执行,结果则会写到用户自己的目录下的nohup.out这个文件里(也可以使用输出重定向,让它输出到一个特定的文件)。

例: $ nohup sort sales.dat &

这条命令告诉sort命令忽略用户已退出系统,它应该一直运行,直到进程完成。利用这种方法,可以启动一个要运行几天甚至几周的进程,而且在它运行时,用户不需要去登录。

nohup命令把一条命令的所有输出和错误信息送到nohup.out文件中。若将输出重定向,则只有错误信息放在nohup.out文件中。


------------------对于我们系统管理员和普通用户来说,我们主要关心的是启动、停止和重新启动服务、停止失控的进程和被挂起的进程-------------------

由于职责的需要,您不得不费力 地阅读那些令您感到费解的晦涩的Linux应用程式的说明文档。然后,您将运行指令和编辑配置文档。一切都在正常运行,生活真美好。但是,您知道,好时光 不会永远持续下去。当您碰到令人恐惧的“send the process a SIGHUP”提示时,好时光结束了。

  什么是“SIGHUP”,您怎样发送他?他像是您送给您的恋人的一束花吗?虽然您能够肯定这不是个命令行指令,但是,您还是试着键入他。当然,这没有结果。然后,您检查一下键盘。哦,没有SIGHUP键。于是您又重新阅读这个应用程式的参考指南,看到下面这段文字:

  当收到一个hangup(进程结束)信号时,sshd程式会重新阅读配置文档。通过执行启动程式时的命令及选项来发送SIGHUP信号,如:/usr/sbin/sshd。

信号和进程控制

  这个问题主要属于信号和进程控制的范 畴。对于我们系统管理员和普通用户来说,我们主要关心的是启动、停止和重新启动服务、停止失控的进程和被挂起的进程,并且尽可能不中断系统运行。因为不同 的操作系统和不同的命令外壳处理信号的方式都不相同,我们这里只介绍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的Kill命令

  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系统领域的门票。这些知识能够让你像做外科手术一样对系统进行维护,而不用在遇到问题时每一次都重新启动系统,就像我们知道的某些蹩脚的操作系统那样。

[root@localhost ~]# kill -l
 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL
 5) SIGTRAP      6) SIGABRT      7) SIGBUS       8) SIGFPE
 9) SIGKILL     10) SIGUSR1     11) SIGSEGV     12) SIGUSR2
13) SIGPIPE     14) SIGALRM     15) SIGTERM     16) SIGSTKFLT
17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU
25) SIGXFSZ     26) SIGVTALRM   27) SIGPROF     28) SIGWINCH
29) SIGIO       30) SIGPWR      31) SIGSYS      34) SIGRTMIN
35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3  38) SIGRTMIN+4
39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12
47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14
51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10
55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7  58) SIGRTMAX-6
59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX

资源

  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资源消灭一个客户程序
阅读(1284) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~