【Shell】Shell基础01-脚本

发布时间:2024年01月20日

Shell基础01-脚本

81.脚本资源控制

1.1 描述

  1. 可以使用nice和renice调整脚本优先级
  2. 避免出现不可控的死循环
    1. 死循环导致cpu占用过高
    2. 死循环导致死机

1.2 实践

  1. 循环嵌套导致的,fork炸弹

    原理:就是通过不断地创建子进程导致系统不再接受外部指令,从而导致机器宕机
    
    -----fork炸弹实现
    function fork(){ fork | fork& };fork
    1.执行:
    [master@model:~]$function fork(){ fork | fork& };fork
    [1] 1649
    
    2.不一会会打印出如下结果:
    -bash: fork: retry: 没有子进程
    -bash: fork: retry: 没有子进程
    -bash: fork: retry: 资源暂时不可用
    -bash: fork: retry: 没有子进程
    -bash: fork: retry: 没有子进程
    -bash: fork: retry: 没有子进程
    3.因为master用户下有进程限制,所以不会宕机,因为root用户下会没有限制,会导致宕机
    
    4.应对方法:再非root用户下有ulimit命令查看最大的进程限制
    [root@model:~]$ulimit -a
    core file size          (blocks, -c) 0
    data seg size           (kbytes, -d) unlimited
    scheduling priority             (-e) 0
    file size               (blocks, -f) unlimited
    pending signals                 (-i) 7258
    max locked memory       (kbytes, -l) 64
    max memory size         (kbytes, -m) unlimited
    open files                      (-n) 1024
    pipe size            (512 bytes, -p) 8
    POSIX message queues     (bytes, -q) 819200
    real-time priority              (-r) 0
    stack size              (kbytes, -s) 8192
    cpu time               (seconds, -t) unlimited
    max user processes              (-u) 7258
    virtual memory          (kbytes, -v) unlimited
    file locks                      (-x) unlimited
    

82.信号

1. 捕获信号的脚本编写

  • kill 默认会发送15号信号给应用程序
  • ctrl+c 发送2号信号给应用程序
  • 9号信号不可阻塞:9号信号(SIGKILL)是一个特殊的信号,它用于强制终止一个进程。由于SIGKILL是用于终止进程的不可忽略的信号,因此它无法被进程捕获、忽略或阻塞。

捕获信号得使用场景:比如我们有个程序在进行备份,那么很怕被中断,这个时候我们就可以使用信号捕获防止被中断了。

3.实践

捕获信号后,信号

#!/bin/bash
echo $$ # 打印当前的进程得pid
trap 'echo 151515 $$' 15 # 捕获15信号 kill默认的
trap 'echo 222 $$' 2 # 捕获ctrl+c 默认的信号
trap 'echo 222 $$' 4 # 捕获信号4
while :
do
:
done

83.一次性计划任务

1.命令 at

------1.安装
yun install at
------2.启动服务
[root@model:/home/master]$/bin/systemctl start atd.service
[root@model:/home/master]$/bin/systemctl status atd.service
● atd.service - Job spooling tools
   Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled)
   Active: active (running) since 三 2023-12-13 21:45:47 CST; 26s ago
 Main PID: 13949 (atd)
   CGroup: /system.slice/atd.service
           └─13949 /usr/sbin/atd -f

1213 21:45:47 model systemd[1]: Started Job spooling tools.   
1213 21:46:00 model atd[13956]: Starting job 2 (a0000201b0... 
Hint: Some lines were ellipsized, use -l to show in full.
------3.制定定时任务
[root@model:/home/master]$at 21:48
at> echo hello > /home/master/trap.log
at> <EOT>
job 3 at Wed Dec 13 21:48:00 2023
------4.然后按住ctrl+D进行保存退出
------5.atq 查看任务列表
[root@model:/home/master]$atq
1       Thu Dec 14 21:44:00 2023 a root
----------------------------------------------
atq展示如下信息:
作业编号(Job ID):在这种情况下,作业编号为 1。
执行时间:任务预定在 Thu Dec 14 21:44:00 2023 执行。
用户:任务由 root 用户预定。
----------------------------------------------

84.周期性计划任务

  1. 周期性任务 cron

  2. 配置方式

    crontab -e

  3. 查看现有的计划任务

    crontab -l

  4. 配置格式

    1. 分钟 小时 日期 月份 星期 执行命令
    2. 注意命令的路径问题,要使用绝对路径
  5. 实际操作

    -1.每分钟都运行一次
    * * * * * /usr/bin/data >> /tmp/date.log
    -2.每天凌晨3点:注意这里的分钟不要使用* 而是0表示整点
    0 3 * * * /usr/bin/data >> /tmp/date.log
    -3.每周1,3,5 每分钟执行
    * * * * 1,3,5 /usr/bin/data >> /tmp/date.log
    -4.每周1,3,5 每分钟执行
    * * * * 1,3,5  /usr/bin/data >> /tmp/date.log
    -4.12月6号得5点以及 12月的周1、3、5的凌晨5点执行
    0 5 6 12 1,3,5  /usr/bin/data >> /tmp/date.log
    -4.每5小时执行一次
    0 */5 * * *  /usr/bin/data >> /tmp/date.log
    

    要查看相关的日志可以进入

    [root@model:~]$tail -f /var/log/cron
    Dec 13 20:01:01 model run-parts(/etc/cron.hourly)[13226]: starting 0anacron
    Dec 13 21:58:01 model CROND[14107]: (root) CMD (/usr/bin/date >> /tmp/date.log)
    Dec 13 21:59:02 model CROND[14116]: (root) CMD (/usr/bin/date >> /tmp/date.log)
    

85.为脚本加锁

  1. 场景

    1. 因为计算机问题,导致计划不能按照预期运行
  2. 实现方案

    flock -xn 是一个用于文件锁定的命令,其中 -xnflock 命令的两个参数。

    • -x 参数表示使用独占锁(exclusive lock)。独占锁意味着只有一个进程可以获取到该锁,并且其他进程在获取锁之前会被阻塞。
    • -n 参数表示非阻塞模式(non-blocking)。非阻塞模式下,如果无法获取到锁,flock 命令不会阻塞当前进程,而是立即返回一个错误。
    1.执行命令时使用flock
    [root@model:/tmp]$flock -xn "/tmp/f.lock" -c 'bash /tmp/test.sh'
    2.再次执行的时候也要使用flock进行执行才可以,也必须要使用flock这个命令
    [root@model:/tmp]$flock -xn "/tmp/f.lock" -c 'bash /tmp/test.sh'
    
文章来源:https://blog.csdn.net/weixin_44331765/article/details/135100630
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。