Shell-Script
防止shell腳本掛在一行上
我編寫了一個 shell 腳本,可以幫助我使用
df -h
. 我包括下面的程式碼片段s_arch_1_per=`sshpass -p 'password' ssh root@server_ip_1 "df -h | grep '/Archive_1'| awk '{print $ (NF-1)}'"` master_per=`sshpass -p 'password' ssh nidhal@server_ip_2 "df -h | grep '/dev/mapper/centos-root'| awk '{print $ (NF-1)}'"` arch_5_per=`df -h | grep '/archive_1'| awk '{print $ (NF-1)}'`
問題是在本地或遠端系統中,
df -h
有時由於掛載點損壞而導致執行掛起,從而阻止了我的整個外殼程序完全執行。df -h
當在其中一個系統中不起作用時,如何防止我的腳本卡在一行上?如果該行執行時間過長,我希望我的腳本跳過一行並繼續到下一行。
不要將pipe
df
的輸出輸入grep
(這會導致df
查詢所有已安裝的文件系統,甚至是那些沒有響應的文件系統 - 例如掛起的 NFS 安裝),df
而是將您想要資訊的文件系統作為參數提供。例如,而不是:
df -h | grep '/Archive_1
利用:
df -h /Archive_1
現在
df
只嘗試獲取有關/Archive_1
掛載點的資訊。您可以使用設備節點或掛載點作為參數。使用 GNU df,
--output
如果你想要的只是大小,你也可以使用該選項……所以你不需要使用 awk(刪除第一行,即標題,使用 sed 或其他東西仍然有用,因為 GNU df 沒有’沒有選項來抑制標題輸出)。例如df -h --output=size /Archive_1 | sed 1d
此外,您不應將反引號用於命令替換。它們已過時且已棄用。改為使用
$()
。總之,這將是這樣的:
s_arch_1_per=$(sshpass -p 'password' ssh root@server_ip_1 \ 'df -h --output=size /Archive_1 | sed 1d')
最後,您應該在 ssh 中使用基於密鑰的身份驗證,而不是密碼身份驗證。但這是一個不同問題的答案。
順便說一句,如果您仍然想要/需要使用 awk,則需要
$
在欄位編號之前轉義任何符號,就\$
好像它在 double-quotes 內一樣。例如\$(NF-1)
,而不僅僅是$(NF-1)
.Shell 的引用是一個 PITA,當您需要執行多個級別的引用時更是如此 - 例如,當您通過 ssh 將引用的 awk 腳本發送到遠端主機時。
請參閱為什麼我的 shell 腳本會因空格或其他特殊字元而窒息?有關 shell 引用的各種有用資訊和提示。