2013-11-15 39 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