潜龙勿用,见龙在田
全部博文(540)
分类:
2008-10-21 10:33:34
控制多个进程命令
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 |
有许多停止“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”命令和信号的主要原因是尽可能明确地终止挂起和失控的进程,而不必重新启动或登出。
终止进程