2011-09-26 139 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脚本'并在循环退出之前取消陷阱。很难分析一个不完整的脚本。 –