Вопрос или проблема
Я использую модуль 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 зависимости от родительского процесса, который завершает свою работу.
Подход для решения проблемы
- Использование
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
- Изменение конфигурации Waybar: Обновите команду в вашем
modules.json
, чтобы она выглядела следующим образом:
"on-click": "$(cat ~/.config/ml4w/settings/terminal.sh) --class dotfiles-floating -e 'nohup ~/.config/ml4w/scripts/cluster-teleport.sh & disown'"
Это должно позволить вашему скрипту свободно завершаться, в то время как K9S продолжает работать в отдельном терминале.
- Проверка
escape
: Опция"escape": true
в конфигурации указывает Waybar экранировать специальные символы. Хотя это не напрямую относится к вашей проблеме, попробуйте установить её вfalse
и посмотреть, не влияет ли это на поведение. Но главное, это не должно помочь в данном сценарии.
Что еще попробовать
- Добавление команды
exec
: Командаexec
заменяет текущий процесс в терминале. Вы можете попробовать добавитьexec zsh
в конце команды запуска K9S, как вы упомянули в своем вопросе. Но это больше применимо, если вы хотите оставить текущую сессию активной.
Заключение
Таким образом, описанные выше изменения должны помочь вам избежать закрытия терминала с K9S после выхода из скрипта, который был вызван через Waybar. Важно правильно управлять процессами, чтобы K9S не зависел от родительского терминала. Попробуйте предложенные решения и убедитесь, что они работают в вашей среде.