前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【shell系列】环境管理必备工具shell

【shell系列】环境管理必备工具shell

作者头像
用户9913368
发布2022-08-13 16:09:20
3720
发布2022-08-13 16:09:20
举报
文章被收录于专栏:嘎嘎软件测试

目录

一、什么是shell

二、shell脚本的运用场景

三、常用的shell脚本

四、总结

一、什么是shell

shell 是一个应用程序,它连接了用户和 Linux 内核,让用户能够更加高效、安全、低成本地使用 Linux 内核,这就是 shell 的本质。

简单来说,我们就是通过shell来操作Linux。下面我来分享下我之前工作中常用的一些shell脚本。

二、shell脚本的运用场景

掌握shell脚本的使用方式在我们环境管理上是非常有帮助的。

举例子,我们可以通过shell脚本检测测试开发环境的应用进程是否存在,若有异常可以发送钉钉通知或者邮件通知;检测应用是否正常启动;定时清理测试开发环境的日志文件,缓存文件等;等等一系列环境问题都可通过shell来帮我们实现。

三、常用的shell脚本

1、for循环

代码语言:javascript
复制
#!/usr/bin/env bash

#-----------------------------------------------------------------------------
# author: wmh
# 脚本说明:for循环.
#-----------------------------------------------------------------------------

for1() {
  array=(a b c)
  for i in ${array[@]}; do
    echo "for循环: ${i}"
  done
}

for2() {
  array1=(a1 b1 c1)
  array2=(a2 b2 c2)
  for ((i = 0; i < ${#array1[@]}; i++)); do
    for ((i = 0; i < ${#array2[@]}; i++)); do
      echo "for循环 第i=${i}次: ${array1[i]} ${array2[i]}"
    done
  done
}

for3() {
  array1=(a1 b1 c1)
  array2=(a2 b2 c2)
  #数组位置的话需要加!
  for i in ${!array1[@]}; do
    for j in ${!array2[@]}; do
      # ${i} -eq ${j}: 表示参数i和参数j的位置相同
      if [ ${i} -eq ${j} ]; then
        echo "for循环 第i=${i} j=${j}次: array1=${array1} array2=${array2}"
        echo "for循环 第i=${i} j=${j}次: array1=${array1[$i]} array2=${array2[$j]}"
        echo " "
      fi
    done
  done
}

for1
for2
for3

2、检测服务

代码语言:javascript
复制
#!/bin/bash

#-----------------------------------------------------------------------------
# author: wmh
# 脚本说明:检查服务进程是否存在, 若不存在则进行钉钉通知.
#-----------------------------------------------------------------------------

time=$(date +%Y-%m-%d_%H:%M:%S)

# content里面的参数需要加 ''
funDingTalk() {
  curl 'https://oapi.dingtalk.com/robot/send?access_token=1234567890' \
    -H 'Content-Type: application/json' \
    -d '{"msgtype": "text",
       "text": {
          "content": "'$time' '${HOSTNAME}' '$1' has been killed"
         }
       }'
}

pid_check() {
  pid=$(ps aux | grep $1 | grep -v grep | awk '{print $2}')
  if [ "$pid" ]; then
    echo -e "\033[32m$time $1 $pid 存在进程\n\033[0m"
  else
    echo -e "\033[31m$time $1 无进程\n\033[0m"
    funDingTalk $1
  fi
}

app_list=(app1 app2 app3 app4)

for i in ${app_list[@]}; do
  pid_check $i
done

3、读取txt

代码语言:javascript
复制
#!/bin/bash

#-----------------------------------------------------------------------------
# author: wmh
# 脚本说明:读取txt内容, 切割字符串.
#-----------------------------------------------------------------------------

array1=$(cat ./demo.txt)
array2='a,b,c'

for arr in ${array1}; do
  vars=(${arr//,/ })
  echo "获取变量1: ${vars[0]} ${vars[1]} ${vars[2]}"

  for var in ${vars[@]}; do
    echo "获取变量2: ${var}"
  done
  echo " "
done

demo.txt内容如下:a1,a2,a3
b1,b2,b3
c1,c2,c3

4、检查输出是否包含关键字

代码语言:javascript
复制
#!bin/bash

#-----------------------------------------------------------------------------
# author: wmh
# 脚本说明:检测启动后输出的日志是否包含关键字, 包含在退出程序, 不包含则继续.
#-----------------------------------------------------------------------------

var=`cd /tmp/bin && su username stop.sh; su username start.sh`

echo "var关键字: $var"

if [[ $var = *not* ]];then
    echo "包含关键字啦, 退出"
    exit 1
else
    echo "不包含关键字, 正常输出"
fi

5、清除文件

代码语言:javascript
复制
#!/bin/bash

#-----------------------------------------------------------------------------
# author: wmh
# 脚本说明:清除文件.
#-----------------------------------------------------------------------------

echo "清除3天前的tmp|zip文件"
find /tmp/*/logs -mtime +3 | egrep "\.(tmp|zip)$" | xargs rm -f

echo "清除1天前的gz文件"
find /tmp/ -mtime +1 -name "*.gz" | xargs rm -f

echo "清除重定向大日志文件"
for i in $(find /tmp/*/logs/catalina.out); do
  cat /dev/null >$i
done

echo "清除僵尸进程"
for n in $(lsof | grep delete | awk '{print $2}'); do
  echo $n
  kill -9 $n
done

6、批量给文件名添加前缀

代码语言:javascript
复制
#!/usr/bin/env bash

#-----------------------------------------------------------------------------
# author: wmh
# 脚本说明:批量给文件名添加前缀, 只支持文件, 不支持文件夹. 注:cp表示复制, mv表示剪切
#-----------------------------------------------------------------------------

cd /tmp
for i in $(ls); do
  cp -rf $i "prefix_"$i
done

相关脚本我已经放到仓库里面了,有需要的小伙伴可以自取:

代码语言:javascript
复制
https://github.com/WEIMHaaa/wei-notebook.git
https://gitee.com/weimenghua/wei-notebook.git

四、总结

掌握环境管理的能力是作为测试工程师很重要的技能之一,挖掘团队测试过程中遇到的痛点,将阻碍研发效率的一切问题作为切入点,去想方案进行解决,我愿称之为效能工程师。

奈何我选择了一个不适合的路,多说无益。我现在还是会持续输出我所学到的,整理出来的,我所感悟出来的,希望能帮到在测试领域一起努力的小伙伴吧~我相信2022年一定是我好运的一年。

我们下期再见~

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-01-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 嘎嘎软件测试 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档