作者信息:沈阳银行卡网络服务中心 石立
多用户的Linux系统在运行过程中,有时运算速度会突然慢下来,甚至从键盘输入字符也得过好久才会有反应。一般地,出现这种情况的原因是计算机在运行一个非常耗费CPU的进程。这样的进程有时是某个人在执行一个很占CPU的程序,例如程序进入了死循环,有时则可能是系统中出了什么意外情况,系统本身在进行处理。无论是哪一种情况,系统管理员都应及时找出这样的进程,并做出相应的处理。
Linux虽然提供了一些处理程序,但这些程序只能在进程结束后才能显示运行时间和占用的CPU时间等信息,不能实时计算单位时间内哪一个进程占用的CPU时间较多。笔者用shell语言编写了一段程序,利用Linux提供的一些实用程序,实现了对进程的实时监视。
实用程序
shell中使用了 ps、cut、diff等Linux实用程序,它们的功能简单介绍如下:
● ps : 用来显示当前系统中进程的有关信息,加-e 参数显示系统中所有进程的简单信息,使用 -f 参数则显示各进程完整的信息;
● cut: 用于以列为单位对文件进行剪裁,参数 “-c -15,33-”表示把输入文件每行头15个字符及第33个字符以后直到行尾的所有字符放入输出文件;
● echo:用于在屏幕上显示提示信息;
● sleep:可以让 shell 程序等待若干秒,然后再执行下面的语句;
● diff: 用于对两个文件进行比较,并把不同之处显示出来;
● sort: 用于对文件中的各行进行排序,可以显示排序结果;
● grep:用来找出文件中满足一定条件的行,参数“^”表示找出第一列为空格的各行。
另外,程序中“|”为管道符号,可实现把前面命令的输出作为后面命令的输入的功能,这样就可省略生成中间文件的步骤,提高执行效率。“>”表示对输出进行重定向,把本来应显示在屏幕上的东西输出到文件中。
shell程序
shell程序首先取得系统中所有进程的信息并把其中有用的字段放入临时文件 tt1 中。接着让程序等待20秒钟(时间可依具体情况进行调整)。然后再一次取得所有进程的信息,并把所有的字段放入临时文件 tt2 中。这时对两个临时文件进行比较,找出前后20秒信息不同的那些进程(其中就有消耗CPU时间已经发生了变化的进程)。去掉进行比较时产生的“>”和“<”,把结果存入临时文件tt3中。然后对tt3中的内容进行排序,把耗费CPU时间发生变化的同一进程的前后信息排在一起。
ps -ef|cut -c -15,33->tt1
echo Please wait a while...
sleep 20
ps -ef|cut -c -15,33->tt2
echo Attention !
echo =========================
diff tt1 tt2|cut -c 2->tt3
sort tt3|grep ‘^ ’|cut -c -83|grep -v 0:00
echo =========================
echo That is ok!
rm tt1 tt2 tt3
上述grep‘^ ’是用来去掉执行此shell程序时产生的一些中间命令进程的信息。再用cut删去每行中过长的进程信息,使输出更加清晰。而grep -v 0:00 则用来去掉前后20秒只出现过一次的进程。这样,在前后20秒耗费CPU时间不同的进程就显示在屏幕上了,从中可以很容易地找出出现问题的进程。最后,为了不在系统中留下无用的垃圾文件,还要把3个临时文件全都删除。
多用户的Linux系统在运行过程中,有时运算速度会突然慢下来,甚至从键盘输入字符也得过好久才会有反应。一般地,出现这种情况的原因是计算机在运行一个非常耗费CPU的进程。这样的进程有时是某个人在执行一个很占CPU的程序,例如程序进入了死循环,有时则可能是系统中出了什么意外情况,系统本身在进行处理。无论是哪一种情况,系统管理员都应及时找出这样的进程,并做出相应的处理。
Linux虽然提供了一些处理程序,但这些程序只能在进程结束后才能显示运行时间和占用的CPU时间等信息,不能实时计算单位时间内哪一个进程占用的CPU时间较多。笔者用shell语言编写了一段程序,利用Linux提供的一些实用程序,实现了对进程的实时监视。
实用程序
shell中使用了 ps、cut、diff等Linux实用程序,它们的功能简单介绍如下:
● ps : 用来显示当前系统中进程的有关信息,加-e 参数显示系统中所有进程的简单信息,使用 -f 参数则显示各进程完整的信息;
● cut: 用于以列为单位对文件进行剪裁,参数 “-c -15,33-”表示把输入文件每行头15个字符及第33个字符以后直到行尾的所有字符放入输出文件;
● echo:用于在屏幕上显示提示信息;
● sleep:可以让 shell 程序等待若干秒,然后再执行下面的语句;
● diff: 用于对两个文件进行比较,并把不同之处显示出来;
● sort: 用于对文件中的各行进行排序,可以显示排序结果;
● grep:用来找出文件中满足一定条件的行,参数“^”表示找出第一列为空格的各行。
另外,程序中“|”为管道符号,可实现把前面命令的输出作为后面命令的输入的功能,这样就可省略生成中间文件的步骤,提高执行效率。“>”表示对输出进行重定向,把本来应显示在屏幕上的东西输出到文件中。
shell程序
shell程序首先取得系统中所有进程的信息并把其中有用的字段放入临时文件 tt1 中。接着让程序等待20秒钟(时间可依具体情况进行调整)。然后再一次取得所有进程的信息,并把所有的字段放入临时文件 tt2 中。这时对两个临时文件进行比较,找出前后20秒信息不同的那些进程(其中就有消耗CPU时间已经发生了变化的进程)。去掉进行比较时产生的“>”和“<”,把结果存入临时文件tt3中。然后对tt3中的内容进行排序,把耗费CPU时间发生变化的同一进程的前后信息排在一起。
ps -ef|cut -c -15,33->tt1
echo Please wait a while...
sleep 20
ps -ef|cut -c -15,33->tt2
echo Attention !
echo =========================
diff tt1 tt2|cut -c 2->tt3
sort tt3|grep ‘^ ’|cut -c -83|grep -v 0:00
echo =========================
echo That is ok!
rm tt1 tt2 tt3
上述grep‘^ ’是用来去掉执行此shell程序时产生的一些中间命令进程的信息。再用cut删去每行中过长的进程信息,使输出更加清晰。而grep -v 0:00 则用来去掉前后20秒只出现过一次的进程。这样,在前后20秒耗费CPU时间不同的进程就显示在屏幕上了,从中可以很容易地找出出现问题的进程。最后,为了不在系统中留下无用的垃圾文件,还要把3个临时文件全都删除。