运行 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”,例如在 top
或 htop
中,但 pkill
和 killall
是按命令名称过滤的因此将找不到名为“my_new_name”的进程。
虽然有趣的是,如何使用与可执行文件不同的名称启动命令,这很可能不是问题的原因。 PID 永远不会改变,所以我认为问题出在不同的地方。
我最好的猜测是服务器绑定了一个套接字以侦听特定端口。如果程序没有正常关闭但被杀死,端口号仍然被占用,并且只有在某种内核垃圾收集期间一段时间后才会被内核释放。如果程序在短时间后重新启动,它会发现端口已被占用并打印一条误导性消息,表示它已经 运行ning。如果这确实是您问题的原因,我会强烈考虑实施一种正常关闭服务器的方法。 (可能已经在析构函数中关闭套接字或类似的东西可能会有所帮助)
获得了一个用于在后台激活 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”,例如在 top
或 htop
中,但 pkill
和 killall
是按命令名称过滤的因此将找不到名为“my_new_name”的进程。
虽然有趣的是,如何使用与可执行文件不同的名称启动命令,这很可能不是问题的原因。 PID 永远不会改变,所以我认为问题出在不同的地方。
我最好的猜测是服务器绑定了一个套接字以侦听特定端口。如果程序没有正常关闭但被杀死,端口号仍然被占用,并且只有在某种内核垃圾收集期间一段时间后才会被内核释放。如果程序在短时间后重新启动,它会发现端口已被占用并打印一条误导性消息,表示它已经 运行ning。如果这确实是您问题的原因,我会强烈考虑实施一种正常关闭服务器的方法。 (可能已经在析构函数中关闭套接字或类似的东西可能会有所帮助)