2013-11-15 38 views
0

如果我发现有两个用户登录到系统中(UserA和UserB),那么我该如何找出这两个用户运行的进程。但是,这里的诀窍是脚本将在没有任何键盘输入的情况下在无人参与的批处理中运行。除了被调用。使用unix脚本来获取用户运行的进程

我知道脚本的第一部分是 谁| AWK“{打印$ 1}” 这个输出是 用户A 用户B

我想知道的是,我该如何使用这个输出,并与一些ps命令自动推它,并获得所需的结果。

+0

你有没有在使用'ps'命令来做到这一点? – chepner

+0

不,我不知道如何把出了谁命令ps命令来获得由目前的用户运行的进程失败的尝试登录。 – anansharm

回答

2

我终于找到了我正在寻找的单线程,在其他答案的帮助下(更新了,如果没有用户登录 - 看评论)。

ps -fU "`who | cut -d' ' -f1 | uniq | xargs echo`" 2> /dev/null 

反引号内的东西被执行,并被“插入现场”。其工作原理如下:

who    : you know what that does 
cut -d' '  : split strings into fields, using ' ' as separator 
-f1    : and return only field 1 
uniq   : return only unique entries 
xargs echo  : take each of the values piped in, and send them through echo: this strips the \n 
2> /dev/null : if there are any error messages (sent to 2: stderr) 
       : redirect those to /dev/null - i.e. "dump them, never to be seen again" 

的所有输出是

user1 user2 user3 

...然而,许多有。而你再打电话ps-fU标志,要求这些用户的所有过程全格式(当然你也可以改变这些标志来得到你想要的格式,只是不停地在那里-U只是事情之前在“``”

ps -fU user1 user2 user3 
+2

+1嗯,我喜欢这种风格。这原本是我的做法,但我不喜欢* ps(1)*在没有人登录时出错。 – pilcrow

+1

@pilcrow谢谢。这个问题确实是以“两个用户登录”开始的,所以我诚实地不考虑如果谁不返回任何事情会发生什么。保存的优点是错误信息发送到'stderr' - 所以你可以在末尾添加'2>/dev/null',并且错误信息被抑制。 – Floris

0

不知道如果我正确理解你的问题,但你可以管PS的通过grep的输出获得的过程由特定用户运行的,就像这样:

ps -ef | grep '^xxxxx ' 

其中xxxxx是用户。

+0

如何在没有我输入当前登录人员的用户ID的情况下自动执行此操作。因此,who命令应该自动转到ps命令并提供所需的结果。我该怎么做? ? – anansharm

2

获取用户(使用谁)的列表,保存到一个文件,然后列出所有的进程,和grep那(使用您刚刚创建的文件),

tempfile=/tmp/wholist.$$ 
who | cut -f1 -d' '|sort -u > $tempfile 
ps -ef |grep -f $tempfile 
rm $tempfile 
+0

我想到了这个解决方案,但一直在撞墙试图做到这一点没有临时文件...显然“只是让它工作”是正确的做法。但出于好奇 - 你可以得到这个工作(也许与'xargs')没有临时文件? – Floris

+1

@弗洛里斯,是的 - 你也可以让它在没有grep的情况下工作。看到我的答案。 – pilcrow

2
LOGGED_IN=$(who | awk '{print $1}' | sort -u | xargs echo) 

[ "$LOGGED_IN" ] && ps -fU "$LOGGED_IN" 

standard switch -U将限制输出到只有那些真实用户ID对应于任何给定的参数的进程。 (例如,ps -f -U“UserA UserB”)。

+0

你的回答激发了我对于我提出的单线 - “只是因为我不得不”。谢谢。 – Floris