Как запустить терминал Alacritty из другого терминала Alacritty, который был запущен Waybar.

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

Я использую модуль Waybar в настройках Arch Linux с Hyprland, где файл .config/waybar/modules.json установлен следующим образом:

  "custom/clusterteleport": {
    "format": " Cluster Teleport",
    "escape": true,
    "on-click": "$(cat ~/.config/ml4w/settings/terminal.sh) --class dotfiles-floating -e ~/.config/ml4w/scripts/cluster-teleport.sh"
  },

Терминал:

cat ~/.config/ml4w/settings/terminal.sh
alacritty%

Скрипт cluster-teleport.sh выглядит следующим образом:

#!/bin/bash

sleep 0.1
clear
figlet -f smslant "Teleport to Cluster"
echo

pkill tsh -9
sleep 0.1
tsh kube login cluster
tsh proxy kube -p 8443 > /home/user/log/cluster-teleport-proxy-kube 2>&1 &

# ------------------------------------------------------
# Запуск K9S?
# ------------------------------------------------------

sleep 0.1

if gum confirm "ХОТИТЕ ЛИ ВЫ ЗАПУСТИТЬ K9S?" ;then
    bash -c "export KUBECONFIG=/home/user/.tsh/keys/cluster/user-kube/cluster/localproxy-8443-kubeconfig && exec alacritty --hold -e k9s &"
    disown
    sleep 0.6
    exit
fi

echo "Нажмите [ENTER], чтобы закрыть."
read

Если я открываю терминал Alacritty из Arch, то cluster-teleport.sh работает корректно. В итоге он открывает K9S в другом терминале Alacritty, и оригинальный терминал Alacritty, где был запущен скрипт, можно закрыть. K9S будет продолжать работать в новом терминале.

Однако, когда я запускаю скрипт через Waybar, терминал K9S закрывается, когда оригинальный скрипт завершает свою работу.

Я пробовал много вариантов при запуске K9S, но ни один из них не сработал. Я пробовал nohup и другие подобные инструменты. Моя последняя попытка — то, что вы видите выше.

Для чего нужно "escape": true в конфигурационном файле? Вы пробовали установить его на false?


Но если это не сработает: я ничего не знаю о Waybar или его модулях, однако:

$(cat ~/.config/ml4w/settings/terminal.sh) --class dotfiles-floating -e ~/.config/ml4w/scripts/cluster-teleport.sh

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

Некоторая форма PATH также, похоже, доступна, поскольку alacritty правильно ищется, находится и выполняется.

Учитывая это, вы могли бы в «святом» и переносимом (POSIX) стиле добавить такую команду, которая должна корректно выполниться в любой оболочке, совместимой с POSIX:

exec zsh

что заменит любую оболочку, выполняющую команду, на интерактивный экземпляр Zsh. Это в любом случае должно предотвратить завершение процесса, выполняемого в терминале (вероятно, какая-то команда bash -c / zsh -c).

То есть, заменить:

$(cat ~/.config/ml4w/settings/terminal.sh) --class dotfiles-floating -e ~/.config/ml4w/scripts/cluster-teleport.sh

на:

$(cat ~/.config/ml4w/settings/terminal.sh) --class dotfiles-floating -e ~/.config/ml4w/scripts/cluster-teleport.sh; exec zsh

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

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

Подход для решения проблемы

  1. Использование nohup или disown: Вы уже пробовали использовать nohup, но возможно вы не применяли его корректно. nohup используется для запуска процесса так, чтобы он не прекращался при выходе из терминала. Давайте обновим ваш скрипт cluster-teleport.sh:
#!/bin/bash

sleep 0.1
clear
figlet -f smslant "Teleport to Cluster"
echo

pkill tsh -9
sleep 0.1
tsh kube login cluster
tsh proxy kube -p 8443 > /home/user/log/cluster-teleport-proxy-kube 2>&1 &

# ------------------------------------------------------
# Запустить K9S?
# ------------------------------------------------------

sleep 0.1

if gum confirm "ХОТИТЕ ЗАПУСТИТЬ K9S?" ;then
    # Запуск Alacritty с K9S в фоновом режиме с использованием nohup
    nohup alacritty --hold -e k9s > /dev/null 2>&1 &
    disown
    sleep 0.6
    exit
fi

echo "Нажмите [ENTER], чтобы закрыть."
read
  1. Изменение конфигурации Waybar: Обновите команду в вашем modules.json, чтобы она выглядела следующим образом:
"on-click": "$(cat ~/.config/ml4w/settings/terminal.sh) --class dotfiles-floating -e 'nohup ~/.config/ml4w/scripts/cluster-teleport.sh & disown'"

Это должно позволить вашему скрипту свободно завершаться, в то время как K9S продолжает работать в отдельном терминале.

  1. Проверка escape: Опция "escape": true в конфигурации указывает Waybar экранировать специальные символы. Хотя это не напрямую относится к вашей проблеме, попробуйте установить её в false и посмотреть, не влияет ли это на поведение. Но главное, это не должно помочь в данном сценарии.

Что еще попробовать

  • Добавление команды exec: Команда exec заменяет текущий процесс в терминале. Вы можете попробовать добавить exec zsh в конце команды запуска K9S, как вы упомянули в своем вопросе. Но это больше применимо, если вы хотите оставить текущую сессию активной.

Заключение

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

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

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