Как выполнить несколько команд в нескольких терминалах с помощью одной команды скрипта оболочки

Вопрос или проблема

Я пытался написать shell-скрипт для выполнения нескольких команд в нескольких терминалах, но не смог запустить команды. Я могу только открывать несколько терминалов.

Это написано в shell-скрипте sitl.sh:

#!/bin/bash

gnome-terminal --working-directory=/home/mit/catkin_ws/  && roslaunch iq_sim iris.launch && rosrun iq_gnc square

gnome-terminal --working-directory=/home/mit/ardupilot/ArduCopter/

gnome-terminal --working-directory=/home/mit/catkin_ws/

gnome-terminal --working-directory=/home/mit/catkin_ws/   && roslaunch iq_sim lidar.launch

Если я запускаю этот скрипт, команды выполняются в одном и том же терминале. Если я завершаю первую команду, следующая команда запускается, если я завершаю вторую команду, третья команда запускается. Мне нужно запускать все команды одновременно. Я хочу, чтобы каждая команда выполнялась в отдельном окне терминала одновременно, используя одну команду shell-скрипта. Пожалуйста, помогите мне решить эту проблему.

Моя цель состоит в том, чтобы запускать несколько команд, команды должны выполняться отдельно в каждом терминале одновременно, мне не нужно завершать первую команду, чтобы вторая команда работала.

Пожалуйста, помогите мне, друзья, решить мою проблему.

Вы должны использовать опцию -e или -x для gnome-terminal. Согласно man gnome-terminal:

   -e, --command=STRING
             Выполнить аргумент этой опции внутри терминала.

   -x, --execute
             Выполнить оставшуюся часть командной строки внутри терминала.

Ответ или решение

Чтобы решить задачу запуска нескольких команд в отдельных окнах терминала при помощи одного сценария Shell, необходимо точно понимать, как именно работает выполнение команд в Linux через терминал. Проблема, описанная в вашем случае, заключается в том, что команды выполняются последовательно в одном потоке, поэтому они не исполняются одновременно в отдельных окнах.

Теория

Основная задача заключается в том, чтобы запускать команды параллельно в отдельных оболочках терминала и одновременно. В данной ситуации используется gnome-terminal, который поддерживает выполнение команд через аргументы командной строки. Ключевой момент здесь — использовать флаги -e или -x, которые дают возможность выполнять конкретную команду или программу в каждом новом открываемом окне терминала.

Пример

Рассмотрим, как можно переписать ваш сценарий, чтобы достичь желаемого результата. Мы будем использовать флаг -e или -x для gnome-terminal, чтобы каждая команда запускалась сразу в новом окне:

#!/bin/bash

# Запуск первой команды в новом окне терминала
gnome-terminal --working-directory=/home/mit/catkin_ws/ -e "bash -c 'roslaunch iq_sim iris.launch; exec bash'"
# Запуск второй команды в новом окне терминала
gnome-terminal --working-directory=/home/mit/ardupilot/ArduCopter/ -e "bash -c 'rosrun iq_gnc square; exec bash'"
# Запуск третьей команды в новом окне терминала
gnome-terminal --working-directory=/home/mit/catkin_ws/ -e "bash -c 'roslaunch iq_sim lidar.launch; exec bash'"

Применение

  1. Использование -e или -x: Аргументы -e или -x позволяют задавать команду, которая должна выполняться внутри нового окна терминала. Важно отметить, что после исполнения команды терминал не закроется автоматически, благодаря exec bash. Это обеспечивает возможность просмотреть вывод команды и любые ошибки.

  2. Команды в кавычках: В каждой из команд используется конструкция bash -c '<command>'; exec bash', где <command> представляет собой команду, которую вы хотите выполнить в новом окне терминала.

  3. Конструкция exec bash: Это позволяет терминалу оставаться открытым после выполнения указанной команды, что полезно для отладки и мониторинга выполнения команды.

Дополнительные советы

  • Проверка установленных терминалов: Убедитесь, что gnome-terminal установлен на вашей системе. Некоторые системы могут использовать другие терминальные эмуляторы, такие как konsole или xfce4-terminal. В этом случае вам нужно будет отрегулировать параметры вызова.

  • Обработка ошибок: Чтобы сделать ваш скрипт более устойчивым к ошибкам, вы можете добавить проверку успешности выполнения команд с помощью оператора ||. Например, roslaunch iq_sim iris.launch || echo 'Failed to launch iris' позволит зафиксировать точку выхода в случае неудачи.

  • Логирование: Для более сложных сценариев, можно добавить функциональность логирования, чтобы запись вывода и ошибок всех запущенных процессов сохранялась в отдельные файлы журнала.

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

Оцените материал
Добавить комментарий

Капча загружается...