思路:首先根据参数判断对服务进行的操作,判断服务是否已经被启动,如果服务已经启动再执行启动操作时就不需要再次拉起服务,执行停止和重启操作时也需要检查服务是否启动,如果没有启动不需要进行停止。

具体的shell语法这里就不说了,将用到的都在注释进行了说明,这只是为了我拉起服务方便写的可能不是特别完整规范,仅供参考。大家有好的也可以评论或者私信我,我会整理到这里。

版本一 基础

#!/bin/bash
#获取输入的第一个参数
cmd=$1

#没有输入参数时提醒内容 $#参数的个数
if [ $# -eq 0 ]; then 
	echo "please input start|stop|reStart"
	exit
fi

#获取需要杀死进程的id  xxx.jar 你需要拉起的服务名
vehicle_pid=`ps -ef | grep xxx.jar |grep -v 'grep'|awk '{print $2}'`
#echo "vehicle的pid:${vehicle_pid}"
#杀死服务 注意 [] 和$vehicle_pid 存在空格
killpid(){
	if [ $vehicle_pid ];then
	for id in $vehicle_pid
	do
	kill -9 $id
	done
else
	echo "vehicle_pid is not exists"
fi
}

#启动服务
startup(){
	#服务所存放的目录,我这里是jar包存放的目录
	cd /root/AppLocation/
	vehicle_repid=`ps -ef | grep xxx.jar |grep -v 'grep'|awk '{print $2}'`
	if [ $vehicle_repid ];then
		echo "服务已经启动"
else
	nohup java -jar xxx.jar &
    vehicle_pid_temp=`ps -ef | grep xxx.jar |grep -v 'grep'|awk '{print $2}'`
	if [ $vehicle_pid_temp ];then
		echo  "服务启动成功,pid:${vehicle_pid_temp}"
	else
		echo "启动失败"
	fi
fi
}
#根据输入命令判断需要执行的操作

if [ $cmd == 'stop' ]; then
	killpid
	echo "App stop Suessful!"
fi
#启动进程
if [ $cmd == 'start' ]; then
	startup
	echo "App start Suessful!"
fi

#重启程序
if [ $cmd == 'restart' ];then
	killpid
	startup
	echo "App Restart Suessful!"
fi


可以将文件的目录和应用的名称都做成参数的形式,目前我是在代码中写死的。
类似于与$cmd = $1 这种形式。
2021-11-16修改 方法名调用时写错,导致重启的命令失效现已更正
startup方法修改,之前停止和启动都没问题,但是重启时读取的vehicle_pid时杀死进程前获取值的,需要重新再取一次值vehicle_repid用来判断进程是否存在。

#增加一行 vehicle_repid=`ps -ef | grep vehicle_V2.0.jar |grep -v 'grep'|awk '{print $2}'`
#修改 if [ $vehicle_repid ];then 
startup(){
    vehicle_repid=`ps -ef | grep vehicle_V2.0.jar |grep -v 'grep'|awk '{print $2}'`
	cd /root/henganApp/vehicle/vehicle_V2_0_jar/
	if [ $vehicle_repid ];then
		echo "车辆任务已经启动"

版本二 进阶

#!/bin/bash

usage="Usage: `basename $0` (start|stop|restart)"

#export JAVA_HOME="/usr/jdk1.8.0_241"
#export PATH=$PATH:$JAVA_HOME/bin

start() {
	#注意jar的路径,写你自己的
    nohup java -jar /home/liuch/pms.jar >/dev/null 2>&1 &
}

stop() {
    #注意这里pms改为你自己需要停止的进程名称
    ps -ef|grep pms|grep -v grep|awk '{printf $2}'|xargs kill -9
}

restart() {
    stop
    start
}

case $1 in
  (start)
     start
     ;;
  (stop)
     stop
     ;;
  (restart)
     restart
     ;;
  (*)
     echo "Error command"
     echo "$usage"
     ;;
esac

使用方法

进入脚本的执行目录,我这里以放在 /home/liuch/app.sh 为例
启动
# sh /home/liuch/app.sh start 
停止
# sh /home/liuch/app.sh stop
重启
# sh /home/liuch/app.sh restart 
最后查看一下是否启动成功
ps -ef | grep java

最后简单解释一下>/dev/null 2>&1
这里 1 代表标准输出,默认输出到控制台 2代表错误输出,默认输出到控制台, 还有个0 代表标准输入(键盘输入)
>/dev/null 将标准输出1重定向到/dev/null,/dev/null代表一个空设备文件,表示将我们的标准输出舍弃。
2>&1 重定向绑定, &将两个输出绑定在一起,表示将错误输出2和标准输出1输出到同一个地方。
>/dev/null 2>&1 nohup后台启动时不需要输出启动信息和错误信息到任何地方。不增加这条指令启动时会在我们启动目录下增加一个nohup.out文件,我们的启动信息默认是保存在这里面的。

更新于2022-1-18日 增加方式二

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐