shell脚本学习

文章目录

  • 常用命令
  • shell脚本
  • 执行定时任务
  • 部署SpringBoot
    • 打包脚本
    • 重启脚本
    • 部署脚本
    • 监听脚本

常用命令

查看端口号被哪个进程占用

netstat -tlnp | grep 端口号

shell脚本

第一个shell脚本

#!/bin/bash
echo "Hello World !"

#! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。

echo 命令用于向窗口输出文本。

将上面的代码保存为 test1.sh,并 cd 到相应目录:

# 使脚本具有执行权限
chmod +x ./test1.sh  
# 执行脚本
./test1.sh  

注意,一定要写成 ./test1.sh,而不是 test1.sh,运行其它二进制的程序也一样,
直接写 test1.sh,linux 系统会去 PATH 里寻找有没有叫 test1.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,
你的当前目录通常不在 PATH 里,所以写成 test1.sh 是会找不到命令的,要用 ./test1.sh 告诉系统说,就在当前目录找。

shell脚本后台执行

# /lzc/code/log.txt 为指定的输出日志路径
nohup ./test1.sh > /lzc/code/log.txt 2>&1 &

执行定时任务

新建脚本内容

输出当前时间,并将内容追加到/lzc/code/shelllearning/log.txt

>>代表在原文件追加,>会覆盖原文件

#!/bin/bash
echo $(date +%F%n%T) >> /lzc/code/shelllearning/log.txt

将脚本内容保存为test1.sh

编辑定时任务脚本,每分钟执行一次test1.sh

vim /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed

*/1 * * * * root /lzc/code/shelllearning/test1.sh

使得任务生效

crontab /etc/crontab

查看任务列表

crontab -l

在定时任务脚本中指定输出文件,脚本中输出的内容就会输出到指定的文件中

修改test1.sh内容

#!/bin/bash
echo $(date +%F%n%T)

修改定时任务脚本

*/1 * * * * root /lzc/code/shelllearning/test1.sh >> /lzc/code/shelllearning/log.txt

使得任务生效

crontab /etc/crontab

部署SpringBoot

打包脚本

新建dabao.sh

#!/bin/bash
# 代码地址
codePath=$1
if test -z $codePath
then
    codePath='./'
fi
echo $(date +%F%n%T) "开始打包...codePath=${codePath}"
cd $codePath
mvn clean install package -Dmaven.test.skip=true
echo $(date +%F%n%T) "打包完成.."
# 使脚本具有执行权限
chmod +x ./dabao.sh
# 启动 ./dabao.sh "代码路径, 不传则为./"
./dabao.sh "/lzc/code/demo"

重启脚本

新建restartServer.sh

#!/bin/bash

# 监听地址
localAddress=$1
# jar包地址
jarPath=$2
# 启动参数
params=$3
# 日志输出地址, 如果不需要就写/dev/null
logPath=$4
echo $(date +%F%n%T) "----------参数开始----------"
echo "localAddress=${localAddress}"
echo "jarPath=${jarPath}"
echo "params=${params}"
echo "logPath=${logPath}"
echo $(date +%F%n%T) "----------参数结束----------"

# wk有内置的变量。对于每一个记录,即行,分隔空白字符分隔记录默认情况下,它存储在$n个变量。
# 如果该行有4个词,它会被存储在$1,$2,$3,$4。$0表示整行。
# [Proto][Recv-Q][Send-Q][Local Address][Foreign Address][State][PID/Program name]
# [$1]   [$2]    [$3]    [$4]           [$5]             [$6]   [$7]
results=`netstat -tlnp | awk '$4=="'${localAddress}'" && $6=="LISTEN" {print $0;}'`

for((i=0;i<${#results[@]};i++)) do
  line=${results[i]}
  # 如果不为空
  if test -n "${line}"
  then
    # 默认是空格、Tab键、换行符分割
    lineArray=($line)
    # 获取PID/Program name
    pidPname="${lineArray[6]}"
    # 下面主要是为了使用/分割, 先保存原始值, 分割完后再重新赋值回去
    OLD_IFS="$IFS"
    IFS="/"
    pidPnameArray=($pidPname)
    IFS="$OLD_IFS"
    # 获取pid
    pid="${pidPnameArray[0]}"
    echo $(date +%F%n%T) "${line}"
    echo $(date +%F%n%T) "进程pid=${pid}, 开始kill......"
    kill -9 $pid
    echo $(date +%F%n%T) "进程pid=${pid}, 已killed"
    echo ""
  fi
done;
echo $(date +%F%n%T) "开始执行重启命令......"
nohup java -jar $jarPath $params  >> $logPath 2>&1 &
echo $(date +%F%n%T) "重启命令已执行"
echo $(date +%F%n%T) "结束"
# 使脚本具有执行权限
chmod +x ./restartServer.sh
# 启动 ./restartServer.sh "监听地址" "jar报地址" "参数" "输出日志地址"
./restartServer.sh ":::8080" "/lzc/code/demo/target/demo-0.0.1-SNAPSHOT.jar" "--server.port=8080" "/lzc/code/demo/logs/log.txt"

部署脚本

新建deploy.sh

#!/bin/bash
echo $(date +%F%n%T) "开始部署......"
# 代码地址
codePath="/lzc/code/demo"

# 监听地址 启动前如果存在监听地址则需要kill掉
localAddress=":::8080"
# jar包地址
jarPath="${codePath}/target/demo-0.0.1-SNAPSHOT.jar"
# 启动jar包参数
params="--server.port=8080"
# 日志输出路径
logPath="/lzc/code/demo/logs/log.txt"

# 开始打包
./dabao.sh "${codePath}"

# 开始重启
./restartServer.sh "${localAddress}" "${jarPath}" "${params}" "${logPath}"

echo $(date +%F%n%T) "部署完成......"
# 使脚本具有执行权限
chmod +x ./deploy.sh
# 启动
./deploy.sh

监听脚本

新建jianting.sh

#!/bin/bash

# 监听地址 启动前如果存在监听地址则需要kill掉
localAddress=":::8080"
# jar包地址
jarPath="/lzc/code/demo/target/demo-0.0.1-SNAPSHOT.jar"
# 启动jar包参数
params="--server.port=8080"
# 日志输出路径
logPath="/lzc/code/demo/logs/log.txt"

result=`netstat -tlnp | awk '$4=="'${localAddress}'" && $6=="LISTEN" {print $0;}' | wc -l`
if test $result -gt 0
then
   echo $(date +%F%n%T) '端口监听正常'
else
   echo $(date +%F%n%T) '端口监听不正常 开始重启'
   # 执行重启脚本
   ./restartServer.sh "${localAddress}" "${jarPath}" "${params}" "${logPath}"
fi

# 使脚本具有执行权限
chmod +x ./jianting.sh
# 启动
./jianting.sh

你可能感兴趣的:(shell,linux)