Получение pid фонового gnome-терминального процесса - PullRequest
7 голосов
/ 13 июля 2011

Я могу легко запустить фоновый процесс, найти его pid и найти его в списке запущенных процессов.

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

Это работает для меня. Но если я запускаю gnome-терминал в качестве фонового процесса

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

Тогда он не найден в списке всех запущенных процессов.

Я что-то здесь упускаю?

Ответы [ 3 ]

11 голосов
/ 28 июля 2011

Если вы используете опцию "--disable-factory" для 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
6 голосов
/ 13 июля 2011

Это происходит потому, что запускаемый вами процесс терминала gnome запускает сам процесс, а затем завершается. Таким образом, PID, который вы захватываете, является pid процесса «заглушки», который запускается, а затем разветвляется на реальном терминале. Он делает это так, чтобы его можно было полностью отсоединить от вызывающего терминала.

К сожалению, я не знаю ни одного способа перехвата pid процесса терминала-гнома "granchild", который остается запущенным. Если вы сделаете ps, вы увидите, что процесс "внучат" gnome-терминала работает с родительским pid 1.

1 голос
/ 13 июля 2011

(это всего лишь сноска). Как сказал @Sodved, gnome-терминал запускает сам процесс, а затем завершает работу, нет способа получить pid внука. (См. Также главу 7 APUE, почему дочерний процесс не будет повторно присоединяться к процессу дедушки, когда его родительский процесс был прерван.)

Я обнаружил, что gnome-терминал создается только один раз, поэтому вот небольшой сценарий для вашей конкретной задачи:

GNOME_TERMINAL_PID=`pidof gnome-terminal`

Если у вас нет pidof:

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