思路:首先根据参数判断对服务进行的操作,判断服务是否已经被启动,如果服务已经启动再执行启动操作时就不需要再次拉起服务,执行停止和重启操作时也需要检查服务是否启动,如果没有启动不需要进行停止。
具体的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日 增加方式二