python中的process.pid在macOS mojave上给出了错误的值
我已经尝试了至少十几种不同的python脚本来杀死本文中介绍的一个子进程 及 但是我非常沮丧 下面是python:python中的process.pid在macOS mojave上给出了错误的值,python,macos,subprocess,Python,Macos,Subprocess,我已经尝试了至少十几种不同的python脚本来杀死本文中介绍的一个子进程 及 但是我非常沮丧 下面是python: import subprocess, os import time,signal,psutil process = subprocess.Popen(['open', '/Applications/Preview.app', 'images/conv1.jpg'], shell=False) print (process.pid) time.sleep(2) print (proc
import subprocess, os
import time,signal,psutil
process = subprocess.Popen(['open', '/Applications/Preview.app', 'images/conv1.jpg'], shell=False)
print (process.pid)
time.sleep(2)
print (process.pid)
os.kill(process.pid, signal.SIGKILL)
进程id打印在终端中,预览开始并打开一个图像,进程id再次打印,python终止,我返回shell提示符,但预览和图像仍然打开。当我在“活动监视器”中检查流程id时,发现preview.app的实际流程id比值process.pid大一个
我必须将最后一行更改为:
os.kill(process.pid+1, signal.SIGKILL)
它是有效的。为什么???简单地执行
process.pid+1
不会杀死该进程,只是碰巧在那一刻,您的孩子从其父进程分叉,而没有其他进程启动。您的
process.pid
不是图像的实际pidconv1.jpg
。因此我们需要找到它的真实pid:
import subprocess
import os
import time
import signal
process = subprocess.Popen(['xdg-open', 'stroke.png'])#I have linux machine and stroke.png is a file which I need to open.
print(process.pid)
time.sleep(5)
print(process.pid)
a = subprocess.Popen(['ps', '-eo', 'pid,ppid,command'], stdout = subprocess.PIPE)
b = subprocess.Popen(['grep', 'stroke.png'], stdin = a.stdout, stdout = subprocess.PIPE)
output, error = b.communicate()
output = output.decode("utf-8").split('\n')
pid = ''
pid = int(pid.join(list(output[0])[1:5]))
print(pid)
os.kill(pid, signal.SIGKILL)
这里我们要做的是采用两个过程a
和b
a
给出了所有pid,因此我们需要过滤掉文件中的pid,在我的例子中stroke.png
正在使用grepb
。我们将
a
的stdout赋给b
的stin,然后将b的stdout赋给输出
我们需要将输出
解码为utf-8,因为它返回字节,我们需要字符串
print(output)
给出了以下结果:
[' 7990 1520 eog /home/rahul/stroke.png', ' 8004 7980 grep stroke.png', '']
因此,我们需要编号7990
,这是我们的stroke.png
这是通过使用int(pid.join(list(output[0])[1:5])
来实现的,它给出了字符串中从位置1到位置4的数字,该字符串在listoutput
中位于位置0,然后我们join()
将它们封装在int
中,因为要杀死pid,我们需要一个整数。
我的程序给出的输出是:
rahul@RNA-HP:~$ python3 so5.py
7982
7982
7990
这里7982
是我们子流程的pid,7990
是我们的stroke.png
希望能有所帮助
注释是否可以改进。如果我去掉最后一行,以便预览不会终止,并注释掉时间。sleep(2),则实际进程id比打印的值大5。这是什么怪事?你确定它不是由别的东西发动的吗?另外,您的第一个链接是使用os.killpg
,而不是os.kill
。我认为对于macOS用户来说,它是-Ao
,而不是-eo
,用于列出进程。快速补充说明(我知道您是从OP复制的):使用SIGKILL来指示进程终止几乎是不合理的。当一个进程在收到SIGTERM后拒绝退出时,SIGKILL将用作最后手段。SIGKILL是立即终止的命令;接收进程无法执行干净关机的例程(例如关闭连接、完成挂起的事务、保存未保存的数据)。因此,它可能会导致数据损坏。最好发送SIGTERM。是的,我通常使用-9,这是SIGTERM,也适用于此类流程。谢谢你指出。呃,不:)9是SIGKILL<代码>终止
在以下情况下发送SIGTERM(15)。一份信号号码的清单。我一定又被弄糊涂了。谢谢。