文件状态检测shell

  • 编写一个SHELL程序,动态检测指定文件的状态信息,当文件的大小发生改变时,给出提示信息,并继续前进检测。当文件的大小的变化次数或持续检查无变化次数达到一定值时,退出检查,程序结束。

  • 实现代码:

    #!/bin/bash
    #用于检测文件状态信息,文件变化给出状态信息。由用户给出检查次数上限值。
    #程序名:filetest
    # ls -l > filelog;
    # awk ' /file1/ {print $5}' filelog awk命令。
    tput clear
    echo -n "use like : filetest filename [loop]:"
    read -r var1 var2 var3
    if [ -z "${var1}" ] || [ -z "${var2}" ]
    then
    while [ -z "${var1}" ] || [ -z "${var2}" ]
    do
    echo -n "use like: filetest filename [loop]:"
    read -r var1 var2 var3
    done
    else

    while [ "${var1}" != filetest ]
    do
    echo -n "use like: filetest filename [loop]:"
    read -r var1 var2 var3
    done

    if [ -z "${var3}" ]
    then
    loop=10 #默认值为10次
    else
    loop="${var3}"
    fi
    fi

    ls -l "${var2}" > runlog 2> errolog

    if [ $? -ne 0 ]
    then #命令错误处理
    read -r line1 < errolog
    echo -e "\n文件信息获取失败:${line1}"
    echo -e "新建一个文件'${var2}'。(Press CRT+D 结束创建)"
    cat > ${var2}
    fi
    #命令正确处理
    ls -l "${var2}" > runlog #用于读取新建文件信息
    read -r line2 < runlog
    echo -e "\n初始文件${var2}的状态信息为: ${line2}"
    size=$(cat "${var2}" | wc -c)
    change=0 #用于保存文件状态的次数
    for((i=0;i<"${loop}";i++))
    do if [ ${change} -eq 2 ]
    then
    exit 0
    else
    echo -e "\n正在检测文件大小状态..."
    size1=$(cat "${var2}" | wc -c)

    if [ ${size} -eq ${size1} ] #文件大小未变
    then
    echo
    else
    change=$((${change} + 1 )) #文件状态改变一次change变量加一
    size=${size1} #改变了的size1赋值给size变量

    ls -l "${var2}" > runlog #用于读取新建文件信息
    read line2 < runlog

    if [ ${change} -eq 1 ]
    then
    echo -e "\n文件状态第一次发生变化,此时文件状态信息为${line2}"
    else
    echo -e "\n文件状态第二次发生变化,此时文件状态信息为${line2}"
    fi

    tput setaf 5
    echo "文件大小变为:${size1}(字节数)"
    tput sgr0

    fi
    fi
    sleep 3s

    done

用户状态检测

  • 编写一个用户监测程序usr_monitor, 其运行格式为:

    usr_monitor username

    其中username是用户指定的任意一个用户名。程序运行时首先列出当前系统中的已登录用户的名单,再检查指定用户是否已登录。如果已登录,则显示相应信息;如果未登录,则等待该用户登录,直到指定用户登录进入系统为止。

  • 实现代码:

    #!/bin/bash
    if [ $# -ne 1 ]
    then
    echo "Usage : usr_monitor username"
    exit 0;
    fi #命令参数不为一就退出

    userlist=$(who -q | awk 'NR == 1'); #执行命令结果后参数:第一行记录传入userlist
    echo -e "\nMoniter if user [$1] is logon...\n"
    echo -e "Current userlist is:\n${userlist}\n"

    usernum=0
    for name in ${userlist}
    do
    usernum=$(expr ${usernum} + 1)
    done #记录统计已登录的人数

    i=0
    for name in ${userlist}
    do
    if [ $name = $1 ]
    then
    tput setaf 5
    echo -e "\nuser [$1] is logon."
    tput sgr0
    echo -e "exit..."
    exit 0
    fi
    i=$(expr ${i} + 1)
    done #判断检测用户是否已登陆和统计循环次数


    while [ ${i} -eq ${usernum} ]
    do
    echo -ne "waiting for user [$1]..."
    echo -e "\n"
    sleep 5

    userlist=$(who -q | awk 'NR==1');

    usernum=0
    for name in ${userlist}
    do
    usernum=$(expr ${usernum} + 1)
    done #记录统计已登录的人数

    i=0
    for name in ${userlist}
    do
    if [ $name = $1 ]
    then
    tput setaf 5
    echo -e "\nuser [$1] is logon."
    tput sgr0
    echo -e "exit..."
    exit 0
    fi
    i=$(expr ${i} + 1)
    done
    done