Простое выполнение process.pid + 1
не убьет этот процесс, просто случилось так, что в этот момент ваш ребенок разветвился от своего родителя, без запуска другого процесса.
Ваш process.pid
не является действительным pid вашего изображения conv1.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
в процессе b
с использованием grep.
Мы даем стандартный вывод a
для stin из b
, а затем стандартный вывод b до output
.
Нам нужно декодировать output
в utf-8, потому что он возвращается в байтах, а нам нужно в строке.
print(output)
Дает нам следующий результат:
[' 7990 1520 eog /home/rahul/stroke.png', ' 8004 7980 grep stroke.png', '']
Итак, нам нужно число 7990
, которое является истинным pid нашего stroke.png
.
. Это делается с помощью int(pid.join(list(output[0])[1:5]))
, который дает нам числа от позиции 1 до позиции 4 в нашей строке, которая находится в позиции 0 вперечислим output
, затем мы join()
их и завернем их в int
, потому что для уничтожения pid нам нужно целое число.
Вывод моей программы:
rahul@RNA-HP:~$ python3 so5.py
7982
7982
7990
Здесь 7982
был pid нашего подпроцесса, а 7990
- pid нашего stroke.png
Надеюсь, это поможет
Комментарийесли что-нибудь можно улучшить.