应用背景
希望通过shell脚本去灵活地启动,关闭,重启jar包程序,且可以查看当前程序运行状态。这样可以提高运维效率,便于管理。
如执行如下命令,启动java程序:
sh /home/zzworld/software_rel/softexe/javaweb_bin/start_java_test-web-all.sh start
shell脚本代码
#!/bin/bash
#description: 启动重启server服务
#获取时间: yyyy-mm-dd
day_id=$(date '+%Y-%m-%d')
#应用名称,根据此名称确定PID
exe_name='test-web-all.jar'
#环境
env_the='prod'
#应用所在目录
HOME='/home/zzworld/software_rel/softexe/javaweb'
#log日志
log_name=${exe_name%.*}
log_dir="/home/zzworld/software_rel/softexe/javaweb_log/${log_name}/zz_${log_name}_${day_id}.log"
#查询应用pid,(ps是进程状态信息)
pid=`ps -elf |grep $exe_name|grep -v grep |head -n 1 |awk '{printf $4}'`
#通过pid获取端口号,(netstat,是网络连接相关信息,如套接字,端口,pid/应用名,等等)
port=`netstat -anopt |grep $pid|head -n 1|awk '{printf $4}'|cut -d: -f4`
start(){
if [ -n "$pid" ];
then
echo "server already start,pid:$pid"
return 0
fi
#进入命令所在目录
echo "jar:$HOME/$exe_name ; log: $log_dir"
cd $HOME
nohup java -jar $HOME/$exe_name --spring.profiles.active=$env_the >> $log_dir 2>&1 & #启动程序, 把日志输出到log_dir文件
#查询应用pid,(ps是进程状态信息)
pid=`ps -elf |grep ${exe_name}|grep -v grep |head -n 1 |awk '{printf $4}'`
#sleep 15s
#通过pid获取端口号,(netstat,是网络连接相关信息,如套接字,端口,pid/应用名,等等)
port=`netstat -anopt |grep ${pid}|head -n 1|awk '{printf $4}'|cut -d: -f4`
echo "start at port:${port},pid:$pid"
}
stop(){
if [ -z "$pid" ]; then
echo "not find program on port:$port"
return 0
fi
#结束程序,使用讯号2,如果不行可以尝试讯号9强制结束
kill -9 $pid
rm -rf $pid
echo "kill program use signal 2,pid:$pid"
}
status(){
if [ -z "$pid" ]; then
echo "not find program on port:$port"
else
echo "program is running,pid:$pid"
fi
}
case $1 in
start)
start
;;
stop)
stop
;;
restart)
$0 stop
sleep 2
$0 start
;;
status)
status
;;
*)
echo "Usage: {start|stop|status}"
;;
esac
exit 0
脚本说明
- 先通过时间函数
$(date '+%Y-%m-%d')
获取当前日期day_id,从而输出启动日志到程序对应地日志文件。 - 定义基础变量,如 脚本环境:env_the,根目录 home等等。
- 获取当前程序的pid:
ps -elf |grep $exe_name|grep -v grep |head -n 1 |awk '{printf $4}'
(参考:ps -elf 查看进程获取进程id) - 获取程序启动后的端口:
netstat -anopt |grep $pid|head -n 1|awk '{printf $4}'|cut -d: -f4
(参考:netstat -anp |awk |cut 通过pid获取应用程序的端口号) - start()方法,表示启动,其中先判断pid不为空,之后执行
nohup java -jar $HOME/$exe_name --spring.profiles.active=$env_the >> $log_dir 2>&1 &
指令,
$HOME表示引用变量值,–spring是传入程序的参数,>>是重定向追加输出内容到目录log_dir,2>$1
意思是将2
表示的错误流也定向到1
对应的标准流中,最后一个$
表示把该命令放到后台执行。 - stop()方法是通过上述获取的pid去 kill 该程序。
- status()方法是判断该程序是否执行。
- 脚本
case $1 in
是switch选择函数,通过执行命令传入不同参数start,stop,status,restart来表示启动,停止,查询状态,重启。 - 最后
exit 0
退出脚本