Изменить привязку ключа tmux для сценария bash

#tmux

#tmux

Вопрос:

У нас есть скрипт bash, который мы можем запустить на узле доступа к кластеру, который выполняет htop на всех дочерних узлах кластера, чтобы мы могли контролировать весь кластер одновременно.

Теперь мой вопрос заключается в том, существует ли способ привязки Ctrl-C или q для этого скрипта, без необходимости использования префикса tmux. Идея заключается в том, что это заставило бы скрипт вести себя очень похоже на обычную команду htop (которая использует привязку ключа q для выхода), и другим пользователям не пришлось бы углубляться в особенности использования tmux, когда они хотят выйти из окна.

Я знаю, что есть способ изменить поведение с помощью .tmux.conf файла. Однако мы не хотим устанавливать эти привязки клавиш глобально, а только для этого одного скрипта.

Командный сценарий bash выглядит следующим образом:

 tmux new -s logs_htop -d ssh-run htop 1
tmux select-pane -T 'cn01'

tmux splitw -v -p 50 -t logs_htop:0.0 ssh-run htop 5
tmux select-pane -T 'cn05'

tmux splitw -h -p 75 -t logs_htop:0.0 ssh-run htop 2
tmux select-pane -T 'cn02'

tmux splitw -h -p 66 -t logs_htop:0.1 ssh-run htop 3
tmux select-pane -T 'cn03'

tmux splitw -h -p 50 -t logs_htop:0.2 ssh-run htop 4
tmux select-pane -T 'cn04'

tmux splitw -h -p 75 -t logs_htop:0.4 ssh-run htop 6
tmux select-pane -T 'cn06'

tmux splitw -h -p 66 -t logs_htop:0.5 ssh-run htop 7
tmux select-pane -T 'cn07'

tmux splitw -h -p 50 -t logs_htop:0.6 "watch squeue -al"
tmux select-pane -T 'squeue'

tmux attach -t logs_htop
 

Комментарии:

1. Как этот скрипт будет использоваться C-c в качестве привязки tmux? Почему вы хотите, чтобы скрипт мог использовать привязку ключей?

2. Нет необходимости в «классической» привязке ключа tmux, поскольку мне не нужны никакие другие функции tmux, кроме разделения экрана и запуска htop на разных узлах кластера. В принципе, как только приведенный выше сценарий будет выполнен и покажет разные htops, мне нужен простой и «интуитивно понятный» способ завершить весь сеанс. Таким образом, пользователи могут либо нажать Ctrl-C , либо q существовать во время сеанса. Поскольку это поведение, которое они ожидают при выполнении обычной команды htop.

Ответ №1:

Да, это возможно при подключении к другому сокету tmux с помощью настраиваемого файла конфигурации tmux.

Сначала создайте свою пользовательскую привязку ключа tmux в отдельном файле conf:

 mkdir -p /etc/tmux
echo "bind-key -n C-c kill-session" > /etc/tmux/tmux-logs-htop.conf
# do not recommend q as htop is context-sensitive and q does not *always* mean quit
echo "bind-key -n q kill-session" >> /etc/tmux/tmux-logs-htop.conf
 

Затем создайте свой собственный сервер tmux:

 tmux -L logs_htop -f /etc/tmux/tmux-logs-htop.conf
 

Наконец, отредактируйте свой скрипт, чтобы к каждой команде добавлялся префикс с конкретным сервером socket / tmux, на который будут поступать команды:

 tmux -L logs_htop new -s logs_htop -d ssh-run htop 1 
...
 

От man tmux :

 -L socket-name
 tmux stores the server socket in a directory under TMUX_TMPDIR or /tmp if it is unset.
 The default socket is named default.  This option allows a different socket name to be
 specified, allowing several independent tmux servers to be run.  Unlike -S a full path is
 not necessary: the sockets are all created in the same directory.
 

Комментарии:

1. Это работает, спасибо! Еще одна вещь. Когда я помещаю все это в один скрипт, включая мой скрипт, сначала он открывает консоль tmux с новым сервером, который я должен отсоединить вручную, и он выполняется с остальной частью моего вышеупомянутого скрипта. Если я добавлю -d флаг к вашей команде: tmux -L logs_htop -f /etc/tmux/tmux-logs-htop.conf -d , то привязки клавиш больше не будут работать. Есть ли какой-нибудь обходной путь, который позволяет поместить все это в один скрипт?

2. Вы пытались «отредактировать свой скрипт так, чтобы к каждой команде добавлялся определенный сокет»?

3. Я нашел проблему. У меня там был дополнительный tmux -L logs_htop kill-session -t logs_htop , где первоначальная идея заключалась в том, чтобы прервать сеанс, если какой-то пользователь отсоединит его. Потому что предыдущий запуск скрипта, отсоединение и повторный запуск вложили скрипт в первый открытый сеанс tmux. Однако здесь мне больше не нужен сеанс уничтожения. Еще раз спасибо вам за отличный совет!