通过 systemd 获取通过脚本启动的正在进行的 Python 进程的 PID

通过 systemd 获取通过脚本启动的正在进行的 Python 进程的 PID

我用来systemd在启动时运行 shell 脚本,start.sh最终启动main.py我的程序的主要 Python 脚本。

我想记录 PID,main.py以便稍后可以通过编程方式杀死它。

我首先尝试了以下操作,但发现即使记录了 PID,Python 脚本也没有保持活动状态(请注意,我将错误输出重定向到日志文件)。

sudo python main.py 2> >(sudo tee /var/log/app.log) &
echo $1 > /tmp/app.pid

但是,当删除 时&,脚本仍保持活动状态,但 PID 脚本永远不会到达记录 PID 的行。

sudo python main.py 2> >(sudo tee /var/log/app.log)
echo $1 > /tmp/app.pid

我怎样才能main.py以一种让它保持活动状态的方式运行,但仍然给我 PID?

答案1

一个简单的例子,使用exec

exec将当前进程的可执行文件替换为另一个可执行文件。

sudo bash -c ' echo $$ > /var/run/app.pid ; exec python3 -u /tmp/main.py  > /var/log/app.log 2>&1 '

然后您可以通过以下方式验证之后

cat /var/run/app.pid ; ps -ax -o pid,uname,args | grep "^ *$(cat /var/run/app.pid)"

答案2

根据 Fubar 提到的评论os.getpid(),我发现它os.getppid()实现了我所需要的,因为父线程结果是我需要杀死的进程:

PID = str(os.getppid())
with open(‘app.pid’, ‘w’) as file:
    file.write(PID)

然后我可以稍后在脚本中使用以下命令杀死它:

sudo kill `cat /tmp/app.pid`

请注意,我必须sudo在此处使用,因为原始 python 脚本是使用sudo.

相关内容