linux中常用shell脚本整理

linux常见shell脚本整理

备份日志

#!/bin/bash  
# 每日创建新的备份日志-根据日期备份
tar  -czf  log-`date +%Y%m%d`.tar.gz  /var/log  
# 通过crontab 每日定时启动
00  03  *  *  5  /root/logbak.sh  

监控内存和磁盘容量,小于给定值时报警

#!/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  

监控网段中的主机状态

#!/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    

根据文件创建用户名密码

#!/bin/bash  

for i in `cat user.txt`  
do  
     useradd  $i  
     echo "123456" | passwd ‐‐stdin $i  
done  

查看连接本机的Ip

#!/bin/bash 
netstat -atn  |  awk  '{print $5}'  | awk  '{print $1}' | sort -nr  |  uniq -c 

统计时间段内访问量

#!/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  

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  

自动切割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 

检测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  

检测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

备份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  

根据md5校验码,检测文件是否修改

#!/bin/bash  
  
# 根据 md5 校验码,检测文件是否被修改   
# 本示例脚本检测的是/etc 目录下所有的 conf 结尾的文件,根据实际情况,您可以修改为其他目录或文件  
# 本脚本在目标数据没有被修改时执行一次,当怀疑数据被人篡改,再执行一次  
# 将两次执行的结果做对比,MD5 码发生改变的文件,就是被人篡改的文件  
for i in $(ls /etc/*.conf)  
do  
  md5sum "$i" >> /var/log/conf_file.log  
done  

非交互生成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

监控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  

删除目录下大小为0的文件

#!/bin/bash  
# 删除某个目录下大小为 0 的文件  
#/var/www/html 为测试目录,脚本会清空该目录下所有 0 字节的文件  
dir="/var/www/html"  
find $dir -type f -size 0 -exec rm -rf {} \;  

查找linux系统中的僵尸进程

#!/bin/bash  
  
# 查找 Linux 系统中的僵尸进程  
# awk 判断 ps 命令输出的第 8 列为 Z 是,显示该进程的 PID 和进程命令  
ps aux | awk '{if($8 == "Z"){print $2,$11}}'

生成随机密码

#!/bin/bash  
  
# 生成随机密码(urandom 版本)   
tr -dc '_A‐Za‐z0‐9' </dev/urandom | head -c 10  

## 

生成随机密码(指定字符串)

# 生成随机密码(字串截取版本)   
  
# 设置变量 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  

获取本地的一些信息

#!/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  

修改linux系统最大打开文件数量

#!/bin/bash  
  
# 修改 Linux 系统的最大打开文件数量   
  
# 往/etc/security/limits.conf 文件的末尾追加两行配置参数,修改最大打开文件数量为 65536  
cat >> /etc/security/limits.conf <<EOF  
* soft nofile  65536  
* hard nofile  65536  
EOF  

一次部署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  

打印各种格式的时间

  
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"  

生成签名秘钥和证书

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  

定时启动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

开启和关闭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

你可能感兴趣的:(服务端运维技术整理,linux,运维,服务器)