Linux常用shell脚本

1.批量kill进程号

eth='5668  5673  7733  7738  10512  10517  12453  12458  17134  17139  18075  18080  20340  20345  21120'

for name in $eth
do
	echo "Pid  is $name"
	echo "kill -9 $name"
	kill -9 $name
done

2.通过进程名kill

ps -ef| grep tomcat|awk '{print $2}'|xargs kill -9

3.查找所有的java进行,然后打印出来

pidlist=`ps -ef|grep java |grep -v "grep" |awk '{print $2}'`
if [ "$pidlist" = "" ]  
then   
  echo "no java process alive"  
else  
  for pid in ${pidlist}  
  {  
    echo "java process is: $pid:"  
  }    
fi  

4./home目录里面有data目录,data目录里面有a、b、c、d、e五个目录,现在要把data目录里面除过e目录之外的所有目录拷贝到/bak目录中

方法一:终端命令行下执行以下命令
cp -R `find /home/data -type d -path /home/data/e -prune -o -print | sed 1d ` /bak
########################################################
脚本实现
脚本存放路径/home/osyunwei.sh
vi /home/osyunwei.sh #编辑脚本,添加下面的代码
#!/bin/sh
cp -R `find /home/data -type d -path /home/data/e -prune -o -print | sed 1d ` /bak
chmod +x /home/osyunwei.sh #添加脚本执行权限
cd /home #进入脚本存放目录
./osyunwei.sh #执行脚本
########################################################

方法二:使用cp命令复制的时候,只能排除一个目录不被复制,如果想排除两个或者多个目录的话,就需要使用rsync命令来实现了,看下面的例子
如果要排除/home/data目录下面的a、b、c、三个目录,同时拷贝其它所有目录,执行以下命令
yum install rsync #安装rsync
rsync -av --exclude data/a --exclude data/b --exclude data/c data /bak

注意:--exclude后面的路径不能为绝对路径,必须为相对路径才可以,否则出错。
----------------------------------------------------------------------------

5.一键启停服务(需要服务结构都一致)

#!/bin/sh

echo "一键启停10.39服务"
command=$1

if [ $# -ne 1 ]
then
    echo "usage: $0   stop|start"
    exit
fi

server_list="pluto-ps-server-new pluto-ps-support-server pluto-ps-company-new"
echo "**********$command 服务**********"
for name in $server_list
do
	echo "######$command  $name ######"
	server_name=/data/$name/bin/server.sh
	#echo "/bin/bash $server_name $command"
	/bin/bash $server_name $command
	
	echo "等待3秒"
	sleep 3
	process_number=`ps -ef  | grep /data/$name | grep -v 'grep'| wc -l`
	#echo "$name 进程数:$process_number"
	processId=`ps -ef | grep /data/$name |  grep -v 'grep' | awk '{ print $2 }'`	
	for ID in $processId
	do
		echo "processID:$ID"
	done
	
	if [ $process_number -eq 1  ];then
		echo "$name 服务已启动"
	elif [ $process_number -eq 0  ];then
                echo "$name 服务已停止"
        else
		echo "$name 已开启多个进程,请确认服务是否正常"
	fi
done
echo "**********$command 服务结束**********"

6.查找配置文件进行替换

#!/bin/bash
if [ $# != 1 ] ; then
        echo "请输入文件路径  eg: 目标路径"
        exit 1;
fi
project=$1
Filepath=/data/$1/conf/env
WebPath=/data/$1/WEB-INF/classes

echo "配置文件目录:$Filepath"
remoting=remoting.properties



if [ -d "$WebPath" ];then
	cd $WebPath
	echo "替换目录:$WebPath"

	if [ -f  "$remoting" ]; then
        	echo "替换$remoting文件的配置"
	        find $Filepath -name $remoting | xargs sed -ri 's/rabbit.address=([0-9]{1,3}\.){3}[0-9]{1,3}/rabbit.address=192.168.10.59/g'
	        find $Filepath -name $remoting | xargs sed -i 's/rabbit.username=.*/rabbit.username=it/g'
	        find $Filepath -name $remoting | xargs sed -i 's/rabbit.password=.*/rabbit.password=its123/g'
	        find $Filepath -name $remoting | xargs sed -i 's/virtualhost=.*/virtualhost=\//g'
	        find $Filepath -name $remoting | xargs sed -i 's/virtual=.*/virtual=\//g'
        
        	#文件服务器
	        find $Filepath -name $remoting | xargs sed -ri 's/server=([0-9]{1,3}\.){3}[0-9]{1,3}/server=192.168.10.59/g'
	        find $Filepath -name $remoting | xargs sed -i 's/user=.*/user=it/g'
	        find $Filepath -name $remoting | xargs sed -i 's/password=.*/password=its123/g'
	fi
fi 

7.远程拷贝

将192.168.10.55机器上面/data/pluto-is/lib下面的文件拷贝到本地/data/pluto-is/lib下面
[root@localhost venus-web-fin]# scp [email protected]:/data/pluto-is/lib/*  /data/pluto-is/lib/


shell脚本密码远程拷贝:
#!/bin/bash
orgFile=/home/jenkins/file/*.pdf

sshpass -p 'passwd' scp  $orgFile  [email protected]:/home/node/

8.Linux shell判断文件和文件夹是否存在

myPath="/var/log/httpd/"  
myFile="/var /log/httpd/access.log"  

#这里的-d 参数判断$myPath是否存在  
if [ ! -d "$myPath"]; then  
  mkdir "$myPath"  
fi  
  
#这里的-f参数判断$myFile是否存在  
if [ ! -f "$myFile" ]; then  
  touch "$myFile"  
fi  

9.通过端口查看应用程序(例如:查找6028端口)

ps -ef  | grep  `netstat -anpl | grep 6028 | awk NR==1'{ print $7 }'  | grep -o "[0-9]*[0-9]" `

10.配置jenkins自动开机启动以及service脚本

1).将脚本存放于/etc/init.d目录,并且命名为jenkins

#!/bin/bash
#gedit /etc/init.d/jenkins
# chkconfig: 2345 10 90 其中2345是默认启动级别,10是启动优先级,90是停止优先级,优先级范围是0-100,数字越大,优先级越低
#需要需要加载环境变量,请去掉下行注释
#export  JAVA_HOME=/usr/local/java/jdk1.8.0_211

prog=jenkins

start() {
	nohup  /usr/local/java/jdk1.8.0_211/bin/java -jar /home/jenkins/jenkins.war --httpPort=8099 > /home/jenkins/nohup.out &
}
stop() {
	ps -ef| grep jenkins | grep -v 'grep' |awk '{print $2}'|xargs kill -9
}

case "$1" in
start)
        start
        ;;
stop)
        stop
        ;;
*)
        echo $"Usage: $prog {start|stop}"
        exit 1
esac

Nginx示例:

#!/bin/bash
#
# chkconfig: - 85 15
# description: Nginx is a World Wide Web server.
# processname: nginx

nginx=/usr/local/webserver/nginx/sbin/nginx
conf=/usr/local/webserver/nginx/conf/nginx.conf
case $1 in
start)
echo -n "Starting Nginx"
$nginx -c $conf
echo " done"
;;
stop)
echo -n "Stopping Nginx"
killall -9 nginx
echo " done"
;;
test)
$nginx -t -c $conf
;;
reload)
echo -n "Reloading Nginx"
ps auxww | grep nginx | grep master | awk '{print $2}' | xargs kill -HUP
echo " done"
;;
restart)
$0 stop
$0 start
;;
show)
ps -aux|grep nginx
;;
*)
echo -n "Usage: $0 {start|restart|reload|stop|test|show}"
;;
esac

参考文献:nginx启动、重启、关闭_helloxiaozhe的博客-CSDN博客_nginx启动

2.chkconfig --add  jenkins

3.检查8099端口是否开放

查看是否开启防火墙

systemctl status firewalld

查看是否开放端口8099

firewall-cmd --list-ports

 没有开放,则加入

firewall-cmd --permanent --zone=public --add-port=8099/tcp

重启防火墙

systemctl reload firewalld

11.备份mysql脚本命令

#!/bin/bash
#SHELL_DAY=$(date '+%Y%m%d%H%M%S')
SHELL_DAY=$(date '+%Y%m%d')
BACK_DIR="/data/sql_bak"
HOST="机器IP"
ACCOUNT="数据库用户名"
MYSQLDUMP="/usr/local/mysql5.7/bin/mysqldump"

${MYSQLDUMP} -u${ACCOUNT} -p'数据库密码' 数据库名 > ${BACK_DIR}/数据库名_${SHELL_DAY}.sql

参考文献:

nginx启动、重启、关闭_helloxiaozhe的博客-CSDN博客_nginx启动

linux服务开机启动 - 胡国洪 - 博客园

12.Window强制关闭进程并删除文件

tasklist 查询进程

taskkill /f /t 强制关闭进程和子进程

@echo off
echo 清除搜狗广告程序,稍等......

cd C:\Program Files (x86)\SmartCloudInput\1.4.4.10311

taskkill -f -t -im SCHelper.exe

taskkill /f /t /pid 端口

tasklist | findstr "SCHelper.exe"


del /f /s   SCHelper.exe


echo 清除完成!
echo. & pause

13.替换文件内容

#!/bin/bash

filelist="bxds-sem5.html bxds-sem90.html"

for name in $filelist
do
	echo "file  is $name"
    #正则表达式获取数字
	var1_key=`echo $name | tr -cd "[0-9]"`
	sem="gj-sem"$var1_key
	new="bxds-sem"$var1_key
	file="/home/rocketai/url/"$name
	echo $sem
	echo $new
    #一次性替换多个内容
	sed  -i "s/管家/大使/g;  s/"$sem"/"$new"/g" $file	
    #将带abc.png(abc后面3个字符)  文件替换成abc.jpg
	sed -i "s/"$new"\.[a-z][a-z][a-z]/"$new".jpg/g" $file
done

14.检测java服务启动是否正常

#项目对应模块的日志文件
APPOUT="/data/logs/ps-server.log"
APP=abc-server

function checkPro(){
echo "服务启动中,请稍等"

num=1
while test $num -le 60 
do
	if [ -f "$APPOUT" ]; then
                CHECK_RESULT=`cat $APPOUT | grep 'report to eureka' | wc -l`
		if test $CHECK_RESULT -eq 0 ; then
                        CHECK_RESULT=`cat $APPOUT | grep 'Tomcat started' | wc -l`
                fi
        elif [ -f "$APPOUTFILE" ]; then
                CHECK_RESULT=`cat $APPOUTFILE | grep 'report to eureka' | wc -l`
		if test $CHECK_RESULT -eq 0 ; then
                        CHECK_RESULT=`cat $APPOUTFILE | grep 'Tomcat started' | wc -l`
                fi
        fi
        #echo $num
        #CHECK_RESULT=`cat $APPOUT | grep 'report to eureka' | wc -l`
        if test $CHECK_RESULT -eq 1 ; then
                echo "【服务启动成功】"
                exit 0
        else
                sleep 5
        fi
        let num++
done
echo "【服务启动异常,请查看服务日志】"
curl 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=XXXX' \ -H 'Content-Type: application/json' \-d '{"msgtype": "text","text": {"content": "'$APP' 服务启动失败,请查看日志"}}'
exit

}

15.通过企业微信(机器人)发送消息通知

1.企业群添加机器人获取webhook地址
https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=XXX

2.shell脚本添加此代码
curl 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=XXX' \ -H 'Content-Type: application/json' \-d '{"msgtype": "text","text": {"content": "'$APP' 服务启动失败,请查看日志"}}'

16.更改服务器某个应用程序的时间

1.安装libfaketime
yum install epel-release 然后 yum install libfaketime
2.指定开始日期@2022-03-23 19:00:00的情况下运行测试程序
export LD_PRELOAD=/usr/lib64/faketime/libfaketime.so.1 FAKETIME_NO_CACHE=1 FAKETIME_DONT_FAKE_MONOTONIC=1  FAKETIME="@2022-03-23 19:00:00"


a.如果是通过java -jar test.jar 启动,在java前添加
LD_PRELOAD=/usr/lib64/faketime/libfaketime.so.1 FAKETIME_NO_CACHE=1 FAKETIME_DONT_FAKE_MONOTONIC=1  FAKETIME="@2022-03-23 19:00:00" java -jar test.jar

b.通过tomcat 启动
在startup.sh脚本中添加一行
export LD_PRELOAD=/usr/lib64/faketime/libfaketime.so.1 FAKETIME_NO_CACHE=1 FAKETIME_DONT_FAKE_MONOTONIC=1  FAKETIME="@2022-03-23 19:00:00"


参考文献:
https://102no.com/2019/11/26/libfaketime-use/

17.占用磁盘空间最大的那几个目录

du -h -m --max-depth=1 ./ | sort -nr

-h 表示以人们通俗易懂的方式显示,如以k/M/g为单位进行显示,而不是以Byte为单位。

-m 以M为单位进行显示。

--max-depth=x 表示显示目录的最大深度,其中x表示最大深度。

sort -nr表示对第一列的数值(即磁盘空间占用情况)进行降序排序,-n表示进行数值比较,-r表示进行降序排序

proc 目录 进程ID 生成对应一个文件夹,如果文件占用比较大,重启该服务

Linux常用shell脚本_第1张图片

18.top 命令倒序显示

执行top命令后,执行SHIFT +F ,可以选择按某列排序,例如选择n后,就会按字段%MEM排序

shift+m 或大写键M 让top命令按字段%MEM来排序

Shift+p 或大写键盘P 让top命令按字段%CPU来排序

ps命令找出占用内存资源最多的5个进程

ps aux | head -1;ps aux |grep -v PID |sort -rn -k +4 | head -5

你可能感兴趣的:(服务端配置,linux,ssh,运维)