| 今年第31期《计算机世界》报上登载了“在Unix系统中利用程序实现kill命令”一文,文章介绍了在Unxi系统中用C语言实现kill命令的方法。笔者在实践中找到了另外一种方法,通过Unix系统下Shell编程可以完成同样的功能,而且使用起来更加方便、灵活、便于维护。 |
| 本程序名为kill_tty,设计思路是把需要杀死的终端名作为kill_tty命令的参数,充分运用Unix系统的管道技术与awk语句的灵活性,找出相应终端的进程号,然后将其杀死。 |
| 用grep 命令检查在 /etc/ttytype文件当中是否存在参数$1, 因为所有正在使用的终端都在/etc/ttytype文件中有相应的设备类型,如果在/etc/ttytype文件里找不到参数$1所表示的终端号,说明$1是不合法的,终止程序运行。 |
| grep $1 /etc/ttytype>/dev/null 2>&1 |
| 2. 把终端名$1作为变量,由echo命令通过管道方式交给awk语句去处理,整个处理过程实际上就是用“ps -f -t ”命令检查出所要杀死终端的相应进程号,处理的结果通过管道方式由/bin/sh完成。 |
| echo $1 | awk ’{ print “ps -f -t ” $0}’| /bin/sh |
| UID PID PPID C STIME TTY TIME CMD |
| root 323 1 0 20:07:31 tty01 00:00:00 /bin/login boot |
| root 360 323 2 20:07:37 tty01 00:00:00 -sh |
| root 404 360 14 20:09:57 tty01 00:00:00 -sh |
| root 410 404 3 20:09:57 tty01 00:00:00 /bin/sh |
| root 411 410 0 20:09:57 tty01 00:00:00 ps -f -t tty01 |
| 这里第2列(PID)为进程标识号,终止任务需要的就是这个标识号,第8列(CMD)表示任务的程序名。 |
| 3. 有时候有些终端执行的任务可能比较多,因而与终端有关的进程比较多,我们没有必要将与这个终端有关的正在运行的所有进程全部杀死。只需要将这个终端的sh进程杀死,就终止了这个终端的所有任务。因为在Unix系统中,sh是用户层和核心层的接口,Unix系统就是通过它对终端上所有任务进行调度和管理的,没有它任何一台终端上的任务都无法完成。因此,要想重新激活某个终端,只要先找出与这个终端相关的sh进程号,然后将其杀死即可达到目的。 |
|