2011-07-13 78 views
6

我可以轻松启动后台进程,找到它的pid并在运行进程列表中搜索它。获取后台gnome-terminal进程的pid

$gedit & 
$PID=$! 
$ps -e | grep $PID 

这适用于我。但是,如果我启动gnome-terminal作为后台进程

$gnome-terminal & 
$PID=$! 
$ps -e | grep $PID 

然后,在所有正在运行的进程的列表中找不到它。

我失去了一些东西在这里?

回答

5

这似乎是因为你开始的gnome-terminal进程开始一个进程本身,然后退出。因此,您捕获的PID是启动“存根”过程的pid,然后分叉真正的终端。它这样做是为了它可以完全脱离主叫终端。

不幸的是,我不知道任何捕获“granchild”gnome-terminal进程的pid的方法,它是剩下的一个。如果你做一个ps,你会看到gnome-terminal“grandchild”进程运行的父pid为1.

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` 
9

如果使用“--disable工厂”选项的GNOME终端有可能使用GNOME终端在你渴望的方式。默认情况下,它会尝试使用已经处于活动状态的终端,这样可以让您抓取您启动的终端的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