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 版权协议,转载请附上原文出处链接和本声明。