Shell脚本帮助

时间:2011-09-26 00:49:23

标签: shell scripting

我需要帮助我正在尝试制作的两个脚本。有两种不同的方法可以检测是否存在错误的NFS挂载问题。一个是如果出现问题,那么df会挂起而另一个是df可以正常工作,但是find (mount name) -type -d将会遇到其他问题。

我正在尝试将脚本组合起来,以便将问题都记录到运行find type -d的位置,如果出现问题,则返回错误。如果发生第二个NFS问题并且查找挂起,请在2秒后终止查找命令;运行脚本的第二部分,如果发生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

1 个答案:

答案 0 :(得分:1)

如图所示,MOUNTS和MOUNT_EXCLUDE行对此脚本无关紧要。

您尚未明确确定${NFSdir}的设置位置。

脚本的第一部分假设${NFSdir}包含单个目录值;第二部分(循环)假设它可能包含多个值。也许这没关系,因为循环无条件地在第一次迭代时退出脚本,但它不是清晰,干净的写入方式。

您创建脚本/tmp/.nfs但是:

  1. 你不执行它。
  2. 您不会将其删除。
  3. 您不允许通过创建每个进程的文件名(例如/tmp/.nfs.$$)来多次并发执行此脚本。
  4. 目前尚不清楚为什么要将/tmp目录中的脚本隐藏到名称前面加.前缀。这可能不是一个好主意。
  5. 使用:

    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没有响应而挂起的命令通常很难被杀死)。