查看端口号被哪个进程占用
netstat -tlnp | grep 端口号
第一个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
新建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