• linux中常用shell脚本整理


    linux常见shell脚本整理

    备份日志
    #!/bin/bash  
    # 每日创建新的备份日志-根据日期备份
    tar  -czf  log-`date +%Y%m%d`.tar.gz  /var/log  
    # 通过crontab 每日定时启动
    00  03  *  *  5  /root/logbak.sh  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    监控内存和磁盘容量,小于给定值时报警
    #!/bin/bash  
      
    # 实时监控本机内存和硬盘剩余空间,剩余内存小于500M、根分区剩余空间小于1000M时,发送报警邮件给root管理员  
      
    # 提取根分区剩余空间  
    disk_size=$(df / | awk '/\//{print $4}')  
      
    # 提取内存剩余空间  
    mem_size=$(free | awk '/Mem/{print $4}')  
    while :  
    do  
    # 注意内存和磁盘提取的空间大小都是以 Kb 为单位  
    if  [  $disk_size -le 512000 -a $mem_size -le 1024000  ]  
    then  
        mail  ‐s  "Warning"  root  <<EOF  
      Insufficient resources,资源不足  
    EOF  
    fi  
    done  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    监控网段中的主机状态
    #!/bin/bash  
      
    myping(){  
    ping ‐c 2 ‐i 0.3 ‐W 1 $1  &>/dev/null  
    if  [ $? -eq 0 ];then  
      echo "$1 is up"  
    else  
      echo "$1 is down"  
    fi  
    }  
    for i in {1..254}  
    do  
         myping 192.168.4.$i &  
    done    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    根据文件创建用户名密码
    #!/bin/bash  
    
    for i in `cat user.txt`  
    do  
         useradd  $i  
         echo "123456" | passwd ‐‐stdin $i  
    done  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    查看连接本机的Ip
    #!/bin/bash 
    netstat -atn  |  awk  '{print $5}'  | awk  '{print $1}' | sort -nr  |  uniq -c 
    
    • 1
    • 2
    统计时间段内访问量
    #!/bin/bash 
    # 统计时间段内的访问量 
    awk -F "[ /:]" '$7":"$8>="13:30" && $7":"$8<="14:30"' /var/log/httpd/access_log |wc -l 
    # 统计时间段内的访问Ip
    awk -F "[ /:]" '$7":"$8>="13:30" && $7":"$8<="14:30"{print $1}' /var/log/httpd/access_log  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    Nginx启动脚本
    #!/bin/bash  
    
    program=/usr/local/nginx/sbin/nginx  
    pid=/usr/local/nginx/logs/nginx.pid  
    start(){  
    if [ -f $pid ];then  
      echo  "nginx 服务已经处于开启状态"  
    else  
      $program  
    fi  
    stop(){  
    if [ -! -f $pid ];then  
      echo "nginx 服务已经关闭"  
    else  
      $program -s stop  
      echo "关闭服务 ok"  
    fi  
    }  
    status(){  
    if [ -f $pid ];then  
      echo "服务正在运行..."  
    else  
      echo "服务已经关闭"  
    fi  
    }  
      
    case $1 in  
    start)  
      start;;  
    stop)  
      stop;;  
    restart)  
      stop  
      sleep 1  
      start;;  
    status)  
      status;; 
    *)  
      echo  "你输入的语法格式错误"  
    esac  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    自动切割nginx日志文件
    #mkdir  /data/scripts  
    #vim   /data/scripts/nginx_log.sh    
    #!/bin/bash  
      
    # 切割 Nginx 日志文件(防止单个文件过大,后期处理很困难)   
    logs_path="/usr/local/nginx/logs/"  
    mv ${logs_path}access.log ${logs_path}access_$(date -d "yesterday" +"%Y%m%d").log  
    kill -USR1  `cat /usr/local/nginx/logs/nginx.pid`  
      
    # chmod +x  /data/scripts/nginx_log.sh  
    # crontab  ‐e                    #脚本写完后,将脚本放入计划任务每天执行一次脚本  
    0  1  *  *   *   /data/scripts/nginx_log.sh 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    检测Mysql数据库连接数量
    #!/bin/bash  
      
    # 检测 MySQL 数据库连接数量   
      
    # 本脚本每 2 秒检测一次 MySQL 并发连接数,可以将本脚本设置为开机启动脚本,或在特定时间段执行  
    # 以满足对 MySQL 数据库的监控需求,查看 MySQL 连接是否正常  
    # 本案例中的用户名和密码需要根据实际情况修改后方可使用  
    log_file=/var/log/mysql_count.log  
    user=root  
    passwd=123456  
    while :  
    do  
        sleep 2  
        count=`mysqladmin  -u  "$user"  -p  "$passwd"   status |  awk '{print $4}'`  
        echo "`date +%Y‐%m‐%d` 并发连接数为:$count" >> $log_file  
    done  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    检测mysql服务是否存活
    #!/bin/bash  
      
    # 检测 MySQL 服务是否存活   
      
    # host 为你需要检测的 MySQL 主机的 IP 地址,user 为 MySQL 账户名,passwd 为密码  
    # 这些信息需要根据实际情况修改后方可使用  
    host=192.168.51.198  
    user=root  
    passwd=123456  
    mysqladmin -h '$host' -u '$user' -p'$passwd' ping &>/dev/null  
    if [ $? -eq 0 ]  
    then  
            echo "MySQL is UP"  
    else  
            echo "MySQL is down"  
    fi
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    备份Mysql
    #!/bin/bash  
      
    # 备份 MySQL 的 shell 脚本(mysqldump版本)   
      
    # 定义变量 user(数据库用户名),passwd(数据库密码),date(备份的时间标签)  
    # dbname(需要备份的数据库名称,根据实际需求需要修改该变量的值,默认备份 mysql 数据库)  
      
    user=root  
    passwd=123456  
    dbname=mysql  
    date=$(date +%Y%m%d)  
      
    # 测试备份目录是否存在,不存在则自动创建该目录  
    [ ! -d /mysqlbackup ] && mkdir /mysqlbackup  
    # 使用 mysqldump 命令备份数据库  
    mysqldump -u "$user" -p "$passwd" "$dbname" > /mysqlbackup/"$dbname"-${date}.sql  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    根据md5校验码,检测文件是否修改
    #!/bin/bash  
      
    # 根据 md5 校验码,检测文件是否被修改   
    # 本示例脚本检测的是/etc 目录下所有的 conf 结尾的文件,根据实际情况,您可以修改为其他目录或文件  
    # 本脚本在目标数据没有被修改时执行一次,当怀疑数据被人篡改,再执行一次  
    # 将两次执行的结果做对比,MD5 码发生改变的文件,就是被人篡改的文件  
    for i in $(ls /etc/*.conf)  
    do  
      md5sum "$i" >> /var/log/conf_file.log  
    done  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    非交互生成ssh秘钥文件
    #!/bin/bash  
      
    # 非交互自动生成 SSH 密钥文件   
    # ‐t 指定 SSH 密钥的算法为 RSA 算法;‐N 设置密钥的密码为空;‐f 指定生成的密钥文件>存放在哪里  
    rm  -rf  ~/.ssh/{known_hosts,id_rsa*}  
    ssh‐keygen -t RSA -N '' -f ~/.ssh/id_rsa
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    监控http服务器状态
    #!/bin/bash  
      
    # 监控 HTTP 服务器的状态(测试返回码)  
      
    # 设置变量,url为你需要检测的目标网站的网址(IP 或域名),比如百度  
    url=http://http://183.232.231.172/index.html  
      
    # 定义函数 check_http:  
    # 使用 curl 命令检查 http 服务器的状态  
    # ‐m 设置curl不管访问成功或失败,最大消耗的时间为 5 秒,5 秒连接服务为相应则视为无法连接  
    # ‐s 设置静默连接,不显示连接时的连接速度、时间消耗等信息  
    # ‐o 将 curl 下载的页面内容导出到/dev/null(默认会在屏幕显示页面内容)  
    # ‐w 设置curl命令需要显示的内容%{http_code},指定curl返回服务器的状态码  
    check_http()  
    {  
            status_code=$(curl -m 5 -s -o /dev/null -w %{http_code} $url)  
    }  
      
      
    while :  
    do  
            check_http  
            date=$(date +%Y%m%d‐%H:%M:%S)  
      
      
    # 生成报警邮件的内容  
            echo "当前时间为:$date  
            $url 服务器异常,状态码为${status_code}.  
            请尽快排查异常." > /tmp/http$$.pid  
      
      
    # 指定测试服务器状态的函数,并根据返回码决定是发送邮件报警还是将正常信息写入日志  
            if [ $status_code -ne 200 ];then  
                    mail -s Warning root < /tmp/http$$.pid  
            else  
                    echo "$url 连接正常" >> /var/log/http.log  
            fi  
            sleep 5  
    done  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    删除目录下大小为0的文件
    #!/bin/bash  
    # 删除某个目录下大小为 0 的文件  
    #/var/www/html 为测试目录,脚本会清空该目录下所有 0 字节的文件  
    dir="/var/www/html"  
    find $dir -type f -size 0 -exec rm -rf {} \;  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    查找linux系统中的僵尸进程
    #!/bin/bash  
      
    # 查找 Linux 系统中的僵尸进程  
    # awk 判断 ps 命令输出的第 8 列为 Z 是,显示该进程的 PID 和进程命令  
    ps aux | awk '{if($8 == "Z"){print $2,$11}}'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    生成随机密码
    #!/bin/bash  
      
    # 生成随机密码(urandom 版本)   
    tr -dc '_A‐Za‐z0‐9' </dev/urandom | head -c 10  
    
    ## 
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    生成随机密码(指定字符串)
    # 生成随机密码(字串截取版本)   
      
    # 设置变量 key,存储密码的所有可能性(密码库),如果还需要其他字符请自行添加其他密码字符  
    # 使用$#统计密码库的长度  
    key="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"  
    num=${#key}  
    # 设置初始密码为空  
    pass=''  
    # 循环 8 次,生成随机密码  
    # 每次都是随机数对密码库的长度取余,确保提取的密码字符不超过密码库的长度  
    # 每次循环提取一位随机密码,并将该随机密码追加到 pass 变量的最后  
    for i in {1..8}  
    do    
      index=$[RANDOM%num]  
      pass=$pass${key:$index:1}  
    done  
    echo $pass  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    获取本地的一些信息
    #!/bin/bash  
      
    # 获取本机 MAC 地址  
    ip a s | awk 'BEGIN{print  " 本 机 MAC 地 址 信 息 如 下 :"}/^[0‐9]/{print $2;getline;if($0~/link\/ether/){print $2}}' | grep -v lo:  
    
    ## 显示本机系统上所有开放的端口列表
    ss -nutlp | awk '{print $1,$5}' | awk -F"[: ]" '{print "协议:"$1,"端口号:"$NF}' | grep "[0‐9]" | uniq  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    修改linux系统最大打开文件数量
    #!/bin/bash  
      
    # 修改 Linux 系统的最大打开文件数量   
      
    # 往/etc/security/limits.conf 文件的末尾追加两行配置参数,修改最大打开文件数量为 65536  
    cat >> /etc/security/limits.conf <<EOF  
    * soft nofile  65536  
    * hard nofile  65536  
    EOF  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    一次部署memcache
    #!/bin/bash  
      
    # 一键部署 memcached   
    # 脚本用源码来安装 memcached 服务器  
    # 注意:如果软件的下载链接过期了,请更新 memcached 的下载链接  
    wget http://www.memcached.org/files/memcached-1.5.1.tar.gz  
    yum -y install gcc  
    tar -xf  memcached‐1.5.1.tar.gz  
    cd memcached‐1.5.1  
    ./configure  
    make  
    make install  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    打印各种格式的时间
      
    echo "显示星期简称(如:Sun)"  
    date +%a  
    echo "显示星期全称(如:Sunday)"  
    date +%A  
    echo "显示月份简称(如:Jan)"  
    date +%b  
    echo "显示月份全称(如:January)"  
    date +%B  
    echo "显示数字月份(如:12)"  
    date +%m  
    echo "显示数字日期(如:01 号)"  
    date +%d  
    echo "显示数字年(如:01 号)"  
    date +%Y echo "显示年‐月‐日"  
    date +%F  
    echo "显示小时(24 小时制)"  
    date +%H  
    echo "显示分钟(00..59)"  
    date +%M  
    echo "显示秒"  
    date +%S  
    echo "显示纳秒"  
    date +%N  
    echo "组合显示"  
    date +"%Y%m%d %H:%M:%S"  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    生成签名秘钥和证书
    read -p "请输入存放证书的目录:" dir  
    if [ ! -d $dir ];then  
      echo "该目录不存在"  
      exit  
    fi  
    read -p "请输入密钥名称:" name  
    # 使用 openssl 生成私钥  
    openssl genrsa -out ${dir}/${name}.key  
    # 使用 openssl 生成证书 #subj 选项可以在生成证书时,非交互自动填写 Common Name 信息  
    openssl req -new -x509 -key ${dir}/${name}.key -subj "/CN=common" -out ${dir}/${name}.crt  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    定时启动Python程序
    • 需要保证job.py文件可执行
    • chmod u+x /root/s1.sh 保证sh文件的执行权限
    • crontab -e 编辑定时任务
      • */1 * * * * /root/s1.sh # 设置每分钟执行一次
    #!/bin/bash
    python3 /root/job.py
    echo 'Python脚本执行成功,时间:' >> /root/log
    date >> /root/log
    
    • 1
    • 2
    • 3
    • 4
    开启和关闭jar操作
    • jar包名称为 uid-consumer-1.1.0-SNAPSHOT.jar
    #!/bin/sh
    
    # 该脚本为Linux下启动java程序的脚本
    # 特别注意:
    # 该脚本使用系统kill命令来强制终止指定的java程序进程。
    # 所以在杀死进程前,可能会造成数据丢失或数据不完整。如果必须要考虑到这类情况,则需要改写此脚本,
    # 根据实际情况来修改以下配置信息 ##################################
    
    # JAVA应用程序的名称
    APP_NAME=uid-consumer
    # JAVA应用程序端口号
    SERVER_PORT=9999
    # jar包存放路径
    JAR_PATH='/app/uid-consumer'
    # jar包名称
    JAR_NAME=uid-consumer-1.1.0-SNAPSHOT.jar
    # PID 代表是PID文件
    JAR_PID=$JAR_NAME\.pid
    # 日志输出文件
    LOG_FILE=logs
    
    # java虚拟机启动参数
    JAVA_OPTS="-Xms512m -Xmx512m -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=1024m -XX:ParallelGCThreads=4 -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=utf-8"
    
    # 根据实际情况来修改以上配置信息 ##################################
    
    
    # 检查程序是否处于运行状态
    is_exist() {
      # 查询出应用服务的进程id,grep -v 是反向查询的意思,查找除了grep操作的run.jar的进程之外的所有进程
      pid=`ps -ef|grep $JAR_NAME|grep -v grep|awk '{print $2}' `
    
      # [ ]表示条件测试。注意这里的空格很重要。要注意在'['后面和']'前面都必须要有空格
      # [ -z STRING ] 如果STRING的长度为零则返回为真,即空是真
      # 如果不存在返回0,存在返回1
      if [ -z "${pid}" ]; then
       return 0
      else
        return 1
      fi
    }
    
    # ######### Shell脚本中$0、$?、$!、$$、$*、$#、$@等的说明 #########
    
    # $$ Shell本身的PID(ProcessID,即脚本运行的当前 进程ID号)
    # $! Shell最后运行的后台Process的PID(后台运行的最后一个进程的 进程ID号)
    # $? 最后运行的命令的结束代码(返回值)即执行上一个指令的返回值 (显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误)
    # $- 显示shell使用的当前选项,与set命令功能相同
    # $* 所有参数列表。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数,此选项参数可超过9个。
    # $@ 所有参数列表。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。
    # $# 添加到Shell的参数个数
    # $0 Shell本身的文件名
    # $1~$n 添加到Shell的各参数值。$1是第1参数、$2是第2参数…。
    
    # 服务启动方法
    start() {
      is_exist
      if [ $? -eq "1" ]; then
        echo "$APP_NAME is already running pid is ${pid}"
      else
        # jar服务启动脚本
        nohup java $JAVA_OPTS -Xloggc:$LOG_FILE/gc/gclog.log -XX:HeapDumpPath=$LOG_FILE/gc/HeapDump.hprof -jar $JAR_PATH/$JAR_NAME >./$LOG_FILE/run.log 2>&1 &
        echo $! > $JAR_PID
        echo "start $APP_NAME successed pid is $! "
        tail -1000f $LOG_FILE/run.log
       fi
      }
    
    # 服务停止方法
    stop() {
      # is_exist
      pidf=$(cat $JAR_PID)
      # echo "$pidf" 
      echo "pid = $pidf begin kill $pidf"
      kill $pidf
      rm -rf $JAR_PID
      sleep 2
      # 判断服务进程是否存在
      is_exist
      if [ $? -eq "1" ]; then
        echo "pid = $pid begin kill -9 $pid"
        kill -9  $pid
        sleep 2
        echo "$APP_NAME process stopped!" 
      else
        echo "$APP_NAME is not running!"
      fi 
    }
    
    # 服务运行状态查看方法
    status() {
      is_exist
      if [ $? -eq "1" ]; then
        echo "$APP_NAME is running,pid is ${pid}"
      else
        echo "$APP_NAME is not running!"
      fi
    }
    
    # 重启服务方法
    restart() {
      # 调用服务停止命令
      stop
      # 调用服务启动命令
      start
    }
    
    # 帮助说明,用于提示输入参数信息
    usage() {
        echo "Usage: sh run-service.sh [ start | stop | restart | status ]"
        exit 1
    }
    
    ###################################
    # 读取脚本的第一个参数($1),进行判断
    # 参数取值范围:{ start | stop | restart | status }
    # 如参数不在指定范围之内,则打印帮助信息
    ###################################
    #根据输入参数,选择执行对应方法,不输入则执行使用说明
    case "$1" in
      'start')
        start
        ;;
      'stop')
        stop
        ;;
      'restart')
        restart
        ;;
      'status')
        status
        ;;
      *)
        usage
        ;;
    esac
    exit 0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
  • 相关阅读:
    时间复杂度和空间复杂度详解
    前端大文件上传如何实现(文件切片)
    宇视 EZView客户端是否支持接收VMS平台的报警
    TIA博途_基于SCL语言制作模拟量输入输出全局库的具体方法
    推荐五款装机必备的常用软件
    基于JavaSwing开发书店管理系统+论文 毕业设计 课程设计 大作业
    C++套接字库sockpp介绍
    【配电变电站的最佳位置和容量】基于遗传算法的最优配电变电站放置(Matlab代码实现)
    [C++](17)数据结构:二叉搜索树的操作与实现
    基于FPGA的图像二值化处理,包括tb测试文件和MATLAB辅助验证
  • 原文地址:https://blog.csdn.net/QingChunBuSanChang/article/details/132729774