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