linux脚本–守护进程

  • Post author:
  • Post category:linux




1,守护进程

#! /bin/bash

				#遍历目录中的文件
function ergodic(){
    a=1
    for file in `ls $1 |grep "ERROR"|sort -t_ -k2 -r |sort -t- -k1 -r`
    do
        a=$(($a+1))
        local path=$1"/"$file 
        if [ $a -gt $ERROR_MAX_NUM ];then
            rm $path
            echo $a "=============" $path 
        fi
    done
    a=1
    for file in `ls $1 |grep "WARNING"|sort -t_ -k2 -r |sort -t- -k1 -r`
    do
        a=$(($a+1))
        local path=$1"/"$file 
        if [ $a -gt $WARNING_MAX_NUM ];then
            rm $path
            echo $a "----------" $path 
        fi
    done
    a=1
    for file in `ls $1 |grep "INFO"|sort -t_ -k2 -r |sort -t- -k1 -r`
    do
        a=$(($a+1))
        local path=$1"/"$file 
        if [ $a -gt $INFO_MAX_NUM ];then
            rm $path
            echo $a "+++++++++++" $path 
        fi
    done
    a=1
    for file in `ls $1 |grep "stderr"|sort -t_ -k1 -r`
    do
        a=$(($a+1))
        local path=$1"/"$file 
        if [ $a -gt $STDERR_MAX_NUM ];then
            rm $path
            echo $a "^^^^^^^^^^^" $path 
        fi
    done
}

#进程名字
PRO_NAME="/home/avs/schoolbus/count_main.app"
NAME="count_main.app"
IFS=$'\n' #这个必须要,否则会在文件名中有空格时出错
STDERR_MAX_NUM=50
ERROR_MAX_NUM=50
WARNING_MAX_NUM=50
INFO_MAX_NUM=10
INIT_PATH="log"

				#守护进程
while true ; do
    #用ps获取$PRO_NAME进程数量
    NUM=`ps aux | grep -w ${NAME} | grep -v grep |wc -l`
    #echo $NUM
    #少于1,重启进程
    if [ "${NUM}" -lt "1" ];then
        echo `date +%Y%m%d-%H%M%S`"${PRO_NAME} was killed"
        echo 'admin' |sudo -S sh -c 'echo 1 >/proc/sys/vm/drop_caches'
        ergodic ${INIT_PATH}
        #${PRO_NAME} -c 1 & 
        LOG_OUTPUT="log/stderr_"`date +%Y%m%d-%H%M`
        nohup ${PRO_NAME} -c 1 2>>$LOG_OUTPUT 1>/dev/null & 
    #大于1,杀掉所有进程,重启
    elif [ "${NUM}" -gt "1" ];then
        echo `date +%Y%m%d-%H%M%S`"more than 1 ${PRO_NAME},killall ${PRO_NAME}"
        echo 'admin' |sudo -S sh -c 'echo 1 >/proc/sys/vm/drop_caches'
        killall -9 $NAME
        ergodic ${INIT_PATH}
        #${PRO_NAME} -c 1 &
        LOG_OUTPUT="log/stderr_"`date +%Y%m%d-%H%M`
        nohup ${PRO_NAME} -c 1 2>>$LOG_OUTPUT 1>/dev/null &
    fi
    #kill僵尸进程
    NUM_STAT=`ps aux | grep -w ${NAME} | grep T | grep -v grep | wc -l`
    if [ "${NUM_STAT}" -gt "0" ];then
        echo `date +%Y%m%d-%H%M%S`"zombie ${PRO_NAME},killall ${PRO_NAME}"
        echo 'admin' |sudo -S sh -c 'echo 1 >/proc/sys/vm/drop_caches'
        killall -9 ${NAME}
        ergodic ${INIT_PATH}
        #${PRO_NAME} -c 1 &
        LOG_OUTPUT="log/stderr_"`date +%Y%m%d-%H%M`
        nohup ${PRO_NAME} -c 1 2>>$LOG_OUTPUT 1>/dev/null &
    fi
    sleep 1s
 done
 
 exit 0



2,知识点



2.1,wc -l

Linux系统中的wc(Word Count)命令的功能为统计指定文件中的字节数、字数、行数,并将统计结果显示输出。

1.命令格式:
wc [选项]文件...
2.命令功能:
统计指定文件中的字节数、字数、行数,并将统计结果显示输出。该命令统计指定文件中的字节数、字数、行数。如果没有给出文件名,则从标准输入读取。wc同时也给出所指定文件的总统计数。
3.命令参数:
-c 统计字节数。
-l 统计行数。
-m 统计字符数。这个标志不能与 -c 标志一起使用。
-w 统计字数。一个字被定义为由空白、跳格或换行字符分隔的字符串。
-L 打印最长行的长度。
-help 显示帮助信息
--version 显示版本信息



2.2,grep -v grep

不显示以grep开头的行

#用ps获取$PRO_NAME进程数量
    NUM=`ps aux | grep -w ${PRO_NAME} | grep -v grep |wc -l`

在这里插入图片描述



2.3,变量说明:

$$  	#Shell本身的PID(ProcessID) 

$! 		#Shell最后运行的后台Process的PID 

$? 		#最后运行的命令的结束代码(返回值)

$- 		#使用Set命令设定的Flag一览 

$* 		#所有参数列表。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。

$@ 		#所有参数列表。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。 

$# 		#添加到Shell的参数个数 

$0 		#Shell本身的文件名 


$1$n 	#添加到Shell的各参数值。$1是第1参数、$2是第2参数…。 



2.3.1,示例 —

test.sh

1 #!/bin/bash
 2 #
 3 printf "The complete list is %s\n" "$$"
 4 printf "The complete list is %s\n" "$!"
 5 printf "The complete list is %s\n" "$?"
 6 printf "The complete list is %s\n" "$*"
 7 printf "The complete list is %s\n" "$@"
 8 printf "The complete list is %s\n" "$#"
 9 printf "The complete list is %s\n" "$0"
10 printf "The complete list is %s\n" "$1"
11 printf "The complete list is %s\n" "$2

结果

$ bash test.sh 123456 QQ
The complete list is 22216
The complete list is
The complete list is 0
The complete list is 123456 QQ
The complete list is 123456
The complete list is QQ
The complete list is 2
The complete list is params.sh
The complete list is 123456
The complete list is QQ



2.4,IFS

IFS='\n'  //将字符\和字符n作为IFS的换行符。
IFS='\n'  //与上面一样。
IFS=$'\n' //正真的使用换行符做为字段分隔符。

//如果IFS='\n':;"
//这个赋值会将反斜杠、n、冒号、分号和双引号作为字段分隔符。



2.5,sort,cut


https://www.cnblogs.com/inmoonlight/p/6661550.html

ls |sort -t_ -k2 -o sort.txt   #以_作为域的分隔符,按第二个域排序,将结果输出到sort.txt

ls |cut -d_ -f3|cut -d- -f1   #以_作为域分隔符,提取第三个域。将结果以-作为域分隔符,提取第1个域



版权声明:本文为m0_37542524原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。