我在一个Linux终端上运行一个python脚本“/main.py”,它会自动启动另外两个终端并在其中运行两个不同的代码
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()
但这只会终止当前/父端子,子端子仍处于活动状态
然后,我试图杀死单个进程id(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)
但仍然只有当前的终端进程关闭,而不是子进程。请给我一个我可能犯错误的地方。我想编写一个脚本,关闭与父终端关联的所有终端
您在使用代码时遇到问题,因为
gnome-terminal
向gnome-terminal-server
发送启动新终端的请求,然后它退出。您可以通过执行以下代码(代码的细微变化)来验证这一点,其中gnome-terminal
在一个进程中调用,而xterm
在另一个进程中调用:如果在执行上述代码时在另一个shell中调用
ps -e | grep gnome-terminal
,您将看到gnome-terminal
已失效,因此无法杀死它。另一方面,例如,如果您使用xterm,那么一切都会按照您的预期工作样本输出:
因此,一个选项是使用
xterm
执行代码或具有类似行为的其他类型的终端相关问题 更多 >
编程相关推荐