在日常开发和部署 Python Web 服务(如 FastAPI、Flask、Django、Socket 服务等)时,经常需要频繁启动、停止、重启进程。如果每次都手动 ps -ef | grep 再 kill -9,实在是太麻烦了!

今天分享一个我自己用了好几年的「终极启停脚本」,功能完整、输出美观、逻辑健壮,直接扔到服务器上就能用,强烈建议收藏!

最终效果演示

1

2

3

4

5

6

7

8

9

$ ./manager.sh start

 ##: 启动成功(Start successfully) ~

$ ./manager.sh stop

 ##: 已停止(stopped) ...

$ ./manager.sh restart

 ##: 已停止(stopped) ...

 ##: 启动成功(Start successfully) ~

已经运行时重复启动会有友好提示:

1

2

$ ./manager.sh start

 ##: 服务已经在运行中(The service is already running)

完整脚本(已亲测可用)

将以下内容保存为 manager.sh(或者你喜欢的名字),放在项目根目录,和 server.py 同级:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

#!/bin/bash

# 要管理的 Python 服务文件名(可修改)

server_name="server.py"

# 彩色输出定义

RED='\033[31m'

GREEN='\033[32m'

YELLOW='\033[33m'

CYAN='\033[36m'

RESET='\033[0m'

start() {

    # 检查是否已有进程在运行(取第一个匹配的 PID)

    pid=$(ps -ef | grep -v grep | grep ${server_name} | awk 'NR==1{print $2}')

     

    if [[ -z "$pid" ]]; then

        echo -e "${YELLOW}正在启动 ${server_name} ...${RESET}"

        nohup python3 ${server_name} > server.log 2>&1 &

        sleep # 给进程一点启动时间

         

        # 再次检查是否真的启动成功

        pid=$(ps -ef | grep -v grep | grep ${server_name} | awk 'NR==1{print $2}')

        if [[ -n "$pid" ]]; then

            echo -e "${CYAN} ##: 启动成功(Start successfully) ~${RESET}"

        else

            echo -e "${RED} 启动失败(failed to activate),请查看 server.log${RESET}"

        fi

    else

        echo -e "${GREEN} ##: 服务已经在运行中(The service is already running),PID: $pid${RESET}"

    fi

}

stop() {

    pid=$(ps -ef | grep -v grep | grep ${server_name} | awk 'NR==1{print $2}')

     

    if [[ -n "$pid" ]]; then

        kill -9 $pid

        echo -e "${GREEN} ##: 已停止(stopped),PID $pid 已结束${RESET}"

    else

        echo -e "${YELLOW} ##: 未检测到运行中的服务${RESET}"

    fi

}

restart() {

    echo -e "${YELLOW}正在重启服务...${RESET}"

    stop

    sleep 1

    start

}

# 使用说明

usage() {

    echo "Usage: $0 {start|stop|restart}"

    exit 1

}

case "$1" in

    start)

        start

        ;;

    stop)

        stop

        ;;

    restart)

        restart

        ;;

    *)

        usage

        ;;

esac

exit 0

使用方法(三步搞定)

将脚本保存为 manager.sh

赋予执行权限:

1

chmod +x manager.sh

使用:

1

2

3

./manager.sh start    # 启动

./manager.sh stop     # 停止

./manager.sh restart  # 重启

脚本亮点总结

功能 说明
防止重复启动 检测到已有进程就提示,不再重复启动
彩色日志输出 看起来舒服,状态一目了然
启动失败自动提示 启动后会二次检查进程是否存在
支持 restart 先 stop 再 start,一键重启
日志输出到 server.log 后台运行不干扰终端,日志可随时查看
仅 50 行左右 短小精悍,改起来也方便

可选增强(进阶玩家)

  • 想管理多个服务?把 server_name 改成参数传入即可
  • 想开机自启?配合 systemd 或 crontab -e 加 @reboot
  • 想支持端口占用检测?加一句 lsof -i:8000

写在最后

这个脚本我从 2021 年用到现在,几乎所有个人项目和小公司服务器都在用,稳定得一批!

强烈建议每个 Python 后端开发者都准备一个,省时省力又装逼(不是)

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐