我有一個shell腳本,應該殺死一個分離的屏幕會話,如果它存在。劇本是運行命令,如果屏幕存在
if ! screen -list | grep -q "ScreenName"; then
screen -S ScreenName -X quit
fi
遺憾的是,似乎在屏幕-S ... -X退出命令總是當我運行該腳本,並在屏幕會話不存在它仍然輸出「找不到屏幕會話中運行BC。 「當我刪除!並且屏幕會話正在運行,它不會中止正在運行的會話。
問題是什麼?由於
我有一個shell腳本,應該殺死一個分離的屏幕會話,如果它存在。劇本是運行命令,如果屏幕存在
if ! screen -list | grep -q "ScreenName"; then
screen -S ScreenName -X quit
fi
遺憾的是,似乎在屏幕-S ... -X退出命令總是當我運行該腳本,並在屏幕會話不存在它仍然輸出「找不到屏幕會話中運行BC。 「當我刪除!並且屏幕會話正在運行,它不會中止正在運行的會話。
問題是什麼?由於
的grep有返回代碼的混亂約定。當找到字符串時返回0,當不匹配時返回1。你應該省略!在條件。
這解決了這個問題,雖然我之前嘗試過,並且出於任何原因沒有工作。在創建測試時,我必須錯誤地鍵入屏幕名稱(它相當長)。 – thaweatherman
要擺脫「找不到screen會話」的消息,重定向的screen
標準錯誤:
screen -list 2>/dev/null
接下來,請記住,如果會議有密碼保護-X
不起作用。
然後,使用-r
讓screen
知道你只是想殺死分離會議,而且也爲grep
和if
不再需要。
全部放在一起:
screen -r -S "ScreenName" -X quit 2>/dev/null
我喜歡這個作爲我的殺人聲明的一個很好的改進 – thaweatherman
@Sir通過Athos答案是相當不錯的,如果你不想忽略有效錯誤,或者只是想更多的方法來做事,將來,你可以用這個作爲參考:
screen -ls 2>&1 | grep '(Detached)' | grep -o 'ScreenName' | xargs -I{} -n 1 -r screen -r -S {} -X quit
screen -ls 2>&1
列表會話,所有的輸出到標準輸出爲分離會話grep -o 'ScreenName'
的屏幕名,只輸出屏幕名篩選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>
它適用於我,如果你拿出'!'。你確定你使用正確的屏幕名稱嗎? – ThisSuitIsBlackNot
'!'肯定是錯的;如果指定的會話*不存在,它會指示shell運行主體。當你刪除'!'時,運行給定的命令,然後再次運行'screen -list',你的會話是否仍然出現? – chepner
消除砰砰聲似乎這次...但我之前嘗試過,它不工作。屏幕名稱之間一定有區別,因爲我想不出任何其他原因 – thaweatherman