linux常見shell腳本整理
備份日志
#!/bin/bash
# 每日創(chuàng)建新的備份日志-根據(jù)日期備份
tar -czf log-`date +%Y%m%d`.tar.gz /var/log
# 通過crontab 每日定時啟動
00 03 * * 5 /root/logbak.sh
監(jiān)控內(nèi)存和磁盤容量,小于給定值時報警
#!/bin/bash
# 實時監(jiān)控本機內(nèi)存和硬盤剩余空間,剩余內(nèi)存小于500M、根分區(qū)剩余空間小于1000M時,發(fā)送報警郵件給root管理員
# 提取根分區(qū)剩余空間
disk_size=$(df / | awk '/\//{print $4}')
# 提取內(nèi)存剩余空間
mem_size=$(free | awk '/Mem/{print $4}')
while :
do
# 注意內(nèi)存和磁盤提取的空間大小都是以 Kb 為單位
if [ $disk_size -le 512000 -a $mem_size -le 1024000 ]
then
mail ‐s "Warning" root <<EOF
Insufficient resources,資源不足
EOF
fi
done
監(jiān)控網(wǎng)段中的主機狀態(tài)
#!/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
根據(jù)文件創(chuàng)建用戶名密碼
#!/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
統(tǒng)計時間段內(nèi)訪問量
#!/bin/bash
# 統(tǒng)計時間段內(nèi)的訪問量
awk -F "[ /:]" '$7":"$8>="13:30" && $7":"$8<="14:30"' /var/log/httpd/access_log |wc -l
# 統(tǒng)計時間段內(nèi)的訪問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 服務(wù)已經(jīng)處于開啟狀態(tài)"
else
$program
fi
stop(){
if [ -! -f $pid ];then
echo "nginx 服務(wù)已經(jīng)關(guān)閉"
else
$program -s stop
echo "關(guān)閉服務(wù) ok"
fi
}
status(){
if [ -f $pid ];then
echo "服務(wù)正在運行..."
else
echo "服務(wù)已經(jīng)關(guān)閉"
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 #腳本寫完后,將腳本放入計劃任務(wù)每天執(zhí)行一次腳本
0 1 * * * /data/scripts/nginx_log.sh
檢測Mysql數(shù)據(jù)庫連接數(shù)量
#!/bin/bash
# 檢測 MySQL 數(shù)據(jù)庫連接數(shù)量
# 本腳本每 2 秒檢測一次 MySQL 并發(fā)連接數(shù),可以將本腳本設(shè)置為開機啟動腳本,或在特定時間段執(zhí)行
# 以滿足對 MySQL 數(shù)據(jù)庫的監(jiān)控需求,查看 MySQL 連接是否正常
# 本案例中的用戶名和密碼需要根據(jù)實際情況修改后方可使用
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` 并發(fā)連接數(shù)為:$count" >> $log_file
done
檢測mysql服務(wù)是否存活
#!/bin/bash
# 檢測 MySQL 服務(wù)是否存活
# host 為你需要檢測的 MySQL 主機的 IP 地址,user 為 MySQL 賬戶名,passwd 為密碼
# 這些信息需要根據(jù)實際情況修改后方可使用
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(數(shù)據(jù)庫用戶名),passwd(數(shù)據(jù)庫密碼),date(備份的時間標(biāo)簽)
# dbname(需要備份的數(shù)據(jù)庫名稱,根據(jù)實際需求需要修改該變量的值,默認(rèn)備份 mysql 數(shù)據(jù)庫)
user=root
passwd=123456
dbname=mysql
date=$(date +%Y%m%d)
# 測試備份目錄是否存在,不存在則自動創(chuàng)建該目錄
[ ! -d /mysqlbackup ] && mkdir /mysqlbackup
# 使用 mysqldump 命令備份數(shù)據(jù)庫
mysqldump -u "$user" -p "$passwd" "$dbname" > /mysqlbackup/"$dbname"-${date}.sql
根據(jù)md5校驗碼,檢測文件是否修改
#!/bin/bash
# 根據(jù) md5 校驗碼,檢測文件是否被修改
# 本示例腳本檢測的是/etc 目錄下所有的 conf 結(jié)尾的文件,根據(jù)實際情況,您可以修改為其他目錄或文件
# 本腳本在目標(biāo)數(shù)據(jù)沒有被修改時執(zhí)行一次,當(dāng)懷疑數(shù)據(jù)被人篡改,再執(zhí)行一次
# 將兩次執(zhí)行的結(jié)果做對比,MD5 碼發(fā)生改變的文件,就是被人篡改的文件
for i in $(ls /etc/*.conf)
do
md5sum "$i" >> /var/log/conf_file.log
done
非交互生成ssh秘鑰文件
#!/bin/bash
# 非交互自動生成 SSH 密鑰文件
# ‐t 指定 SSH 密鑰的算法為 RSA 算法;‐N 設(shè)置密鑰的密碼為空;‐f 指定生成的密鑰文件>存放在哪里
rm -rf ~/.ssh/{known_hosts,id_rsa*}
ssh‐keygen -t RSA -N '' -f ~/.ssh/id_rsa
監(jiān)控http服務(wù)器狀態(tài)
#!/bin/bash
# 監(jiān)控 HTTP 服務(wù)器的狀態(tài)(測試返回碼)
# 設(shè)置變量,url為你需要檢測的目標(biāo)網(wǎng)站的網(wǎng)址(IP 或域名),比如百度
url=http://http://183.232.231.172/index.html
# 定義函數(shù) check_http:
# 使用 curl 命令檢查 http 服務(wù)器的狀態(tài)
# ‐m 設(shè)置curl不管訪問成功或失敗,最大消耗的時間為 5 秒,5 秒連接服務(wù)為相應(yīng)則視為無法連接
# ‐s 設(shè)置靜默連接,不顯示連接時的連接速度、時間消耗等信息
# ‐o 將 curl 下載的頁面內(nèi)容導(dǎo)出到/dev/null(默認(rèn)會在屏幕顯示頁面內(nèi)容)
# ‐w 設(shè)置curl命令需要顯示的內(nèi)容%{http_code},指定curl返回服務(wù)器的狀態(tài)碼
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)
# 生成報警郵件的內(nèi)容
echo "當(dāng)前時間為:$date
$url 服務(wù)器異常,狀態(tài)碼為${status_code}.
請盡快排查異常." > /tmp/http$$.pid
# 指定測試服務(wù)器狀態(tài)的函數(shù),并根據(jù)返回碼決定是發(fā)送郵件報警還是將正常信息寫入日志
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 字節(jié)的文件
dir="/var/www/html"
find $dir -type f -size 0 -exec rm -rf {} \;
查找linux系統(tǒng)中的僵尸進程
#!/bin/bash
# 查找 Linux 系統(tǒng)中的僵尸進程
# 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
##
生成隨機密碼(指定字符串)
# 生成隨機密碼(字串截取版本)
# 設(shè)置變量 key,存儲密碼的所有可能性(密碼庫),如果還需要其他字符請自行添加其他密碼字符
# 使用$#統(tǒng)計密碼庫的長度
key="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
num=${#key}
# 設(shè)置初始密碼為空
pass=''
# 循環(huán) 8 次,生成隨機密碼
# 每次都是隨機數(shù)對密碼庫的長度取余,確保提取的密碼字符不超過密碼庫的長度
# 每次循環(huán)提取一位隨機密碼,并將該隨機密碼追加到 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:
## 顯示本機系統(tǒng)上所有開放的端口列表
ss -nutlp | awk '{print $1,$5}' | awk -F"[: ]" '{print "協(xié)議:"$1,"端口號:"$NF}' | grep "[0‐9]" | uniq
修改linux系統(tǒng)最大打開文件數(shù)量
#!/bin/bash
# 修改 Linux 系統(tǒng)的最大打開文件數(shù)量
# 往/etc/security/limits.conf 文件的末尾追加兩行配置參數(shù),修改最大打開文件數(shù)量為 65536
cat >> /etc/security/limits.conf <<EOF
* soft nofile 65536
* hard nofile 65536
EOF
一次部署memcache
#!/bin/bash
# 一鍵部署 memcached
# 腳本用源碼來安裝 memcached 服務(wù)器
# 注意:如果軟件的下載鏈接過期了,請更新 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 "顯示數(shù)字月份(如:12)"
date +%m
echo "顯示數(shù)字日期(如:01 號)"
date +%d
echo "顯示數(shù)字年(如: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文件可執(zhí)行
- chmod u+x /root/s1.sh 保證sh文件的執(zhí)行權(quán)限
- crontab -e 編輯定時任務(wù)
- */1 * * * * /root/s1.sh # 設(shè)置每分鐘執(zhí)行一次
#!/bin/bash
python3 /root/job.py
echo 'Python腳本執(zhí)行成功,時間:' >> /root/log
date >> /root/log
開啟和關(guān)閉jar操作
- jar包名稱為 uid-consumer-1.1.0-SNAPSHOT.jar
#!/bin/sh
# 該腳本為Linux下啟動java程序的腳本
# 特別注意:
# 該腳本使用系統(tǒng)kill命令來強制終止指定的java程序進程。
# 所以在殺死進程前,可能會造成數(shù)據(jù)丟失或數(shù)據(jù)不完整。如果必須要考慮到這類情況,則需要改寫此腳本,
# 根據(jù)實際情況來修改以下配置信息 ##################################
# JAVA應(yīng)用程序的名稱
APP_NAME=uid-consumer
# JAVA應(yīng)用程序端口號
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虛擬機啟動參數(shù)
JAVA_OPTS="-Xms512m -Xmx512m -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=1024m -XX:ParallelGCThreads=4 -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=utf-8"
# 根據(jù)實際情況來修改以上配置信息 ##################################
# 檢查程序是否處于運行狀態(tài)
is_exist() {
# 查詢出應(yīng)用服務(wù)的進程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,即腳本運行的當(dāng)前 進程ID號)
# $! Shell最后運行的后臺Process的PID(后臺運行的最后一個進程的 進程ID號)
# $? 最后運行的命令的結(jié)束代碼(返回值)即執(zhí)行上一個指令的返回值 (顯示最后命令的退出狀態(tài)。0表示沒有錯誤,其他任何值表明有錯誤)
# $- 顯示shell使用的當(dāng)前選項,與set命令功能相同
# $* 所有參數(shù)列表。如"$*"用「"」括起來的情況、以"$1 $2 … $n"的形式輸出所有參數(shù),此選項參數(shù)可超過9個。
# $@ 所有參數(shù)列表。如"$@"用「"」括起來的情況、以"$1" "$2" … "$n" 的形式輸出所有參數(shù)。
# $# 添加到Shell的參數(shù)個數(shù)
# $0 Shell本身的文件名
# $1~$n 添加到Shell的各參數(shù)值。$1是第1參數(shù)、$2是第2參數(shù)…。
# 服務(wù)啟動方法
start() {
is_exist
if [ $? -eq "1" ]; then
echo "$APP_NAME is already running pid is ${pid}"
else
# jar服務(wù)啟動腳本
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
}
# 服務(wù)停止方法
stop() {
# is_exist
pidf=$(cat $JAR_PID)
# echo "$pidf"
echo "pid = $pidf begin kill $pidf"
kill $pidf
rm -rf $JAR_PID
sleep 2
# 判斷服務(wù)進程是否存在
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
}
# 服務(wù)運行狀態(tài)查看方法
status() {
is_exist
if [ $? -eq "1" ]; then
echo "$APP_NAME is running,pid is ${pid}"
else
echo "$APP_NAME is not running!"
fi
}
# 重啟服務(wù)方法
restart() {
# 調(diào)用服務(wù)停止命令
stop
# 調(diào)用服務(wù)啟動命令
start
}
# 幫助說明,用于提示輸入?yún)?shù)信息
usage() {
echo "Usage: sh run-service.sh [ start | stop | restart | status ]"
exit 1
}
###################################
# 讀取腳本的第一個參數(shù)($1),進行判斷
# 參數(shù)取值范圍:{ start | stop | restart | status }
# 如參數(shù)不在指定范圍之內(nèi),則打印幫助信息
###################################
#根據(jù)輸入?yún)?shù),選擇執(zhí)行對應(yīng)方法,不輸入則執(zhí)行使用說明
case "$1" in
'start')
start
;;
'stop')
stop
;;
'restart')
restart
;;
'status')
status
;;
*)
usage
;;
esac
exit 0
文章來源地址http://www.zghlxwxcb.cn/news/detail-704007.html
文章來源:http://www.zghlxwxcb.cn/news/detail-704007.html
到了這里,關(guān)于linux中常用shell腳本整理的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!