2015-09-20 32 views
-1

我正在研究一個腳本,只有在所有虛擬機關閉後纔會關閉服務器。我發現這樣做的最可靠的方法是: ssh [email protected] 'virsh list'使用sed從'virsh list'輸出中刪除頭文件

,這將給我是這樣的:

Id Name       State 
---------------------------------------------------- 
2  DNSserver      running 
3  salt       running 
4  logserver      running 
5  webserver      running 
6  mail       running 
7  fileserver      running 

當所有的虛擬機都將關閉,它只會顯示:

Id Name       State 
---------------------------------------------------- 

所以我正在尋找一種方法讓我的bash腳本等待,直到列表爲空,然後發出關機命令到服務器。我不想依靠expect,因爲並非所有的系統都具有該命令。這是我到目前爲止有:

#!/bin/bash 
# stuff to shutdown VMs here (snipped) # 
output=$(ssh [email protected] 'virsh list') 
# need something here to strip out the header 
[ "$output" == "" ] && shutdown -h now 

我用兩個grepsed變化嘗試,但我得到了破折號錯誤。例如:

$ sed -i "Id Name State ----------------------------------------------------" $output 
sed: unrecognized option '----------------------------------------------------' 
+0

如果你想用'sed'去掉文件的前兩行然後例如:'sed'1,2d'file' – user3439894

+0

對,但我沒有處理文件。我正在處理存儲在變量中的字符串。 –

+1

只需要數行:'[「$(ssh root @ vmserver'virsh list'| wc -l)」-le 2] && shutdown -h now' – John1024

回答

1

的grep爲0或多個空格和多條線路,如果不爲空,關機:

[ -n "$(ssh [email protected] 'virsh list' | grep -E '^\s*\d+')" ] && shutdown -h

的grep爲0或多個空格和多個線,如果1行或多行匹配,關機:

[ "$(ssh [email protected] 'virsh list' | grep -E '^\s*\d+' | wc -l)" -ge 1 ] && shutdown -h

消除輸出的前兩行,它們計數。如果線路存在,則關閉。 我個人認爲這是不安全的,因爲它是不可預測的。有沒有辦法知道這些前兩行分別爲 [ "$(ssh [email protected] 'virsh list' | sed '1,2d' | wc -l)" -ge 1 ] && shutdown -h

+0

這就是爲什麼我最初尋找一種方法來刪除* expected *輸出,然後基於關閉邏輯關於是否還有剩下的東西,然而所有的破解都讓我感到困惑,就像我在我的問題中記錄的那樣,'sed'和'grep'。 –

2

我只使用...

for VM in $(virsh list --state-running --name); do echo "shotdown $VM"; done 

...在bash shell腳本來關閉我的所有虛擬機。 「回聲」在哪裏,你可以把你的關機代碼!