shell脚本启动或关闭应用进程

编程

开篇

本文讲述的是通过 shell 脚本管理服务器 上的应用程序,即启动或关闭应用程序。现应用在公司的一个 flask 项目上,可以保证功能可用,但不能保证这是最优解。

因为我也并非运维人员,整个脚本也是对着 shell 语法,一点一点拼出来的,完整脚本直接看文末即可。

正文

单独用命令管理应用程序

  • 启动应用程序

    • java -jar demo.jar(打包好的 Springboot 项目)
    • ./demo(把 python 项目打包成可执行文件)
    • 其他

  • 关闭应用进程

    • ps -ef | grep 进程名# 查出 pid
    • kill -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/sh

export 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

回到顶部