shell编程
问题描述
用户输入一个数字,能够给出系统中以该数字为pid的进程详情,将详情输出到文件output.txt中。
要求:
(1)使用 ps aux 命令得到进程的详细信息;
(2)如果没有以该数字为pid的进程,程序会提示“The process does not exist!”,并再次开始循环,让用户再次输入直到以输入的数字为pid的进程存在为止;
(3)有一个菜单提供给用户输入;
(4)包含kill一个进程的功能。
1. 设计思路
程序主要分为4个部分:函数show_details输出用户指定进程的详细信息,函数kill_process杀死用户指定的进程,函数menu把选择菜单打印在屏幕上,主函数调用上述3个函数。
在show_details函数中,最外层为循环语句。在循环语句中,首先使用read命令读取用户输入的数字,赋值给变量$pid1,用flag=$(ps --no-heading $pid1| wc -l)判断进程是否存在,若存在,flag返回值为1,不存在返回值为0。若flag值为0,则一直循环让用户再次输入;若flag值为1,使用ps aux | awk -v n=$pid1 'NR==1 || $2==n{print}' > output命令将进程的详细信息输出到文件output.txt中。
在kill_process函数中,首先用ps aux命令列出全部进程供用户查看,以便用户选择想要杀死的进程。然后使用read命令读取用户输入的数字,赋值给变量$pid2,使用kill -9 $pid2杀死进程。
在menu函数中,主要使用echo语句输出菜单选项。因为菜单选项为0或1或2,均为一个字符,故使用read -n 1 option命令读取用户输入的第一个字符作为用户的选择,赋值给变量option。无须按回车,即开始执行下一条语句。
在主函数中,使用循环语句和case语句完成菜单显示和用户选择。在循环中首先调用menu函数输出菜单,然后进入case语句:输入0代表退出,跳出循环;输入1代表得到进程的详细信息,调用函数show_details;输入2代表杀死进程,调用函数kill_process;其他输入均提示“Wrong option”。case语句结束后,使用 read -n 1 line 实现了按任意键继续,从显示菜单开始循环的功能。
参考代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
|
2. 运行结果
2.1 开始菜单界面
按下回车键后显示菜单供用户选择,如下图:
2.2 检验得到进程详细信息的功能
-
系统中存在以输入数字为pid的进程:
输入1,会提示信息“Please enter a pid:”。然后输入2,按下回车,提示信息“The details of the process is shown in output.txt”。在“文件”中找到output.txt,打开可见pid为2的进程的详细信息,结果如下图。
-
系统中不存在以输入数字为pid的进程:
按任意键继续,重新回到菜单选择界面。输入1,在提示信息“Please enter a pid:”后输入100,按下回车,提示信息“The process does not exist!”,再次要求用户“Please enter a pid:”,结果如下图。
2.3 检验杀死进程的功能
在菜单选择界面输入2,程序输出系统中所有进程的详细信息,并提示信息“Above are details of all processes. Please enter a pid:”。然后输入2506,结果如下图。
2.4 检验对选择错误的处理
在菜单选择界面,如果输入了菜单中没有的选项,结果如下图。
2.5 检验退出的功能
在菜单选择界面,输入0,则程序终止,结果如下图。