有人可以帮我编写一个 shell 脚本来给我以下信息:
- 进程的状态;
- 进程在CPU中经过的时间;
- 使用的总内存(以KB为单位);
- 打开文件描述符的数量;
- 启动进程的命令行; - 该进程启动的进程的PID。
它应该是 JSON 格式,并且必须如下所示:
{
"pid" : 2714,
"status" : "S",
"usageCPU" : 1233,
"usageMemoire" : 404,
"numFD" : 12,
"commande line" : "/bin/bash",
"task" :
[
{ "pid" : 2714 },
{ "pid" : 4230 }
] }
还有一件小事:
输入参数:
您的程序将采用以下输入参数: - 我们想要的信息的进程的 pid。总之,启动您的程序将需要命令:./your_program 2714
错误格式
如果因为 pid 号不好而找不到必要的信息,那么它将返回以下字符串:E_PID_NOT_FOUND
PS我是一名数学专家,但我必须写这个,而且我不知道如何做到这一点。
答案1
大致如下:
name_of_process=$1
ps aux\
| grep $name_of_process\
| grep -v "grep"\
| awk '{print \"{\
\"pid\" : $2,\
\"status\" : $8,\
\"usageCPU\" : $10,\
\"usageMemoire\" : $4,\
\"numFD\" : $some_field_num,\
\"commandline\" : split($NF)[0]\
\":[{ \"pid\" : $2},{\"pid\" : $some_field_num_too }]}'
因此,我有效地调用ps
(带有aux
标志),它给出了所有进程及其数据的列表,将其输出通过管道传输到grep
仅获取包含我们进程名称的行,grep
再次将其输出通过管道传输到其中,而不是寻找短语“grep”(相信我,这是必要的),然后最后将数据(现在只是一行)传输到 awk 中。
然后 awk 按列分割数据(我认为默认分隔符是 TAB),在 awk 中 $number 语法对应于所给数据的一列。
对于 numFD 和 ppid ,我不知道这些列是什么,因为默认情况下它们不会打印,所以也许检查ps
(除了aux
)的额外标志,看看有哪些可用选项。