• Linux操作系统:函数、CronTab及定时任务和站点可用性监测


    🌹一、函数的定义与调用

    1、函数的作用

    函数可以将一个专门的功能进行封装,用于解决一个特定的问题,并且可以通过传递不同的参数给某个函数,实现处理不同数据的能力。函数的参数跟脚本的参数比较类似。

    2、函数的使用

    函数名、参数、返回结果,其中函数名必须的,参数和返回结果可选,根据需要进行处理。

    🌹二、CronTab及定时任务

    简单实例:
    1、两数相加
    vi function.sh进入对function.sh编辑

    # 定义一个函数
    function add(){
            let sum=$1+$2
            echo $sum
    }
    
    # 调用add函数
    add 100 200
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    之后sh function.sh运行shell,输出300

    总结:在上述示例中,在调用函数add 100 200时,类似于命令的参数传递,并且在函数体中也是使用$1,$2的取值方式,没有编程意义上所谓的形参和实参一说。

    效果图如图所示:
    在这里插入图片描述
    在这里插入图片描述

    对代码小小改动:

    
    # 定义一个函数
    function add(){
            let sum=$1+$2
            echo $sum  # 函数的返回结果,注意,作用同return 0
    }
    
    # 调用add函数
    result=`add 100 200`  # 另一种写法: result=$(add 100 200)
    echo "result的结果为:$result"
    
    #要将函数的输出结果赋值给某个变量,使用反引号或$()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    效果图:
    在这里插入图片描述
    在这里插入图片描述

    小拓展:
    几个特殊的关于括号的用法
    1、(()) 双圆括号,用于运算,可以代替expr,也可以用于for循环条件((i=1;i<=100 ;i++))
    2、${} 可以取特定参数或变量的值,比如${1},${username}
    3、$() 可以代替反引号执行圆括号中的命令
    4、$[] 用于整数运算,可以代替expr

    2、for循环的小技巧

    sum=0
    # 默认情况下{1..100}的步长为1
    #for i in {1..100}; do
    #for i in {1..100..2}; do
    for ((i=1; i<=100; i+=2)); do
            let sum+=i
    done
    echo ${sum}
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    效果图:
    在这里插入图片描述
    在这里插入图片描述

    🌱1、定时任务的基本原理

    sleep 5 //沉睡5秒
    
    • 1
    #每5秒钟向文本中输出一次时间
    # for i in {1..10} ; do
    while [ 1 -eq 1 ]; do
    	date "+%Y-%m-%d %H:%M:%S” >> /opt/ 1earn/date.txt
    	date "+%Y-%m-%d %H:%M:%S"
    	sleep 5
    done
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    🌱2、Cron定时任务

    命令实例作用
    crontab每个用户都可以有一个crontab文件来保存调度信息,通过该命令运行任意一个shell脚本或者命令
    /varlspool/cron保存所有用户的crontab文件
    /etc/cron.deny /etclcron.allow系统管理员可以通过cron.deny和cron.allow这两个文件来禁止或允许用户拥有自己的crontab文件(cron.allow需要自己新建)
    crontab的域* * * * * command
    第1列 分钟 0~59 第2列 小时0~23(0表示子夜) 第3列 日 1~31 第4列 月1~12 第5列 星期 0~6 (0表示星期天) 第6列 要运行的命令
    常用规则*:匹配任何值 */n:匹配每n个单位(从起始值算起的每n个单位) x: 匹配x x-y:匹配从x-y的值 x,y,z:只匹配x, y,z三个值
    crontab [ -u user ] -e -l -r-u 用户名 -e 编辑crontab文件 -l 列出crontab文件中的内容 -r 删除crontab文件
    systemctl start/stop crond启动停止crond进程,如crond进程停止,则不会有任务被自动执行
    不发送邮件在crontab -e中编辑任务时,在第一行添加:MAILTO=“”,则不会发送邮件,可以通过/var/log/cron查看执行的日志

    提示:编写定时任务时,确定好定时规则后,要执行的指令建议直接写在Shell脚本中,让Cron直接执行该脚本即可,尽量避免在定时规则文件中直接调用命令,比如
    */1 * * * * /opt/learn/crondate.sh
    一定要确保Shell脚本是有执行权限的,并且在Cron文件中指定的是绝对路径。

    🌱3、其他补充命令

    [root@numberone ~]# yum install -y at//安装at
    
    • 1
    命令实例作用
    at单次定时任务,yum install at -y; systemctl start atd;
    at 时间指定某一特定时间去做某件事情
    at HH:MMat 16:00
    at HH:MM YYYY-MM-DDat 16:00 2009-10-11
    at now + 5 minutes从现在开始的5分钟后
    如何退出at编辑模式Ctrl + D
    atq查询现有任务
    atrm id删除某个任务
    command &后台运行,如有输出,则会输出到前台
    nuhup command &后台运行,所有输出将会转存到nohup.out文件中
    sleep n让Shell脚本暂停n秒
    usleep n让Shell脚本暂停n纳秒,10的-9次方
    time command计算某一个命令或者脚本运行时花的时间(精确到毫秒):如: time ls (ls这个命令所花的时间)time sh myshell.sh (运行myshell.sh这个脚本所花的时间)

    🌹站点可用性监测

    利用Crontab来判断Web服务器是否可用,如果不可用,则自动启动,并且将过程的操作写入到日志文件中。一个站点如果无法访问,可能的原因有两个:
    (1) Web服务器没有正常启动:如何使用Shell进行判断?
    法一:使用curl直接访问对应网页,如果成功,则$?为0,否则非O
    法二:使用netstat -ant l grep :80进行查询,如果端口被打开,则echo $?为0,表示成功启动80端口
    法三:也可以使用ps -ef查询对应的进程

    (2)防火墙没有允许80端口通过:让Shell执行firewall-cmd添加端口通过的命令即可。
    firewakk-cmd --list-port l grep 80

    完成上述特征的识别后,在Shell中编写脚本,并让Cron定时执行。

    shell脚本如下:

    curl http://192.168.112.188/dashboard/phpinfo.php > /dev/null
    if [ $?-ne 0 ]; then
    	/opt/lampp/lampp start
    	echo“"检测到lampp没有启动,已经完成启动-" `date "+%Y-%m-%d %H:%M:%S"` > /opt/learn/site_check.log
    fi
    
    firewall-cmd --list-portl grep 80
    if[ $? -ne 0 ]; then
    	firewall-cmd --add-port=80/tcp
    	echo "检测到80端口没有通过,已经完成添加-" `date "+%Y-%m-%d %H:%M:%S" > pt/learn/site_check.log
    fi
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
  • 相关阅读:
    Next.js Web 应用程序 SSG 与 SSR——选择正确的渲染方法
    内网渗透——隧道代理
    操作系统的分类
    JDBC学习笔记
    Linux shell printf命令小例子
    用flex实现grid布局
    【Java八股文总结】之MyBatisPlus
    docker中安装RabbitMQ(DelayExchange)插件
    科学素养题(2022年2月-2022年10月)
    【matplotlib 实战】--饼图
  • 原文地址:https://blog.csdn.net/m0_51456787/article/details/126268427