Como detectar se o tmux está conectado?

5

Eu tenho um Irssi rodando dentro de uma sessão do tmux, e estou trabalhando na escrita de um script Irssi (extensão) para me enviar um email quando alguém PMs ou menciona-me quando não estou conectado à sessão do tmux.

Tudo sobre isso é muito fácil, menos uma coisa: como você detecta se a sessão tmux está conectada?

Eu cheguei tão longe com isso, e estou chegando aqui principalmente para ver se esta é a maneira correta / melhor de fazê-lo, ou se eu deveria estar fazendo isso de forma diferente. Qualquer conselho é apreciado!

# Get the current session_name value from tmux
$ tmux display -p '#{session_name}'
2

# Running list-clients while I'm attached yields the following,
# from both the same window as well as another window:
$ tmux list-clients -t 2
(null): 2 [180x42 (null)] 

# As well, running list-clients while detached yields no output:
$ tmux list-clients -t 2
$ 

Tudo dito, eu acho que este é o caminho certo para fazer isso, mas eu estou certamente aberto a quaisquer maneiras melhores ou sugestões sobre como verificar isso.

    
por Spikes 23.11.2013 / 20:20

2 respostas

6

OK, eu acho que eu tenho as peças que você precisa, mas vou deixar para você juntá-las em um todo coeso.

A variável de ambiente TMUX informará se o processo atual está sendo executado no tmux ou não:

<~> $ echo $TMUX
/private/var/folders/1s/ff98nkc90mv7pfglffklcv8w0000gn/T/tmux-501/default,27570,8

O último valor (8) é o ID da sessão (que pode ou não ser também o nome da sessão). No exemplo acima, nosso ID de sessão é 8, mas não temos uma sessão chamada '8':

<~> $ tmux ls
0: 1 windows (created Sat Nov 23 21:17:45 2013) [80x23]
1: 1 windows (created Sat Nov 23 21:17:45 2013) [120x34]
bar: 2 windows (created Tue Nov 26 03:05:03 2013) [120x34] (attached)
blech: 1 windows (created Tue Nov 26 03:12:46 2013) [120x34] (attached)

Mas podemos obter essa informação do tmux usando a string de formato -F:

<~> $ tmux ls -F "#{session_name}: (#{session_id})"
0: ($0)
1: ($1)
bar: ($5)
blech: ($8)

Você pode usar essas informações para ver se está anexado ou não:

<~> $ tmux ls -F "#{session_id}: #{?session_attached,attached,not attached}"
$0: not attached
$1: not attached
$5: attached
$8: attached

Deixe-me saber se você precisa de ajuda para juntar tudo.

    
por 26.11.2013 / 09:22
2

Com base no conselho de jasonwryan nos comentários, acabei com os dois comandos a seguir.

Mostra o nome da sessão atual.

Como estamos em uma linguagem de script, não precisamos necessariamente saber o ID da sessão.

tmux display -p '#{session_name}'

Listar todas as sessões por nome e seus respectivos status anexados.

session_attached é um bool e é representado como um único dígito, facilitando para a maioria das linguagens de script analisar esse formato de saída.

# Show the session attached status for each session name. session_attached
# is a single digit, either 0 or 1, making it easy to distinguish 
tmux ls -F '#{session_attached} #{session_name}'

Em Perl (plugins IRSSI), a análise desse formato de saída é tão fácil quanto

my ($attached, $name) = $line =~ /^(\d) (.+)$/;
    
por 06.12.2013 / 23:14

Tags