Linux下的Shell计数器脚本

2020年03月7日

原创内容,转载请注明出处:https://www.myzhenai.com.cn/post/3157.html
关键词:linux shell 计数器
这个脚本是应hostloc社区的一个朋友的要求写的,是需要每隔多少天就执行一次指定脚本,如果使用crontab来设置的话不能完善或完美的达到要求,所以就需要写一个简单的计数器来进行统计,我这个脚本的思路是这样的。
1、创建一个文本文档来储存脚本运行次数
2、每次脚本运行后就去读取文本文档里的数值并判断
3、为了避免系统重启造成脚本多次重复的计数,增加了一个对比当前系统时间来判断

运行脚本的方法

* * * * * * root bash rundate.sh 25
#假设需要每25天生效一次

 

脚本命令代码注释

# !/bin/bash -x
#    filename:  running.sh
###############################################################################################################################################################################################
#
# This is a lottery number automatic generation tool
# Autor: RucLinux
# Web: https://www.myzhenai.com.cn/ https://www.myzhenai.com/ https://jiayu.mybabya.com/ https://mangshe.python.hn.cn/
#
###############################################################################################################################################################################################

#curr_run_time这个变量是你定的时间参数
#phat这个变量是存储数值的文本路径
#$1变量是脚本的第一个参数,85即是第一个参数,例如在crontab里是  * * * * * root bash running.sh 85
#$i变量是获取到文本里的数值
#我注释掉的那两行那里可以放入你需要执行的脚本或代码
#
#

curr_run_time=`date +%s` #这是时间变量
phat="rundate.log" # 这个是存储计数的文本文件
ni=$(date +20%y-%m-%d) #这是获取系统时间年月日,避免一天内因为系统重启而重复计数
if [ ! -n "${1}" ]; then #第一次判断,判断需要对比的数值是不是为空,如果希望第25天生效,那么就要将这个参数传参为25
echo "Please enter a specified value"
 else
     value="${1}"
     if [ ! -f "${phat}" ]; then #第二次判断,判断存储计数的文本文件是否存在
   touch "${phat}"
   echo -e "1|${ni}" > "${phat}" #如果文本文件不存在,自动创建一个并做原始的赋值
 else
     i=$(cat "${phat}" | sed '/^\s*$/d' | awk -F "|" '{ print $1 }') #提取计数文本里的次数
     ii=$(cat "${phat}" | sed '/^\s*$/d' | awk -F "|" '{ print $2 }') #提取计数文本里的日期
     if [ "${ii}" != "${ni}" ]; then #第三次判断,如果现行时间的年月日与计数文本里的年月日相等,不进行任何操作,以免因为系统重启等原因进行多余计数
        if [ "${i}" != "${value}" ]; then #第四次判断,判断计数文本里的数值是否等于传入参数的数值,相等即是符合执行要求了,不相等就继续计数
     li=$(($i+1)) #
   echo -e "${li}|${ni}" > "${phat}" #这个是每天运行一次就自动在计数文本里的计算数值加1
 else
     #这里是要运行的脚本或代码
     #
    echo "This is time $1" #调试命令,这行可以删除,运行脚本如果看到这一行即代表符合所有要求了
        echo -e "1|${ni}" > "${phat}" #将数值设置为1并重新计数
        fi
   fi
    fi
fi

#把脚本放在crontab里,指定6个小时执行一次,因为这个脚本做了几重判断,判断系统时间避免因为系统重启而重复计数,所以可能会存在计数到25的时候却是26才会启发判断代码,所以需要一天执行两次。这样就可以做到当天就运行所设置的内容。
#你可以在本机上调试一下,可以通过修改rundate.log这个文本里的|符号左右两边的数据来进行调试。

 

完整脚本命令代码

# !/bin/bash -x
#    filename:  running.sh
###############################################################################################################################################################################################
#
# This is a lottery number automatic generation tool
# Autor: RucLinux
# Web: https://www.myzhenai.com.cn/ https://www.myzhenai.com/ https://jiayu.mybabya.com/ https://mangshe.python.hn.cn/
#
###############################################################################################################################################################################################
curr_run_time=`date +%s`
phat="/var/log/rundate.log"
ni=$(date +20%y-%m-%d)
if [ ! -n "${1}" ]; then
echo "Please enter a specified value"
 else
     value="${1}"
     if [ ! -f "${phat}" ]; then
   touch "${phat}"
   echo -e "1|${ni}" > "${phat}"
 else
     i=$(cat "${phat}" | sed '/^\s*$/d' | awk -F "|" '{ print $1 }')
     ii=$(cat "${phat}" | sed '/^\s*$/d' | awk -F "|" '{ print $2 }')
     if [ "${ii}" != "${ni}" ]; then
        if [ "${i}" != "${value}" ]; then
     li=$(($i+1))
   echo -e "${li}|${ni}" > "${phat}"
 else
     #这里是要执行的脚本或代码
     #
        echo -e "1|${ni}" > "${phat}"
        fi
   fi
    fi
fi

 


sicnature ---------------------------------------------------------------------
Your current IP address is: 35.171.22.220
Your IP address location: 美国弗吉尼亚阿什本
Your IP address country and region: 美国 美国
Your current browser is:
Your current system is:
Original content, please indicate the source:
同福客栈论坛 | 蟒蛇科普海南乡情论坛 | JiaYu Blog
sicnature ---------------------------------------------------------------------
Welcome to reprint. Please indicate the source https://myzhenai.com.cn/post/3157.html

没有评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注