![NFS 伺服器重新啟動後 ls 掛起](https://rvso.com/image/515017/NFS%20%E4%BC%BA%E6%9C%8D%E5%99%A8%E9%87%8D%E6%96%B0%E5%95%9F%E5%8B%95%E5%BE%8C%20ls%20%E6%8E%9B%E8%B5%B7.png)
我有伺服器 A 和伺服器 B。
兩者都在 EC2 上運行。
有時我必須關閉 B 並啟動一個新實例(相同的實例)。 B 備份後,嘗試在 A 上的掛載目錄(例如 ls)內執行任何操作都會掛起。
我正在嘗試設定一個 cron 來檢查安裝狀態,並在出現任何問題時重新安裝。
有什麼方法可以檢查掛載的狀態嗎?
答案1
您可以分叉,讓子進程進入目錄,然後退出子進程。讓父進程監視子進程是否存在並設定逾時。如果你有一個陳舊的掛載,子進程將無法退出並且會停留很長時間,因此父進程會發生逾時。讓父進程殺死 -9 子進程並嘗試卸載。
不過,您可能遇到的問題是,如果任何其他進程正在使用損壞的安裝上的文件,那麼您將無法在不先終止這些進程的情況下卸載它。您(通常)可以使用 lsof 或 fusions 發現是否有任何進程正在使用陳舊掛載上的不可用資源。
不過,我會避免自動神奇地殺死任意進程;向自己發送通知以進行進一步手動調查。
為了減少發生這種情況的可能性,您可能需要研究自動掛載程序,它在需要/請求伺服器上的資源之前不會掛載卷,並在不再需要時自動卸載它。
-- 順便說一句,為了使其更易於搜索,您可能需要使用“stale”、“stuck”、“nfs”和“mount”等字眼來標記它。此現象並非特定於您對 ec2 的使用。
答案2
我意識到當 NFS 伺服器重新啟動時,它會更改它的 ip,因此掛載將無法工作。
編寫此腳本檢查 NFS 主機的 ip 是否是目前掛載中使用的 ip,如果不是,則卸載並重新掛載。將來可能會幫助某人。
#!/bin/bash
NFS_HOST=$(mount | grep nfs | awk '{ print $1 }' | cut -d ":" -f 1)
NFS_HOST_PATH=$(mount | grep nfs | awk '{ print $1 }' | cut -d ":" -f 2)
host $NFS_HOST
if [[ $? -ne 0 ]]; then
echo "NFS host $NFS_HOST doesn't exist!"
exit 2
fi
MOUNT_POINT=$(mount | grep $NFS_HOST | awk '{ print $3 }')
NFS_IP=$(host $NFS_HOST | awk '{ print $4 }')
mount | grep "$NFS_IP"
if [[ $? -ne 0 ]]; then
umount -fl $MOUNT_POINT
mount "$NFS_HOST:$NFS_HOST_PATH" $MOUNT_POINT
fi