Я выполняю цикл как это (продолжительность один час):
#!/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, я искал заключительный определенный терминал, однако я не думаю это приятели к моему случаю.
Вы закрываете программу 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
Наконец, это чувствует себя подобно странному способу сделать вещи. Вы могли бы хотеть задать новый вопрос, объяснить, что Вы пытаетесь сделать и почему и мы видим, можем ли мы найти более простой подход для того, что это - Вы потребность.