我运行这样的循环(持续一小时):
#!/bin/bash
gnome-terminal --geometry=50x30 --working-directory=/$HOME/TEST --title terminal1 -e ' sh -c "./FirstAPP; exec bash"'
while true; do
if [ ! pgrep SecondAPP ]; then
gnome-terminal --geometry=50x30 --working-directory=/$HOME/TEST --title terminal2 -e ' sh -c "./SecondAPP; exec bash"'
for ((i=0; i<3600; i+=5)); do
sleep 5
if [ ! pgrep SecondAPP ]; then
break
fi
done
killall -9 SecondAPP > /dev/null 2>&1
# Iwant here a command that closes the gnome-terminal "terminal2"
fi
sleep 5
done
我运行这个循环,我注意到在终端 2 中进程被杀死但终端保持打开状态。是否有标志或其他东西可以关闭该终端2?
还是我的实施错误?
PS。我是 Ubuntu 的新手,我查看了关闭特定终端,但我认为它不适合我的情况。
您正在杀死程序
SeondApp
,但您并没有杀死它正在运行的终端。两者是分开的。例如,这是gedit
在终端中运行的进程树:忽略
systemd
,这就是init
过程,您机器上运行的所有内容都是systemd
. 然后,你看到的是gnome-terminal
已经启动bash
然后运行gedit
。如果你现在 killgedit
,那不会影响它的父母。但是,如果您杀死其中一位父母,那也会杀死孩子。通常,您要做的是使用
$!
一个特殊变量,它保存启动到后台的最后一个进程的 PID。不幸的是,gnome-terminal
这似乎没有某种复杂的启动过程:正如您在上面看到的,gnome-terminal 似乎在启动后重新启动并使用不同的 PID。不知道为什么,但另一个使用不同终端的好理由。
因此,由于标准方法不起作用,我们需要一种解决方法。您可以做的是使用
kill -$PID
它将杀死进程组中的所有进程(来自man kill
):将所有这些放在一起,这是您的脚本的工作版本:
请注意,我也删除了
[ ]
周围,! pgrep
因为这是错误的语法。我不明白你为什么要启动终端。这是相同的想法,没有终端:
最后,这感觉像是一种奇怪的做事方式。您可能想问一个新问题,解释您正在尝试做什么以及为什么,我们可以看看我们是否可以找到一种更简单的方法来满足您的任何需求。