Как выполнить команду очистки на выходе сервера tmux / сеанса?

2154
Wolph

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

Есть ли способ автоматически выполнить команду при выходе из сервера tmux?

Требуемый рабочий процесс:

  • выполнить команду, чтобы создать новый tmux сервер, открыть несколько файлов, запустить несколько приложений
  • работать в сессии
  • отделиться, чтобы работать над этим позже
  • прикрепить
  • когда все вкладки на сервере tmux закрыты и сервер уничтожен, выполните команду очистки

[edit] Скрипт, который я сейчас использую: https://github.com/WoLpH/dotfiles/blob/master/bin/tmx

4
Под «командой очистки» вы подразумеваете команду, специфичную для сервера? Например, у вас есть сеанс, открытый для проекта A, и другой сеанс для проекта B. Итак, вы хотите выполнить cleanup_A, когда session_A закрыто? Или ты имеешь в виду что-то другое? scicalculator 10 лет назад 0
Да, именно это я и имею в виду. Но общая команда очистки тоже может сработать, я могу легко вывести ранее открытый проект из оставшихся файлов. Мне просто нужен любой триггер пост-серверного выхода, чтобы я мог размонтировать некоторые вещи. Wolph 10 лет назад 0
Я написал утилиту командной строки для сценариев установки / разрыва сеанса tmux: https://github.com/tarruda/tmuxer. Он даже включает замену «выберите сеанс», которая позволит вам выбрать «закрытые» сеансы Thiago de Arruda 10 лет назад 0
@ThiadodeArruda: это выглядит круто, я скоро проверю. В настоящее время я использую этот скрипт: https://github.com/WoLpH/dotfiles/blob/master/bin/tmx Wolph 10 лет назад 0
@Wolph: мое решение было интегрировано в сценарий dotfiles-zsh, недавно я извлек его в повторно используемый набор сценариев оболочки, совместимых с posix, для лучшей переносимости и более легкого повторного использования другими пользователями. Thiago de Arruda 10 лет назад 0
Кстати, если вы используете tmuxinator, вы можете просто добавить команду `post` в ваш конфигурационный файл. Valentin Waeselynck 8 лет назад 0
@ValentinWaeselynck: это действительно хорошая альтернатива. Для меня это не совсем подходит, так как я регулярно работаю на (устаревших) серверах, где у меня очень мало программной поддержки, а у tmuxinator слишком много задач для установки. Wolph 8 лет назад 0

1 ответ на вопрос

6
scicalculator

For now, there is no specific way to have tmux automatically run commands triggered by detach or closing all windows in the session. However, since you already have a wrapper script (I will call this tmux_wrapper) that opens your desired custom-session, you can easily convert this script to automate cleanup. I do something very similar to this myself here, where I wanted to allow nested tmux sessions if I am attaching through ssh.

Since you have a custom experience in mind, you no longer need the tmux attach .... or similar commands, so I will assume you always start session for project A by something like tmux_wrapper A. In your wrapper you probably have a line similar to tmux new-session -s A. Here we can take advantage of the session name A. Then, at the end of your wrapper you can have a cleanup switch that only activates if the session is no longer live (i.e. windows/panes are no longer attachable).

A simple example tmux_wrapper would look something like this:

#!/bin/sh sess=$1 # test if the session has windows is_closed(){ n=$(tmux ls 2> /dev/null | grep "^$sess" | wc -l) [[ $n -eq 0 ]] } # either create it or attach to it if is_closed ; then tmux new -s $sess else tmux attach -t $sess fi # the session is now either closed or detatched if is_closed ; then # perform cleanup here ... fi 

Run it like tmux_wrapper A. Now, the cleanup will automatically occur for session A if and only if the session has been completely closed.

Не самое красивое решение, но оно должно работать :) Спасибо! У меня действительно есть подобный скрипт, вы можете найти его здесь, если вам интересно: https://gist.github.com/WoLpH/3163775 Wolph 10 лет назад 0