我想运行一个数据收集脚本,针对每个循环:
打开新终端以在其中运行机器人模拟过程
在父终端中运行另一个进程2
当过程2完成时,关闭步骤1中打开的所有模拟器终端
我在这里读过很多关于关闭终端的问答。我遇到的问题是,我想让父终端始终保持打开状态,父进程始终运行。理想情况下,我希望能够跟踪我的脚本打开的每个子终端,以便我可以选择稍后关闭它们。但是,如果这样能让我的生活更轻松,我也可以忍受关闭所有其他终端而不检查它们是否是当前脚本的子终端。
我对如何识别每个终端的了解非常有限。我知道每个进程都有一个进程 ID,但终端呢?它与进程的区别是什么?(请参见下面的示例,它让我对终端/进程 ID 感到困惑)?
我尝试使用其他相关问答的答案编写下面的脚本。
parent_terminal=$(xdotool getactivewindow)
echo "parent_terminal: $parent_terminal"
# TODO: start external loop
# open a child terminal(s) and run robot_sim there
#(gnome-terminal -e './robot_sim')
#echo $! --> gives blank..
#./process2
#echo "process2 done. Killing robot_sim.."
# Kill all other terminals except this one (the parent)
xdotool search --class "terminal" | while read id
do
if [ "$id" -eq "$parent_terminal" ]; then
echo "This is parent_terminal $parent_terminal"
echo "Do not kill $id"
continue
else
echo "This is NOT parent_terminal $parent_terminal"
echo "Killing $id"
xdotool windowactivate "$id" &>/dev/null # Make the terminal with $id active
xdotool key ctrl+shift+q # Kill terminal by simulating a key press
#sleep 0.2
fi
done
# done external loop
我尝试运行上述脚本,首先在当前终端旁边打开另一个空白终端(因此,总共 2 个)。结果如下:
- 输出(如下)列出了 3 个终端,脚本尝试关闭父终端(弹出一个窗口让我确认是否终止)。为什么它列出了 3 个而不是 2 个终端?似乎父终端给出了 2 个不同的 ID。这些 ID 是什么?
- 它有一半的时间可以成功关闭另一个空白终端,但有时甚至不会关闭另一个终端(尽管根据输出,它应该尝试关闭列出的 3 个终端中的 2 个)。
parent_terminal: 62914571
This is NOT parent_terminal 62914571
Killing 62914561
This is NOT parent_terminal 62914571
Killing 62920887
This is parent_terminal 62914571 Do not kill 62914571
类似地,如果我只打开一个(父)终端测试脚本,它会列出 2 个终端并尝试关闭父终端:
parent_terminal: 62914571
This is NOT parent_terminal 62914571
Killing 62914561
This is parent_terminal 62914571
Do not kill 62914571
补充:我也看过这个问答:关闭特定终端,并尝试在几个我手动打开的终端中运行以下命令。
$ cat /proc/$$/status | grep PPid
但是,所有终端都给我相同的ID(PPid:2298)。
答案1
我建议你不要关闭终端,而是以某种方式终止(例如终止)其中运行的进程。这些是你的机器人模拟进程,由你启动,因此你应该知道属于它们的 PID。
鉴于每个终端仿真器的默认设置,即当请求的进程(即)终止时自行关闭./robot_sim
,这将导致那些终端窗口或选项卡关闭。