Отследите и закройте дочерние терминалы. Сэкономьте родителя

Я хотел бы запустить скрипт сбора данных который для каждого цикла:

  1. откройте новый терминал (терминалы) для выполнения процессов моделирования робота в них

  2. выполните другой process2 в родительском терминале

  3. когда process2 закончится, закройте все терминалы средства моделирования, открытые в step1

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

У меня есть очень ограниченные знания о том, как каждый терминал определяется. Я знаю, что каждый процесс имеет один идентификатор процесса, но что относительно терминала? Когда и как это отличается от процесса (посмотрите, что пример ниже этого дает мне беспорядок об идентификационном луге терминала/процесса)?

Я пытался писать сценарий ниже использования ответов от других связанных Вопросов и ответов.

parent_terminal=$(xdotool getactivewindow)
echo "parent_terminal: $parent_terminal"

# TODO: start external loop

    # open a child terminal(s) and run robot_sim there
    #(gnome-terminal -e './robot_sim') 
    #echo $! --> gives blank.. 

    #./process2
    #echo "process2 done. Killing robot_sim.."

    # Kill all other terminals except this one (the parent)
    xdotool search --class "terminal" | while read id
    do
          if [ "$id" -eq "$parent_terminal" ]; then
            echo "This is parent_terminal $parent_terminal"
            echo "Do not kill $id"
            continue
          else
            echo "This is NOT parent_terminal $parent_terminal"
            echo "Killing $id"
            xdotool windowactivate "$id" &>/dev/null # Make the terminal with $id active
            xdotool key ctrl+shift+q # Kill terminal by simulating a key press
            #sleep 0.2
          fi
    done 

# done external loop

Я пытался запустить вышеупомянутый скрипт путем начального наличия другого пустого терминала, открытого около текущего (так, 2 общих количества). Вот результат:

  1. Вывод (ниже) перечисляет 3 терминала со сценарием, пытающимся закрыть родительский терминал (предоставление мне всплывающее окно для подтверждения уничтожения). Почему это перечисляет 3 а не 2 терминала? Кажется, что родительский терминал дает 2 различных идентификатора. Каковы эти идентификаторы?
  2. Это половина времени успешно закрывает другой пустой терминал, но иногда это даже не уничтожает другой терминал (даже при том, что на основе вывода это должно было попытаться уничтожить 2 из 3 перечисленных терминалов).
parent_terminal: 62914571 
This is NOT parent_terminal 62914571 
Killing 62914561 
This is NOT parent_terminal 62914571 
Killing 62920887 
This is parent_terminal 62914571 Do not kill 62914571

Точно так же, если я тестирую сценарий только с одним (родитель) открытый терминал, он перечисляет 2 терминала и попытки закрыть родителя:

parent_terminal: 62914571 
This is NOT parent_terminal 62914571 
Killing 62914561 
This is parent_terminal 62914571 
Do not kill 62914571

Добавленный: Я также посмотрел на это Вопросы и ответы: Закрытие Определенного Терминала и попробованное выполнение ниже команды в нескольких терминалах, которые я открываю вручную.

$ cat /proc/$$/status | grep PPid

Однако все терминалы дают мне тот же идентификатор (PPid: 2298).

5
задан 13 April 2017 в 05:24

1 ответ

Вместо того, чтобы закрыть терминалы, я рекомендую, чтобы Вы так или иначе завершили (например, уничтожили), процессы, работающие в них. Это Ваши процессы моделирования робота, запущенные Вами, таким образом, необходимо знать PID, принадлежащий им.

, Учитывая значение по умолчанию каждого эмулятора терминала, который должен закрыть себя, когда требуемый процесс (т.е. ./robot_sim) завершается, это приведет к тому закрытию окон терминала или вкладок.

2
ответ дан 23 November 2019 в 10:35

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

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