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

本文介绍如何使用Shell脚本有效管理服务器上的多进程应用程序,包括启动、停止和重启操作,特别针对启动多个进程的Flask项目。文章详细解释了如何通过脚本查找并处理所有相关进程,避免手动逐个终止的繁琐。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

开篇

本文讲述的是通过 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



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值