分享页面
首页  >  

#

  • Shell脚本进阶之信号的捕捉trap
    2021-07-27

     

    shell脚本之信号的捕捉

    trap,翻译过来就是陷阱的意思,shell脚本中的陷阱是专门用来捕捉信号的。啥信号呢?比如经常使用的kill -9kill -15CTRL C等都属于信号

     

    1、查看所有可用的信号

    trap -lkill -l即可

    kill -l

    trap -l


    2
    、常见的信号如下:

    Signal    Value    Comment
    ─────────────────────────────
    SIGHUP        1     
    终止进程,特别是终端退出时,此终端内的进程都将被终止
    SIGINT        2     
    中断进程,几乎等同于sigterm,会尽可能的释放执行clean-up,释放资源,保存状态等(CTRL C)
    SIGQUIT      3     
    从键盘发出杀死(终止)进程的信号

    SIGKILL      9      强制杀死进程,该信号不可被捕捉和忽略,进程收到该信号后不会执行任何clean-up行为,所以资源不会释放,状态不会保存
    SIGTERM      15     
    杀死(终止)进程,几乎等同于sigint信号,会尽可能的释放执行clean-up,释放资源,保存状态等

    SIGSTOP      19      该信号是不可被捕捉和忽略的进程停止信息,收到信号后会进入stopped状态
    SIGTSTP      20     
    该信号是可被忽略的进程停止信号(CTRL Z)

    真正的信号名字不是SIGXXX,而是去除SIG后的单词,每个信号还有对应的代号

    比如向PID12345的进程发起1信号

    kill -1 12345
    kill -HUB 12345
    kill -SIGHUB 12345

    3trap的选项

    trap -l列出当前系统支持的信号列表,上面已经使用过,根kill -l一样

    trap -p等价于trap,查看shell已经布置好的陷阱

    可以看到shell默认有三个陷阱,表示忽略20,21,22信号

    4、陷阱捕捉到信号后干嘛
    忽略信号
    捕捉到信号后做相应的处理。主要是清理一些脚本创建的临时文件,然后退出。

    5、设置一个可以忽略CTRL C15信号的陷阱

    CTRL信号对应的是SIGINT 15信号对应的是SIGTERM

    trap '' SIGINT SIGTERM
    trap

    这样,当前shell就不能被kill -15杀死

    6、设置一个陷阱,捕捉到-15信号时,就打印“我抓到你啦~”

    trap 'echo "我抓到你啦~"' TERM
    trap
    效果,当我对当前bash发起kill -15信号时就打印出来了

    7、在脚本中设置一个能忽略CTRL CCTRL Z信号的脚本

    CTRL C2信号,即SIGINT

    CTRL Z20信号,即SIGTSTP

    脚本:

    脚本沉睡10s,然后打印success,脚本忽略INTTSTP信号

    Vim trap.sh
    #!/bin/bash
    trap '' SIGINT SIGTSTP
    sleep 10
    echo success

    效果:

    8、布置一个当脚本被终端时能清理垃圾并立即退出脚本的陷阱

    脚本如下:

    Vim trap1.sh
    #!/bin/bash

    trap 'echo trap handing...;rm -rf /tmp/$BASHPID;echo TEMP files cleaned;exit' SIGINT SIGTERM SIGQUIT SIGHUP
    mkdir -p /tmp/$$/
    touch /tmp/$$/{a..c}.txt
    sleep 10
    echo first sleep success
    sleep 10
    echo second sleep success

    这样,脚本除了SIGKILL信号(kill -9),总能清理掉临时垃圾

    效果

    9、陷阱的守护对象

    陷阱的守护对象是shell进程本身,不会守护shell环境内的子进程。但如果是信号忽略型陷阱,则会守护整个shell进程组使其忽略给定信号。

    Vim trap2.sh
    #!/bin/bash
    trap 'echo trap_handle_time: $(date "%F %T")' SIGINT SIGTERM
    echo time_start: $(date "%F %T")
    sleep 10
    echo time_end1: $(date "%F %T")
    sleep 10
    echo time_end2: $(date "%F %T")

    #执行脚本后,新开终端使用kill -15杀死它
    [root@linux1 ~]# killall -s SIGTERM trap2.sh

    #查看输出情况
    ./trap2.sh


    可以发现,kill执行完后,屏幕没有立即打印trap_handle,而是等sleep 10运行完后才打印的。sleep进程都被忽略型trap守护了

    只要是向shell进程发送的信号,都会等待当前正在运行的命令结束后才处理信号,然后继续脚本向下运行。(实际上,只有当shell脚本中正在执行的操作是信号安全的系统调用时,才会出现信号无法中断进程的情况,而在shell下的各种命令,我们是没法直接知道哪些命令中正在执行的系统调用是系统调用的)

    sleep命令发起的sleep()调用,是一个信号安全的,所以上面脚本中执行sleep的过程中,信号不会直接中断它们的运行,而是等待它运行完之后再执行信号处理命令。

  • Shell脚本中的正则表达式
    2021-07-27

     

    一、正则表达式的定义

    正则表达式又称正规表达式、常规表达式。在代码中常简写为regexregexpRE。正则表达式是使用单个字符串来描述,匹配一系列符合某个句法规则的字符串,简单来说,是一种匹配字符串的方法,通过一些特殊符号,实现快速查找、删除、替换某个特定字符串。
    正则表达式是由普通字符与元字符组成的文字模式。模式用于描述在搜索文本时要匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。其中普通字符包括大小写字母、数字、标点符号及一些其他符号,元字符则是指那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。

    1、基础正则表达式

    正则表达式的字符串表达方法根据不同的严谨程度与功能分为基本正则表达式与扩展正则表达式。基础正则表达式是常用的正则表达式的最基础的部分。在Linux系统中常见的文件处理工具中grepsed支持基础正则表达式,而egrepawk支持扩展正则表达式。

    提前准备一个名为test.txt的测试文件,文件具体内容如下:

    vim test.txt

    he was short and fat.

    He was wearing a blue polo shirt with black pants.

    The home of Football on BBC Sport online.

    the tongue is boneless but it breaks bones.12!

    google is the best tools for search keyword.

    The year ahead will test our political establishment to the limit.

    PI=3.14148223023840-2382924893980--2383892948

    a wood cross!

    Actions speak louder than words

     

    #wooood #

    #woooood #

    AxyzxyzxyzxyzxyzC

    I bet this place is really spooky late at night!

    Misfortunes never come alone/single.

    I shouldn't have lett so tast.

    1)基础正则表达式示例:

    grep -n 'the' test.txt <!--查找特定字符,-n显示行号-->

    grep -in 'the' test.txt <!--查找特定字符,-in显示行号不区分大小写-->

    grep -vn 'the' test.txt <!--查找不包括特定字符的行,-vn选项实现-->

    2grep利用中括号“[]”来查找集合字符

    grep -n 'sh[io]rt' test.txt <!--中括号来查找集合字符,

    []”中无论有几个字符,都仅代表一个字符,

    也就是说“[io]”表示匹配“i”或者“o”-->

    grep -n 'oo' test.txt <!--查找重复单个字符-->

    grep -n '[^w]oo' test.txt <!--查找“oo”前面不是“w”的字符串,

    使用“[^]”选项实现-->

    grep -n '[^a-z]oo' test.txt <!--查找“oo”前面不存在小写字母-->

    grep -n '[0-9]' test.txt <!--查找包含数字的行-->

    3)grep查找行首“^”与行尾字符“$”

    grep -n '^the' test.txt <!--查找以“the”字符串为行首的行-->

    grep -n '^[a-z]' test.txt <!--查找以小写字母为行首的行 -->

     

    grep -n '^[A-Z]' test.txt <!--查找以大写字母为行首的行-->

    grep -n '^[^a-zA-Z]' test.txt <!--查找不以字母开头的行-->

    grep -n 'w..d' test.txt <!--查找任意一个字符“.”与重复字符“*”-->

    grep -n 'ooo*' test.txt <!--查看包含至少两个o以上的字符串-->

    grep -n 'woo*d' test.txt <!--查询w开头d结尾,中间至少包含一个o的字符串-->

     

    grep -n '[0-9][0-9]*' test.txt <!--查询任意数字所在行-->

    grep -n 'o\{2\}' test.txt <!--查找连续两个o的字符“{}”-->

  • Centos云主机检查是否有大量请求导致带宽跑满
    2023-07-05

    检查机器带宽是否跑满 1.打开“管理工具”找到“性能监视器”,然后双击打开。 ![img](https://public-1251015552.cos.ap-guangzhou.myqcloud.com/Uploads/image/2023-07-05/114344ca02cc7.jpeg) 2.先点击“监视工具”然后点击“性能监视器”,再点击右边的“添加符号”。 ![img](https://public-1251015552.cos.ap-guangzhou.myqcloud.com/Uploads/image/2023-07-05/114347de4f08e.jpeg) 3.先找到“Hyper-V Virtual Network Adapter”然后选择“Bytes Received/sec”跟“Bytes Sent/sec”,然后在“选择对象的实例”里面找到需要查看的机器,选择网卡是“Bridge”的那个,然后点击“添加”在点击“确实”即可。 ![img](https://public-1251015552.cos.ap-guangzhou.myqcloud.com/Uploads/image/2023-07-05/114351542e72a.jpeg) ![img](https://public-1251015552.cos.ap-guangzhou.myqcloud.com/Uploads/image/2023-07-05/1143551a38211.jpeg) 查看到Bytes Send/sec 速率为 376130 Bytes/sec 376130 / 1024 /1024 * 8 = 2.87 Mbps 该速率换算后带宽数值接近3Mbps 4.查看机器内socks套字节连接统计 查看有大量的tcp连接 ![img](https://public-1251015552.cos.ap-guangzhou.myqcloud.com/Uploads/image/2023-07-05/114357c964f20.jpeg) 5.通过netstat命令查看统计实时连接情况 查看统计tcp连接数前10个的本地监听地址和端口,确定请求流量最多的本地监听地址和端口 netstat -antp | tail -n +3 | awk '{print $4}' | sed '/^$/d' | sort | uniq -c | sort -nr | head -10 ![img](https://public-1251015552.cos.ap-guangzhou.myqcloud.com/Uploads/image/2023-07-05/114400cae8cba.jpeg) 6.查看该端口对应的进程信息 netstat -tnulp | grep 38080 ![img](https://public-1251015552.cos.ap-guangzhou.myqcloud.com/Uploads/image/2023-07-05/11440237e6a76.jpeg)

  • Centos通过messages日志查看拨号IP重复记录
    2023-07-05

    1.通过messages 日志记录查看拨号成功时间和获取的IP记录 grep 'local IP' /var/log/messages | awk '{print $1,$2,$3,"---",$NF}' ![img](https://public-1251015552.cos.ap-guangzhou.myqcloud.com/Uploads/image/2023-07-05/11500220e1070.jpeg) /var/log/ 目录下有多个messages日志文件,可以查看更早的日志信息 2.查看所有messages日志记录中拨号成功时间和IP记录 ls /var/log/messages* | xargs grep 'local IP' /var/log/messages | awk '{print $1,$2,$3,"---",$NF}' ![img](https://public-1251015552.cos.ap-guangzhou.myqcloud.com/Uploads/image/2023-07-05/11500528c7641.jpeg)

  • Centos通过messages日志查看拨号IP重复记录
    2023-07-05

    1.查看所有messages日志记录中指定日期拨号网卡获取的IP并查看重复项 例如查看6月11日出现的重复IP有哪些 ls /var/log/messages* | xargs grep 'local IP' | grep -E 'Jun 11' | awk '{print $NF}' | uniq -cd | sort -r ![img](https://public-1251015552.cos.ap-guangzhou.myqcloud.com/Uploads/image/2023-07-05/115416243d6ac.jpeg) 第一列表示重复次数,第二列表示IP地址

  • Windows7如何设置在锁屏界面手动输入用户名方式切换用户
    2023-07-27

    ![img](https://public-1251015552.cos.ap-guangzhou.myqcloud.com/Uploads/image/2023-07-27/11310108ef37b.jpeg) 1.打开“运行”,输入`gpedit.msc`,点击“确定”,打开本地组策略编辑器 ![img](https://public-1251015552.cos.ap-guangzhou.myqcloud.com/Uploads/image/2023-07-27/1131045b551ce.jpeg) 2.按计算机配置→Windows设置→安全设置→本地策略→安全选项,进入到如图所示界面,双击进入“交互式登录:不显示最后的用户名” ![img](https://public-1251015552.cos.ap-guangzhou.myqcloud.com/Uploads/image/2023-07-27/113106f00fd22.jpeg) 3.点选“已启用”,点击“确定”即可 ![img](https://public-1251015552.cos.ap-guangzhou.myqcloud.com/Uploads/image/2023-07-27/1131103da3fce.jpeg) 4.重启进入系统后即可输入用户名 ![img](https://public-1251015552.cos.ap-guangzhou.myqcloud.com/Uploads/image/2023-07-27/1131132a39a17.jpeg)

  • Windows7系统没有显示本地连接处理方法
    2023-07-27

    1.机器默认配置是2个物理网卡,查看机器内只显示出1个物理网卡 ![img](https://public-1251015552.cos.ap-guangzhou.myqcloud.com/Uploads/image/2023-07-27/11340078b4744.jpeg) 2.我的电脑 右键选择“管理”;选择“设备管理器”页面 查看网络适配器是显示2个物理网卡,有一张是显示感叹号的,将该网卡右键操作卸载 ![img](https://public-1251015552.cos.ap-guangzhou.myqcloud.com/Uploads/image/2023-07-27/1134025bd83e3.jpeg) ![img](https://public-1251015552.cos.ap-guangzhou.myqcloud.com/Uploads/image/2023-07-27/11340423e70a2.jpeg) 3.卸载网卡后,在列表最上面,右键点击选择“扫描检测硬件改动” ![img](https://public-1251015552.cos.ap-guangzhou.myqcloud.com/Uploads/image/2023-07-27/11340759f1a59.jpeg) 4.扫描后就恢复正常了,可以查看到2个物理网卡都正常显示了 ![img](https://public-1251015552.cos.ap-guangzhou.myqcloud.com/Uploads/image/2023-07-27/11341059f7252.jpeg)

  • Linux使用curl命令携带Cookie发起请求
    2023-07-27

    1.curl命令发起POST请求携带cookie数据 curl -X GET "http://httpbin.org/cookies" -H "accept: application/json" --cookie "user=admin;paaswd=admin" -v 响应返回的信息可以查看到cookie数据有成功传递 ![img](https://public-1251015552.cos.ap-guangzhou.myqcloud.com/Uploads/image/2023-07-27/113558b49147d.jpeg)

  • Linux使用curl命令发起POST请求
    2023-07-27

    1.curl命令发起POST请求携带JSON数据 curl -X POST -d '{"name":"test"}' http://httpbin.org/post -X 请求方式选择 POST -d 要传递的数据信息 http://httpbin.org/post 要访问的目标站 响应返回的信息可以查看到数据有成功传递 ![img](https://public-1251015552.cos.ap-guangzhou.myqcloud.com/Uploads/image/2023-07-27/113935dc0e469.jpeg)

  • Centos如何关闭多个pppoe拨号进程
    2023-07-27

    1.机器内查看同时有2个ppp拨号网卡,导致无法正常访问外部网络 ![img](https://public-1251015552.cos.ap-guangzhou.myqcloud.com/Uploads/image/2023-07-27/1142287fba4c1.jpeg) 2.通过`ps -ef | grep ppp | grep -v grep `命令可以查看到有多个pppoe进程存在 ![img](https://public-1251015552.cos.ap-guangzhou.myqcloud.com/Uploads/image/2023-07-27/1142314039aae.jpeg) 两个拨号进程都是通过物理接口eth1进行通信的 ![img](https://public-1251015552.cos.ap-guangzhou.myqcloud.com/Uploads/image/2023-07-27/1142344fb7c4a.jpeg) 3.通过以下命令将当前pppoe拨号进程都结束,重新拨号测试恢复正常 kill -9 `ps -ef | grep pppoe | grep -v grep | awk '{print $2}'`

热门标签

4008765417
扫码关注公众号