2011-09-26 240 views
0

我需要兩個腳本的幫助,我試圖將其作爲一個腳本。有兩種不同的方法可以檢測是否存在錯誤的NFS掛載問題。一個是,如果有問題,做一個df將掛起,另一個是df工程,但有一個find (mount name) -type -d將會捕獲掛載的其他問題。Shell腳本幫助

我想結合腳本來捕捉這兩個問題到它運行的地方find type -d,如果有問題,返回一個錯誤。如果發生第二個NFS問題並且查找掛起,請在2秒鐘後終止find命令;運行腳本的第二部分,如果發生NFS問題,則返回錯誤。如果沒有發生任何類型的NFS問題,則返回OK。

MOUNTS="egrep -v '(^#)' /etc/fstab | grep nfs | awk '{print $2}'" 
MOUNT_EXCLUDE=() 
if [[ -z "${NFSdir}" ]] ; then 
    echo "Please define a mount point to be checked" 
    exit 3 
fi 

if [[ ! -d "${NFSdir}" ]] ; then 
    echo "NFS CRITICAL: mount point ${NFSdir} status: stale" 
    exit 2 
fi 


cat > "/tmp/.nfs" << EOF 
#!/bin/sh 
cd \$1 || { exit 2; } 
exit 0; 
EOF 

chmod +x /tmp/.nfs 

for i in ${NFSdir}; do 
    CHECK="ps -ef | grep "/tmp/.nfs $i" | grep -v grep | wc -l" 
    if [ $CHECK -gt 0 ]; then 
     echo "NFS CRITICAL : Stale NFS mount point $i" 
     exit $STATE_CRITICAL; 
    else 
     echo "NFS OK : NFS mount point $i status: healthy" 
     exit $STATE_OK; 
    fi 
done 
+0

使用'set -vx'來幫助調試腳本。當您檢查輸出時,很多問題都將顯而易見。祝你好運。 – shellter

回答

1

MOUNTS和MOUNT_EXCLUDE行對此腳本無關緊要,如圖所示。

您尚未清楚地標識出${NFSdir}正在設置的位置。

該腳本的第一部分假定${NFSdir}包含單個目錄值;第二部分(循環)假定它可能包含多個值。也許這並不重要,因爲循環無條件地在第一次迭代時退出腳本,但它不是寫出清晰,乾淨的方式。

您創建腳本/tmp/.nfs但:

  1. 你不執行它。
  2. 您不要刪除它。
  3. 通過創建每個進程的文件名(例如/tmp/.nfs.$$),您不允許多個併發執行此腳本。
  4. 目前還不清楚爲什麼您將/tmp目錄中的腳本隱藏起來,並且該名稱的前綴爲.。這可能不是一個好主意。

用途:

tmpcmd=${TMPDIR:-/tmp}/nfs.$$ 
trap "rm -f $tmpcmd; exit 1" 0 1 2 3 13 15 

...rest of script - modified to use the generated script... 

rm -f $tmpcmd 
trap 0 

這給你清理臨時腳本的最大機會。

腳本中沒有df,而問題意味着應該有一個。您還應該查看timeout命令(儘管由於NFS沒有響應而掛起的命令通常非常難以殺死)。

+0

Johnathan, 您在響應中丟失了我,NFSdir被定義爲命令行。 .nfs腳本用於cd到每個目錄並返回0或2的代碼。 腳本的其餘部分 - 修改爲使用生成的腳本...意味着什麼?這樣別人可以理解你的解決方案 – user963784

+1

所以'$ {NFSdir}'是從$ 1設置的?你創建'.nfs腳本';你讓它可執行;但是你的代碼永遠不會執行它的AFAICS。如果你保留'.nfs腳本',那麼在你真正創建它之前,你需要設置陷阱;那麼你編寫了創建和使用它的代碼;然後,在最後,你刪除文件,然後取消陷阱(所以你的命令可以退出成功狀態)。這也假設你撤銷了循環體中的'exit'語句,或者你必須刪除'.nsf腳本'並在循環退出之前取消陷阱。很難分析一個不完整的腳本。 –