2013-08-29 70 views
1

我有一個shell腳本,應該殺死一個分離的屏幕會話,如果它存在。劇本是運行命令,如果屏幕存在

if ! screen -list | grep -q "ScreenName"; then 
    screen -S ScreenName -X quit 
fi 

遺憾的是,似乎在屏幕-S ... -X退出命令總是當我運行該腳本,並在屏幕會話不存在它仍然輸出「找不到屏幕會話中運行BC。 「當我刪除!並且屏幕會話正在運行,它不會中止正在運行的會話。

問題是什麼?由於

+3

它適用於我,如果你拿出'!'。你確定你使用正確的屏幕名稱嗎? – ThisSuitIsBlackNot

+3

'!'肯定是錯的;如果指定的會話*不存在,它會指示shell運行主體。當你刪除'!'時,運行給定的命令,然後再次運行'screen -list',你的會話是否仍然出現? – chepner

+0

消除砰砰聲似乎這次...但我之前嘗試過,它不工作。屏幕名稱之間一定有區別,因爲我想不出任何其他原因 – thaweatherman

回答

4

的grep有返回代碼的混亂約定。當找到字符串時返回0,當不匹配時返回1。你應該省略!在條件。

+0

這解決了這個問題,雖然我之前嘗試過,並且出於任何原因沒有工作。在創建測試時,我必須錯誤地鍵入屏幕名稱(它相當長)。 – thaweatherman

5

要擺脫「找不到screen會話」的消息,重定向的screen標準錯誤:

screen -list 2>/dev/null 

接下來,請記住,如果會議有密碼保護-X不起作用。

然後,使用-rscreen知道你只是想殺死分離會議,而且也爲grepif不再需要。

全部放在一起:

screen -r -S "ScreenName" -X quit 2>/dev/null 
+0

我喜歡這個作爲我的殺人聲明的一個很好的改進 – thaweatherman

1

@Sir通過Athos答案是相當不錯的,如果你不想忽略有效錯誤,或者只是想更多的方法來做事,將來,你可以用這個作爲參考:

screen -ls 2>&1 | grep '(Detached)' | grep -o 'ScreenName' | xargs -I{} -n 1 -r screen -r -S {} -X quit 
  1. screen -ls 2>&1列表會話,所有的輸出到標準輸出爲分離會話
  2. grep -o 'ScreenName'的屏幕名,只輸出屏幕名篩選
  3. grep '(Detached)'過濾器通過xargs的-n 1一次一個xargs -I{} -n 1 -r screen -r -S {} -X quit運行輸出,-r不如果沒有輸出,-I{}使用{}爲你的論點更換位置,因爲它不是在最後運行,運行命令

代碼示例:

evan> screen -ls 
There are screens on: 
     15491.pts-2.x  (08/29/2013 10:43:53 AM)  (Detached) 
     31676.pts-41.x  (08/28/2013 10:55:00 AM)  (Attached) 
2 Sockets in /var/run/screen/S-evan. 

evan> screen -ls 2>&1 | grep '(Detached)' | grep -o '15491.pts-2.x' | xargs -I{} -n 1 -r screen -r -S {} -X quit 

evan> screen -ls 
There is a screen on: 
     31676.pts-41.x  (08/28/2013 10:55:00 AM)  (Attached) 
1 Socket in /var/run/screen/S-evan. 

evan> screen -ls 2>&1 | grep '(Detached)' | grep -o '15491.pts-2.x' | xargs -I{} -n 1 -r screen -r -S {} -X quit 

evan>