NFS 伺服器重新啟動後 ls 掛起

NFS 伺服器重新啟動後 ls 掛起

我有伺服器 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

相關內容