我可以轻松启动后台进程,找到它的pid并在运行进程列表中搜索它。获取后台gnome-terminal进程的pid
$gedit &
$PID=$!
$ps -e | grep $PID
这适用于我。但是,如果我启动gnome-terminal作为后台进程
$gnome-terminal &
$PID=$!
$ps -e | grep $PID
然后,在所有正在运行的进程的列表中找不到它。
我失去了一些东西在这里?
我可以轻松启动后台进程,找到它的pid并在运行进程列表中搜索它。获取后台gnome-terminal进程的pid
$gedit &
$PID=$!
$ps -e | grep $PID
这适用于我。但是,如果我启动gnome-terminal作为后台进程
$gnome-terminal &
$PID=$!
$ps -e | grep $PID
然后,在所有正在运行的进程的列表中找不到它。
我失去了一些东西在这里?
这似乎是因为你开始的gnome-terminal进程开始一个进程本身,然后退出。因此,您捕获的PID是启动“存根”过程的pid,然后分叉真正的终端。它这样做是为了它可以完全脱离主叫终端。
不幸的是,我不知道任何捕获“granchild”gnome-terminal进程的pid的方法,它是剩下的一个。如果你做一个ps,你会看到gnome-terminal“grandchild”进程运行的父pid为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`
如果使用“--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