Я запускаю python скрипт "./main.py" в терминале Linux, который автоматически запускает два других терминала и запускает в нем два разных кода, я делаю это следующим образом,
import os
import sys
import subprocess
import rospy
import psutil, sys
import signal
print(os.getpid())
arra = []
arra.append(os.getpid())
for i in range(2):
if i == 0:
p = subprocess.Popen(['gnome-terminal', '--', 'roslaunch', 'ur5_notebook', 'main_r2_mt.launch', 'gui:=False'])
if i > 0:
p = subprocess.Popen(['gnome-terminal', '--', 'roslaunch', 'ur5_notebook', 'main_r2_mt.launch'])
arra.append(p.pid)
rospy.sleep(20)
Теперь я также хочу уничтожить родительский терминал, а также весь дочерний терминал, который я запустил. Сначала я сделал снимок с помощью sys.exit (), т.е.
print(os.getpid())
arra = []
arra.append(os.getpid())
for i in range(2):
if i == 0:
p = subprocess.Popen(['gnome-terminal', '--', 'roslaunch', 'ur5_notebook', 'main_r2_mt.launch', 'gui:=False'], preexec_fn=os.setpgrp)
if i > 0:
p = subprocess.Popen(['gnome-terminal', '--', 'roslaunch', 'ur5_notebook', 'main_r2_mt.launch'], preexec_fn=os.setpgrp)
# rospy.sleep(50)
arra.append(p.pid)
# print(list(os.getgroups))
rospy.sleep(20)
sys.exit()
Но это убило только текущий / родительский терминал, дочерние терминалы все еще были активны
Затем я попытался убить отдельного идентификатор процесса (PID), который я делаю следующим образом:
import os
import sys
import subprocess
import rospy
import psutil, sys
import signal
print(os.getpid())
arra = []
arra.append(os.getpid())
for i in range(2):
if i == 0:
p = subprocess.Popen(['gnome-terminal', '--', 'roslaunch', 'ur5_notebook', 'main_r2_mt.launch', 'gui:=False'])
if i > 0:
p = subprocess.Popen(['gnome-terminal', '--', 'roslaunch', 'ur5_notebook', 'main_r2_mt.launch'])
arra.append(p.pid)
rospy.sleep(20)
for i in reversed(arra):
print(i)
os.killpg(i, signal.SIGINT)
Но, тем не менее, закрывается только текущий процесс терминала, а не дочерний процесс. Пожалуйста, дайте мне понять, где я мог ошибиться. Я хочу написать скрипт, который закрывает все терминалы, связанные с родительским терминалом.