运行 bash 后台脚本与进程名称

run bash script in background with process name

获得了一个用于在后台激活 python venv 和 运行ning 服务器的脚本,但现在我试图在启动进程然后终止进程时保留 pid完成后使用 pid。但是,也不是每次都被杀。

我的问题是,我可以 运行 给进程命名,然后使用 pkill name 杀死它吗?那看起来如何


#!/bin/sh

ROOT_DIR=$(pwd)

activate(){
    source $ROOT_DIR/.venv/bin/activate
    python3 src/server.py -l & pid=$!     # <== This is the process
    python3 src/client.py localhost 8080
}

activate
sleep 10
kill "$pid"

printf "\n\nServer is done, terminating processes..."

我认为在这种情况下您应该使用 systemd: https://github.com/torfsen/python-systemd-tutorial

您可以使用 bash 内置 exec 运行 具有特定命令名称的程序。请注意,exec 将 shell 替换为命令,因此您必须在 subshell 环境中 运行 它,例如:

( exec -a my_new_name my_old_command ) &

但是,它可能不会对您有太大帮助,因为这设置了 命令行 名称,这显然不同于 命令名称.因此,执行上面的代码片段会将您的进程显示为“my_new_name”,例如在 tophtop 中,但 pkillkillall 是按命令名称过滤的因此将找不到名为“my_new_name”的进程。

虽然有趣的是,如何使用与可执行文件不同的名称启动命令,这很可能不是问题的原因。 PID 永远不会改变,所以我认为问题出在不同的地方。

我最好的猜测是服务器绑定了一个套接字以侦听特定端口。如果程序没有正常关闭但被杀死,端口号仍然被占用,并且只有在某种内核垃圾收集期间一段时间后才会被内核释放。如果程序在短时间后重新启动,它会发现端口已被占用并打印一条误导性消息,表示它已经 运行ning。如果这确实是您问题的原因,我会强烈考虑实施一种正常关闭服务器的方法。 (可能已经在析构函数中关闭套接字或类似的东西可能会有所帮助)