Вопрос или проблема
Я пытаюсь создать команду, которая откроет 3 службы из стека Rails: rails s, spork и autotest. Я могу запускать эти команды по отдельности, открывая 3 терминала, переходя в папку приложения и выполняя их. Я даже могу открыть 3 новые вкладки и запустить команды в каждой из них.
Проблема в том, что они не работают, когда я пытаюсь открыть вкладки через gnome-terminal следующим образом:
gnome-terminal --tab --title="rails s" -e "rails s" --tab --title="spork" -e "spork" --tab --title="autotest" -e "autotest"
Ошибка (для spork и autotest):
Возникла ошибка при создании дочернего процесса для этого терминала
Не удалось выполнить дочерний процесс "spork" (Нет такого файла или каталога)
Удивительно, но это работает для ‘rails s’ (вкладка показывает, что сервер работает).
Есть идеи?
Вызов gnome-terminal
три раза и соединение команд с помощью &&
не сработает, и вкладки не появятся в одном и том же терминале, и, действительно, вам придется выйти из первого терминала, чтобы появился следующий.
Чтобы убедиться, что все ваши вкладки открываются в одной инстанции gnome-terminal
одновременно, используйте переключатель --tab-with-profile=PROFILENAME
. В приведенной ниже команде вы можете оставить первую команду как gnome-terminal --tab
, так как это первое окно, которое будет создано; теперь вам нужно знать, какой профиль вы используете, и вы можете использовать --tab-with-profile=YourProfile
, чтобы вызвать другие команды, и они все появятся одновременно в изначально открытом терминале.
Вот ваша команда, измененная:
gnome-terminal --tab --title="rails s" -e "rails s" --tab-with-profile=Default --title="spork" -e "spork" --tab-with-profile=Default --title="autotest" -e "autotest"
(Для будущих читателей: замените имена программ, указанные после -e
, чтобы протестировать здесь данную командную строку; помните, ваши мишени для -e
должны быть установлены и находиться в $PATH
; для вещей, не находящихся в $PATH
, используйте абсолютный путь, например, /opt/mike/program
)
Не забудьте указать фактический профиль, которыми вы пользуетесь для переключателей --tab-with-profile
. Первое вызов gnome-terminal
должно использовать --tab
, а все остальные --tab-with-profile
. С помощью этого метода должно быть возможно открыть большое число вкладок в одной и той же инстанции gnome-terminal
.
Найдите профиль, который вы используете в данный момент, кликнув правой кнопкой в gnome-terminal
и посмотрите на профили, и один из них будет отмечен маркером:
Перейдите в Предпочтения профиля для получения дополнительной информации и для проверки имени профиля.
Для получения дополнительной информации смотрите man gnome-terminal
и Ubuntu manpages online.
Замечание:
Если у вас возникли проблемы с запуском программ через gnome-terminal
, добавьте расположение в $PATH
, или создайте символическую ссылку и разместите ее в расположении $PATH
, или (что было очень полезно здесь): создайте простой скрипт-оболочку bash и вызывайте его в командной строке gnome-terminal
. (Вы должны вызвать его с абсолютным путем: т.е. /location/of/script
, а не просто его названием.)
В качестве примера:
#!/bin/bash
cd $HOME/.rvm/gems/ruby-2.0.0-p0/bin
spork
exit 0
Затем назовите скрипт, сделайте его исполняемым и вызовите его в командной строке gnome-terminal
. Делайте это для всех программ, не входящих в репозиторий, которые создают проблемы.
Ниже приведен ответ с stackoverflow.com
-
Добавьте
eval "$BASH_POST_RC"
в конец вашего .bashrc -
Установите переменную окружения
BASH_POST_RC
для каждой вкладки к той команде, которую вы хотите выполнить, например:gnome-terminal --working-directory="/home/zardoz/projects/my_rails_app" --tab -e 'bash -c "export BASH_POST_RC=\"rails server\"; exec bash"' --tab -e 'bash -c "export BASH_POST_RC=\"autotest\"; exec bash"'
gnome-terminal --tab -- sh -c "python3 'test.py' ; bash"
этот код открывает новую вкладку в терминале, запуская скрипт python, и когда он завершится, новая вкладка не закроется, потому что я добавил ‘bash’ в конце этого кода…
если вам нужно это много раз, поместите это в цикл while вашего bash-скрипта
Как обсуждалось в других вопросах и ответах, единственный простой, не устаревший способ открыть несколько вкладок – это выдавать команду несколько раз, как в ответе на Unix & Linux к вопросу, Открытие нового gnome-terminal (v3.28+) с несколькими вкладками и различными командами, от Владимир Савостин.
gnome-terminal -- bash -c "myCommand -some-args; bash"
gnome-terminal -- bash -c "myOtherCommand -some-args; bash"
Если я хочу извлечь более длинное выражение из каждой команды, кажется, мне пришлось создать скрипт и вызвать его, что я сделал вместо использования ; bash
, чтобы сохранить окно открытым. Я использовал простой run_cmd.sh:
#! /bin/bash
set -euo pipefail
display_success() {
read -p "Вышел с успехом; нажмите ввод, чтобы выйти..."
}
display_error() {
read -p "Вышел с значением ошибки $1; нажмите ввод, чтобы выйти..."
}
run_cmd() {
echo "Запускаю: $@"
"$@" && display_success || display_error $?
}
run_cmd "$@"
Я затем заменил bash -c
на run_cmd.sh
. Так как этот скрипт тривиален, пожалуйста, считайте его находящимся в общественном достоянии.
Я сделал скрипт gnome-terminal-tabs
, который упрощает это немного больше.
Вы можете запустить его так:
gnome-terminal-tabs --command 'ls' --command 'htop'
Он доступен на https://github.com/leszekhanusz/gnome-terminal-tabs
Ответ или решение
Открытие нескольких вкладок с помощью gnome-terminal может показаться простой задачей, но, как показывает ваш случай, это может быть достаточно непростой процесс, особенно когда требуется запуск разных сервисов в отдельных вкладках единого терминала.
Теория
Gnome-terminal – это один из самых популярных эмуляторов терминала в среде рабочего стола GNOME. Он поддерживает открытие нескольких вкладок и позволяет настраивать терминалы для выполнения различных команд. Однако при неправильной конфигурации нас могут подстерегать такие проблемы, как неспособность найти исполняемый файл или неудачное создание процесса-потомка. Это, как правило, происходит из-за неверных настроек пути, отсутствия прав на выполнение или из-за неизвестности команд в среде, где они вызываются.
Стандартная форма использования команды для gnome-terminal с несколькими вкладками была изменена за последние годы. Когда-то популярный флаг -e
, предназначенный для выполнения команды в открывшемся терминале, считается устаревшим. Вместо этого рекомендуется использовать --
с явным вызовом bash.
Пример
Ваш пример команды выглядел следующим образом:
gnome-terminal --tab --title="rails s" -e "rails s" --tab --title="spork" -e "spork" --tab --title="autotest" -e "autotest"
Из-за использования устаревшего флага -e
и, возможно, конфигураций, которые по разным причинам не позволяют spork и autotest запускаться, возникает ошибка о невозможности создания процесса.
Применение
Чтобы решить указанную проблему и эффективно организовать запуск нескольких сервисов в отдельных вкладках, можно использовать различные подходы:
-
Корректная конфигурация пути. Проверьте, что команды
rails s
,spork
, иautotest
доступны в переменной среды$PATH
. Это можно сделать, добавив пути к исполняемым файлам в переменную$PATH
или использовав абсолютные пути. -
Использование актуальных подходов. Одна из возможностей заключается в применении
bash -c
для выполнения команд в каждой из вкладок:gnome-terminal -- bash -c "rails s; exec bash" \ --tab -- bash -c "spork; exec bash" \ --tab -- bash -c "autotest; exec bash"
Данный подход гарантирует, что после исполнения команды терминальное окно останется открытым, что полезно для просмотра вывода или отладочных данных.
-
Использование скриптов. Создайте bash-скрипты для каждой из команд и вызовите их из
gnome-terminal
:#!/bin/bash cd /путь/к/вашему/приложению rails s
#!/bin/bash cd /путь/к/вашему/приложению spork
Затем вы можете использовать gnome-terminal для вызова этих скриптов:
gnome-terminal -- bash -c "/путь/до/rails_s.sh; exec bash" \ --tab -- bash -c "/путь/до/spork.sh; exec bash" \ --tab -- bash -c "/путь/до/autotest.sh; exec bash"
-
Работа с профилями. Использование профилей в gnome-terminal может упростить задачу. Убедитесь, что для каждой вкладки указан правильный профиль или параметризуйте команду с
--tab-with-profile
, чтобы использовать конкретные настройки терминала.
При выполнении этих шагов вы не только устраните возникшие проблемы, но и обеспечите стабильный и удобный процесс работы с несколькими вкладками в gnome-terminal. Это повысит вашу производительность и снизит вероятность повторного возникновения ошибок, связанных с неправильной конфигурацией вызова команд.