shell脚本启动或关闭应用进程
开篇
本文讲述的是通过 shell 脚本管理服务器 上的应用程序,即启动或关闭应用程序。现应用在公司的一个 flask 项目上,可以保证功能可用,但不能保证这是最优解。
因为我也并非运维人员,整个脚本也是对着 shell 语法,一点一点拼出来的,完整脚本直接看文末即可。
正文
单独用命令管理应用程序
启动应用程序
java -jar demo.jar
(打包好的 Springboot 项目)./demo
(把 python 项目打包成可执行文件)- 其他
关闭应用进程
ps -ef | grep 进程名
# 查出 pidkill -9 pid
# 根据 pid 杀死进程
从上面来看,这种方法其实也不算浪费时间
但是,当你的应用开启了多个进程呢? 你要一个一个 kill 掉吗?
我感觉 2 个以上进程我就烦了。比如公司的 flask 项目就会启动 2-4 个进程(ps:原因还没找到,有空再说吧)。
脚本如何写
通过上面的启动和关闭用到的命令,加上一些判断处理逻辑,就能拼凑出一个简易的脚本了。
启动方法没什么变化。
关闭脚本时,由于可能会出现多个进程数量,因此要加一个
for
循环, 在循环里面去kill -9 pid
.
那么问题就转移到了,如何查到进程数量和具体的进程 id
查询进程数量(返回 0 -N 的数字)
ps -ef | grep 进程名 | grep -v grep | wc -l
查询进程 pid(如果存在多个进程,返回数组)
ps -ef | grep 进程名 | grep -v grep | awk "{print $2}"
网上的部分案例
一个错误的案例
案例中关闭应用程序的大致思路如下:
- 先根据进程名查出所有进程 id, 如果有多个进程存在,返回一个数组
my_array=`ps -ef | grep $PROGNAME | grep -v grep | awk "{print $2}"`
- 通过数组的长度,判断进程数量
num=${#my_array[*]}
但是问题来了,如果根据进程名查不出对应的进程,那么下面的结果就是 1。
${#my_array[*]}
实际用的时候,这个问题短时间内还不好发现。
如何解决上面的问题
- 把根据应用名称查出的进程,根据逗号分隔开
prog_ids=`ps -ef | grep $PROGNAME | grep -v grep | awk "BEGIN{ ORS="," }{print $2}"`
- 然后转为数组
prog_ids_arr=(`echo ${prog_ids} | tr "," " "`)
- 获取进程数量
prog_num=${#prog_ids_arr[*]}
- 遍历进程
for pid in${prog_ids_arr[*]}
其他案例
因为大部分案例中应用都是单进程的,所以不用 for
循环遍历去一个个杀死进程。
总结
因为 flask 项目启动后会出现多个进程(这个很奇怪我的是 2 个, 同事的是 4个,因为也是刚接触 python,很多问题没有深究)
所以单单杀死一个进程是不至于把应用给停掉的。
当引入了 for
循环后,然后又了解到 shell 中数组的一些用法,又在网上的一些案例中踩到一些坑。
特此总结下遇到的问题,希望能帮助到需要的人。
附完整脚本
只需修改下面的进程名称 PROGNAME
,即可应用到你的项目当中, 当然也可以基于此脚本修改成,把进程名当作参数传进去。
使用方法
比如脚本名字是 test.sh, 那么
- 启动应用
./test.sh start 或者 ./test.sh
- 关闭应用
./test.sh stop
- 重启应用
./test.sh restart
强调一下
不要把你的进程名和脚本名称写成一样, 后果是什么,可以思考下。
#!/bin/shexport LANG="zh_CN.UTF-8"
# start or stop or restart
optype=$1
# 进程名称, 修改此处
PROGNAME="进程名"
if [ x"${optype}" = x ] ; then
optype=start
fi
function start()
{
# 进程数量
prog_num=`ps -ef | grep $PROGNAME | grep -v grep | wc -l`
if [ $prog_num -eq 0 ] ; then
echo "start $PROGNAME"
nohup ./$PROGNAME > /dev/null 2>&1 &
else
echo "$PROGNAME is started"
fi
}
function stop()
{
# 进程数量
prog_num=`ps -ef | grep $PROGNAME | grep -v grep | wc -l`
if [ $prog_num -eq 0 ] ; then
echo "$PROGNAME is stopped"
return
fi
# 查出所有进程 id
prog_ids=`ps -ef | grep $PROGNAME | grep -v grep | awk "{print $2}"`
for pid in $prog_ids;
do
kill -9 $pid;
done
echo "stop $PROGNAME"
}
case "$optype" in
start)
start
;;
stop)
stop
;;
restart)
stop
sleep 1
start
;;
*)
echo "Only support start|stop|restart"
exit 1
esac
以上是 shell脚本启动或关闭应用进程 的全部内容, 来源链接: utcz.com/z/514575.html