获取后台gnome-terminal进程的PID

9
我可以轻松地启动一个后台进程,找到它的pid并在运行进程列表中搜索它。
$gedit &
$PID=$!
$ps -e | grep $PID

这对我很有效。但是如果我将gnome-terminal作为后台进程启动。
$gnome-terminal &
$PID=$!
$ps -e | grep $PID

那么它并未出现在所有正在运行的进程列表中。

我是否漏掉了什么?


现在(2019年),似乎gnome-terminal只是一个进程gnome-terminal-server,这使得通过脚本管理单个终端窗口非常困难。 - szmoore
3个回答

13
如果您使用“--disable-factory”选项来运行gnome-terminal,就可以按照您希望的方式使用它。默认情况下,它会尝试使用已经激活的终端,这将允许您获取启动的终端的pid。以下脚本打开一个窗口,持续5秒钟,然后将其关闭:
#!/bin/bash
echo "opening a new terminal"
gnome-terminal --disable-factory &
pid=$!
echo "sleeping"
sleep 5;
echo "closing gnome-terminal"
kill -SIGHUP $pid

1
gnome-terminal已经取消了--disable-factory的支持。 - AnonBird

6
这似乎是因为您启动的gnome-terminal进程会启动一个进程,然后退出。因此,您捕获的PID是“存根”进程的pid,它启动然后分叉真正的终端。它这样做是为了完全与调用终端分离。
不幸的是,我不知道任何捕获“孙子”gnome-terminal进程的pid的方法,这是唯一留下的正在运行的进程。如果您执行ps命令,您将看到以1为父pid的gnome-terminal“孙子”进程正在运行。

1

(这只是一个脚注)正如@Sodved所说,gnome-terminal会启动一个进程然后退出,因此无法获取孙子进程的pid。(另请参阅APUE第7章,了解为什么当父进程终止时,子进程无法重新附加到祖父进程。)

我发现gnome-terminal只实例化一次,因此这里有一个针对您特定任务的简短脚本:

GNOME_TERMINAL_PID=`pidof gnome-terminal`

如果你没有pidof:

GNOME_TERMINAL_PID=`grep Name: */status | grep gnome-terminal | cut -d/ -f1`

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接