请参阅bash中特定用户的PID

时间:2013-10-16 19:53:28

标签: bash command-line process pid

所以我在找到一种方法来使用管道将PID与顶层隔离并且无法使用awkperl时遇到了一些麻烦。到目前为止,我能够隔离特定的用户(不能是你的用户名或root用户),现在我不确定如何从这里开始,我尝试使用cut和其他几个选项,但它不是工作。到目前为止,这是我的工作:

top -n 1 | tail -n +8 | grep -Ev '\broot\b | \bmyUserName\b` 

这会输出所有信息减去标题,除了PID之外我还需要删除其他所有内容......任何人都可以提供帮助吗?

编辑:此外,现在似乎工作的只是添加| cut -c 4-11,它只显示PID,因为只有一个其他用户不是系统上的root用户。我不确定它是否会有效,但有没有更好的想法如何让它发挥作用?

2 个答案:

答案 0 :(得分:0)

理论上:

top -n 1 | tail -n +8 | grep -Ev ' root | myUserName ' |
sed -e 's/^[ ]*\([0-9][0-9]*\) .*/\1/'

sed命令查找行首,可选空格后跟数字以及空白和尾随垃圾。但是,这不起作用,因为top生成屏幕控制字符:

28433 jleffler  20   0 1511m 403m  31m S    2  1.3  70:35.76 chrome  

看起来没问题,但是当通过十六进制转储推送时,输出为:

0x0000: 1B 28 42 1B 5B 6D 32 38 34 33 33 20 6A 6C 65 66   .(B.[m28433 jlef
0x0010: 66 6C 65 72 20 20 32 30 20 20 20 30 20 31 35 31   fler  20   0 151
0x0020: 30 6D 20 34 30 34 6D 20 20 33 31 6D 20 53 20 20   0m 404m  31m S  
0x0030: 20 20 34 20 20 31 2E 33 20 20 37 30 3A 33 37 2E     4  1.3  70:37.
0x0040: 38 37 20 63 68 72 6F 6D 65 20 20 20 20 20 20 20   87 chrome       

要取消此操作,请使用top -b(批处理模式):

top -b -n 1 | tail -n +8 | grep -Ev ' root | myUserName ' |
sed -e 's/^[ ]*\([0-9][0-9]*\) .*/\1/'

这应该生成一个PID列表;它为我做了。

如果您被允许awk,则可以将其简化为:

top -b -n 1 | awk 'NR<=8 || $2~/^(root|myUserName)$/ {next} {print $1}'

所有这些都取决于“使用top是一个很好的方法”,而不是使用ps(这是用于收集PID的常用工具。

答案 1 :(得分:0)

如果您希望rootsome_user未生成所有流程的PID,则可以使用ps-U user以及否定选项{{1}列出这些流程}}:

-N

ps -U root -U some_user -N -o pid 选项指定我们只对输出中的PID感兴趣。 现在,您可以在循环或类似的环境中轻松地使用这些PID:

-o