закройте одну определенную команду GNOME Terminal

Я выполняю цикл как это (продолжительность один час):

#!/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

Я выполняю этот цикл, и я заметил, что в terminal2 процесс был уничтожен, но терминал остается открытым. Существует ли флаг или что-то для закрытия этого terminal2?

Или моя реализация неправильно?

PS. Я - новичок в Ubuntu, я искал заключительный определенный терминал, однако я не думаю это приятели к моему случаю.

1
задан 4 February 2019 в 13:21

1 ответ

Вы закрываете программу SeondApp, но Вы не уничтожаете терминал, в котором это работает. Эти два являются отдельными вещами. Например, это - дерево процесса выполнения gedit в терминале:

$ gedit &
[1] 13064
$ pstree -s 13064
systemd───systemd───gnome-terminal-───bash───gedit───4*[{gedit}]

Проигнорируйте systemd, это init процесс, все работающее на Вашей машине является ребенком systemd. Затем что Вы видите, что существует это gnome-terminal запустился bash который затем работает gedit. Если Вы теперь уничтожаете gedit, это не будет влиять на его родителей. Однако, если Вы уничтожаете одного из родителей, которые также уничтожат ребенка.

Обычно, то, что Вы сделали бы, должно использовать $!, специальная переменная, которая содержит PID последнего процесса, запущенного к фону. К сожалению, это не делает с gnome-terminal который, кажется, имеет своего рода сложную процедуру запуска:

$ gnome-terminal &
[1] 23861
$ ps aux | grep 23861
terdon   24341  0.0  0.0   8684  2348 pts/11   S+   10:59   0:00 grep --color 23861
$ pgrep gnome-terminal
23866

Как Вы видите выше, терминал гнома, кажется, повторно запускают себя после запуска, и использует другой PID. Никакая идея, почему, но другое серьезное основание использовать другой терминал.

Так, так как стандартный подход не будет работать, нам нужно обходное решение. То, что можно сделать, использовать kill -$PID который будет kil все процессы в группе процесса (от man kill):

-n  where n is larger than 1.  All processes in process  group  n  are
    signaled.   When  an argument of the form '-n' is given, and it is
    meant to denote a process group, either a signal must be specified
    first,  or  the argument must be preceded by a '--' option, other‐
    wise it will be taken as the signal to send.

При соединении всего этого вот рабочая версия сценария:

#!/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  'SecondAPP' &
        for ((i=0; i<3600; i+=5)); do
          sleep 5
          if ! pgrep SecondAPP; then
            break
          fi
        done
        ## Now, get the PID of SecondAPP
        pid=$(pgrep SecondAPP)
        ## Using -$pid will kill all process in the process group of $pid, so
        ## it will kill SecondAPP and its parent process, the terminal.
        kill -- -$pid
    fi
    sleep 5
done

Обратите внимание, что я также удаляю [ ] вокруг ! pgrep так как это было неправильным синтаксисом.


Я не вижу, почему Вы запускаете терминалы вообще все же. Вот та же идея без терминалов:

#!/bin/bash

$HOME/TEST/FirstAPP
while true; do
    if ! pgrep SecondAPP; then
      #$HOME/TEST/SecondAPP &
      SecondAPP &
      pid=$!
        for ((i=0; i<3600; i+=5)); do
          sleep 5
          if ! pgrep SecondAPP; then
            break
          fi
        done
        kill $pid
    fi
    sleep 5
done

Наконец, это чувствует себя подобно странному способу сделать вещи. Вы могли бы хотеть задать новый вопрос, объяснить, что Вы пытаетесь сделать и почему и мы видим, можем ли мы найти более простой подход для того, что это - Вы потребность.

1
ответ дан 7 December 2019 в 15:07

Другие вопросы по тегам:

Похожие вопросы: