我用来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
.