103.5 Lição 2
Certificação: |
LPIC-1 |
---|---|
Versão: |
5.0 |
Tópico: |
103 Comandos GNU e Unix |
Objetivo: |
103.5 Criar, monitorar e eliminar processos |
Lição: |
2 de 2 |
Introdução
As ferramentas e utilitários vistos na lição anterior são muito úteis para o monitoramento de processos em geral. No entanto, o administrador do sistema pode precisar ir além. Nesta lição, discutiremos o conceito de multiplexadores de terminal e aprenderemos sobre GNU Screen e tmux, já que — embora os emuladores de terminal modernos sejam excelentes — os multiplexadores ainda preservam alguns recursos interessantes e poderosos para a produtividade de um administrador de sistema.
Recursos dos multiplexadores de terminal
Em eletrônica, um multiplexador (ou mux) é um dispositivo que permite que várias entradas sejam conectadas a uma única saída. Assim, um multiplexador de terminal nos proporciona a capacidade de alternar entre diferentes entradas conforme necessário. Embora não sejam exatamente iguais, screen
e tmux
compartilham uma série de características comuns:
-
Qualquer invocação bem-sucedida resultará em pelo menos uma sessão que — por sua vez — incluirá ao menos uma janela. As janelas contêm programas.
-
As janelas pode ser divididas em regiões ou painéis — o que ajuda na produtividade ao se trabalhar com vários programas simultaneamente.
-
Facilidade de controle: para executar a maioria dos comandos, usamos uma combinação de teclas — o chamado prefixo de comando ou chave de comando — seguida por outro caractere.
-
As sessões podem ser desanexadas do terminal em que estão (ou seja, os programas são enviados para o segundo plano e continuam em execução). Isso garante a execução completa dos programas, independentemente de fecharmos acidentalmente um terminal, travamentos ocasionais ou até mesmo a perda da conexão remota.
-
Conexão de socket.
-
Modo de cópia.
-
São altamente personalizáveis.
GNU Screen
Nos primórdios do Unix (anos 1970-80), os computadores consistiam basicamente em terminais conectados a um computador central. Era só isso mesmo, sem um monte de janelas ou abas. E essa foi a razão por trás da criação do GNU Screen em 1987: emular múltiplas telas VT100 independentes em um único terminal físico.
Janelas
O GNU Screen é invocado simplesmente digitando screen
no terminal. Aparece primeiro uma mensagem de boas-vindas:
GNU Screen version 4.05.00 (GNU) 10-Dec-16 Copyright (c) 2010 Juergen Weigert, Sadrul Habib Chowdhury Copyright (c) 2008, 2009 Juergen Weigert, Michael Schroeder, Micah Cowan, Sadrul Habib Chowdhury Copyright (c) 1993-2002, 2003, 2005, 2006, 2007 Juergen Weigert, Michael Schroeder Copyright (c) 1987 Oliver Laumann (...)
Pressione Espaço ou Enter para fechar a mensagem e será mostrado um prompt de comando:
$
Pode parecer que nada aconteceu, mas o fato é que o comando screen
já criou e gerencia sua primeira sessão e janela. O prefixo do comando screen é Ctrl+a. Para ver todas as janelas na parte inferior da tela do terminal, digite Ctrl+a-w:
0*$ bash
Aqui está, nossa única janela até agora! Observe, no entanto, que a contagem começa em 0. Para criar outra janela, digite Ctrl+a-c. Você verá um novo prompt. Vamos iniciar o ps
nessa nova janela:
$ ps PID TTY TIME CMD 974 pts/2 00:00:00 bash 981 pts/2 00:00:00 ps
e digitar Ctrl+a-w novamente:
0-$ bash 1*$ bash
Agora temos nossas duas janelas (observe o asterisco que indica a que está sendo exibida no momento). No entanto, como foram iniciadas com o Bash, as duas receberam o mesmo nome. Já que chamamos o ps
em nossa janela atual, vamos renomeá-lo com esse mesmo nome. Para isso, digite Ctrl+a-A e escreva o novo nome da janela (ps
) quando solicitado:
Set window's title to: ps
Agora, vamos criar outra janela, já com um nome desde o início: yetanotherwindow
. Para isso, invocamos screen
com a opção -t
:
$ screen -t yetanotherwindow
Há várias maneiras de se mover entre as janelas:
-
Usando Ctrl+a-n (ir para a próxima janela, next em inglês) e Ctrl+a-p (ir para a janela anterior, previous).
-
Usando Ctrl+a-número (ir para a janela número número).
-
Usando Ctrl+a-" para ver uma lista de todas as janelas. Use as setinhas do teclado para selecionar a janela que deseja e dê Enter:
Num Name Flags 0 bash $ 1 ps $ 2 yetanotherwindow
Ao trabalhar com janelas, é importante lembrar o seguinte:
-
As janelas executam seus programas de forma totalmente independente umas das outras.
-
Os programas continuarão a ser executados mesmo que suas janelas não estejam visíveis (inclusive quando a sessão de screen for desanexada, como veremos em breve).
Para remover uma janela, basta encerrar o programa que está em execução nela (quando a última janela for removida, o próprio screen
será encerrado). Outra alternativa é usar Ctrl+a-k enquanto estiver na janela que deseja remover; será solicitada a confirmação:
Really kill this window [y/n] Window 0 (bash) killed.
Regiões
O screen
pode dividir uma tela de terminal em diversas regiões para acomodar janelas. Essas divisões podem ser horizontais (Ctrl+a-S) ou verticais (Ctrl+a-|).
A única coisa que a nova região mostrará é --
na parte inferior, o que significa que está vazia:
1 ps --
Para passar à nova região, digite Ctrl+a-Tab. Agora podemos adicionar uma janela com qualquer um dos métodos que já vimos, por exemplo: Ctrl+a-2. Assim, o --
deve se transformar em 2 yetanotherwindow
:
$ ps $ PID TTY TIME CMD 1020 pts/2 00:00:00 bash 1033 pts/2 00:00:00 ps $ screen -t yetanotherwindow 1 ps 2 yetanotherwindow
Alguns aspectos importantes a lembrar ao se trabalhar com regiões:
-
Para se mover entre regiões, digite Ctrl+a-Tab.
-
Para encerrar todas as regiões exceto a atual, use Ctrl+a-Q.
-
Para encerrar a região atual, use Ctrl+a-X.
-
O encerramento de uma região não encerra a janela associada a ela.
Sessões
Até agora brincamos com algumas janelas e regiões, mas todas pertencentes à mesma e única sessão. É hora de começar a brincar com as sessões. Para ver uma lista de todas as sessões, digite screen -list
ou screen -ls
:
$ screen -list There is a screen on: 1037.pts-0.debian (08/24/19 13:53:35) (Attached) 1 Socket in /run/screen/S-carol.
Essa é a nossa única sessão no momento:
- PID
-
1037
- Nome
-
pts-0.debian
(indicando o terminal — em nosso caso, um pseudo-terminal escravo — e o nome do host). - Status
-
Attached
Vamos criar uma nova sessão, dando a ela um nome mais descritivo:
$ screen -S "second session"
A tela do terminal será esvaziada e um novo prompt se abrirá. Você pode verificar as sessões mais uma vez:
$ screen -ls There are screens on: 1090.second session (08/24/19 14:38:35) (Attached) 1037.pts-0.debian (08/24/19 13:53:36) (Attached) 2 Sockets in /run/screen/S-carol.
Para encerrar uma sessão, saia de todas as janelas ou simplesmente digite o comando screen -S SESSION-PID -X quit
(também é possível fornecer o nome da sessão). Vamos nos livrar de nossa primeira sessão:
$ screen -S 1037 -X quit
Você será enviado de volta ao prompt do terminal fora de screen
. Mas lembre-se, nossa segunda sessão ainda está viva:
$ screen -ls There is a screen on: 1090.second session (08/24/19 14:38:35) (Detached) 1 Socket in /run/screen/S-carol.
No entanto, como eliminamos a sessão pai, ela recebe um novo rótulo: Detached
(desanexada).
Desanexando sessões
Por uma série de razões, podemos querer desanexar uma sessão do screen do terminal a que pertence:
-
Para deixar o computador da empresa cumprir seu dever e conectar-se remotamente mais tarde, de casa.
-
Para compartilhar uma sessão com outros usuários.
Para desanexar uma sessão, a combinação de teclas é Ctrl+a-d. Você é levado de volta ao seu terminal:
[detached from 1090.second session] $
Para entrar novamente na sessão desanexada, use o comando screen -r SESSION-PID
. Outra alternativa é SESSION-NAME
, como vimos acima. Se houver apenas uma sessão desanexada, nenhuma dessas opções é obrigatória:
$ screen -r
Este comando basta para anexar novamente a segunda sessão:
$ screen -ls There is a screen on: 1090.second session (08/24/19 14:38:35) (Attached) 1 Socket in /run/screen/S-carol.
Opções importantes para reanexar sessões:
-d -r
-
Reanexa uma sessão e — se necessário — a desanexa primeiro.
-d -R
-
Igual a
-d -r
, mas oscreen
cria primeiro uma sessão caso ela não exista. -d -RR
-
Igual a
-d -R
. No entanto, usa a primeira sessão se houver mais de uma disponível. -D -r
-
Reanexa uma sessão. Se necessário, o comando a desanexa e faz logout remotamente primeiro.
-D -R
-
Se uma sessão estiver rodando, ela é reanexada (desanexando e desconectando remotamente primeiro, caso necessário). Se não for o caso, ela é criada e o usuário, notificado.
-D -RR
-
Igual a
-D -R
— só que mais poderoso. -d -m
-
Inicia o
screen
em modo detached (desanexado). Uma nova sessão é criada, mas desanexada. Útil para scripts de inicialização do sistema. -D -m
-
Igual a
-d -m
, mas não bifurca um novo processo. O comando é encerrado se a sessão terminar.
Leia as páginas de manual de screen
para descobrir outras opções.
Copiar e colar: Modo de rolagem
O GNU Screen apresenta um modo de cópia ou modo de rolagem. Dentro dele, você pode mover o cursor na janela atual e através do conteúdo de seu histórico usando as setas do teclado. Você pode marcar o texto e copiá-lo nas janelas. As etapas a seguir são:
-
Entre no modo de cópia/rolagem: Ctrl+a-[.
-
Vá para o início da parte do texto que deseja copiar usando as setas do teclado.
-
Marque o início do trecho de texto que deseja copiar: Espaço.
-
Vá para o final da parte do texto que deseja copiar usando as setas do teclado.
-
Marque o final do trecho de texto que deseja copiar: Espaço.
-
Vá para a janela de sua escolha e cole o texto: Ctrl+a-].
Personalização de screen
O arquivo de configuração de todo o sistema para screen é /etc/screenrc
. Também é possível usar ~/.screenrc
no nível do usuário. O arquivo inclui quatro seções de configuração principais:
SCREEN SETTINGS
-
Você pode definir configurações gerais especificando a diretiva seguida por um espaço e o valor, como em:
defscrollback 1024
. SCREEN KEYBINDINGS
-
Esta seção é bastante interessante, pois permite redefinir os atalhos de teclado que podem interferir no seu uso diário do terminal. Use a palavra-chave
bind
seguida por um espaço, o caractere a ser usado após o prefixo do comando, outro espaço e o comando, como em:bind l kill
(esta configuração mudará a forma padrão de eliminar uma janela para Ctrl+a-l).Para exibir todos os atalhos de screen, digite Ctrl+a-? ou consulte a página de manual.
TipClaro, você também pode alterar o próprio prefixo do comando. Por exemplo, para ir de Ctrl+a a Ctrl+b, basta adicionar esta linha:
escape ^Bb
. TERMINAL SETTINGS
-
Esta seção inclui as configurações relacionadas aos tamanhos de janela de terminal e buffers — entre outros. Para habilitar o modo sem bloqueio para lidar melhor com conexões SSH instáveis, por exemplo, a seguinte configuração é usada:
defnonblock 5
. STARTUP SCREENS
-
Podemos incluir comandos para que diversos programas sejam executados após a inicialização de
screen
; por exemploscreen -t top top
(o screen abre uma janela chamadatop
comtop
dentro dela).
tmux
O tmux
foi lançado em 2007. Embora muito semelhante ao screen
, ele apresenta algumas diferenças notáveis:
-
Modelo cliente-servidor: o servidor fornece uma série de sessões, cada uma das quais pode ter várias janelas anexadas a ele que podem, por sua vez, ser compartilhadas por vários clientes.
-
Seleção interativa de sessões, janelas e clientes via menus.
-
A mesma janela pode ser anexada a várias sessões.
Disponibilidade de atalhos do vim e do Emacs.
-
Suporte para terminal UTF-8 e 256 cores.
Janelas
O tmux
pode ser invocado simplesmente digitando tmux
no prompt de comando. Você verá um prompt do shell e uma barra de status na parte inferior da janela:
[0] 0:bash* "debian" 18:53 27-Aug-19
Além do hostname
, a hora e a data, a barra de status fornece as seguintes informações:
- Nome da sessão
-
[0]
- Número da janela
-
0:
- Nome da janela
-
bash*
. Por padrão, esse é o nome do programa em execução dentro da janela e — ao contrário descreen
— otmux
irá atualizá-lo automaticamente para refletir o programa em execução atual. Observe o asterisco indicando que esta é a janela atual em exibição.
Você pode atribuir nomes de sessão e janela ao invocar tmux
:
$ tmux new -s "LPI" -n "Window zero"
A barra de status será alterada de acordo:
[LPI] 0:Window zero* "debian" 19:01 27-Aug-19
O prefixo do comando do tmux é Ctrl+b. Para criar uma nova janela, basta digitar Ctrl+b-c; você será levado a um novo prompt e a barra de status refletirá a nova janela:
[LPI] 0:Window zero- 1:bash* "debian" 19:02 27-Aug-19
Como o Bash é o shell subjacente, a nova janela recebe esse nome por padrão. Inicie top
e veja como o nome muda para top
:
[LPI] 0:Window zero- 1:top* "debian" 19:03 27-Aug-19
Em qualquer caso, você pode renomear uma janela com Ctrl+b-,. Quando solicitado, informe o novo nome e pressione Enter:
(rename-window) Window one
Para exibir todas as janelas, pressione Ctrl+b-w (use as setas do teclado para se mover para cima e para baixo e enter para selecionar):
(0) 0: Window zero- "debian" (1) 1: Window one* "debian"
Como em screen
, podemos pular de uma janela para outra com:
- Ctrl+b-n
-
ir para a próxima janela, next em inglês.
- Ctrl+b-p
-
ir para a janela anterior, previous.
- Ctrl+b-number
-
ir para a janela de número número.
Para eliminar uma janela, use Ctrl+b-&. Será solicitada a confirmação:
kill-window Window one? (y/n)
Outros comandos de janela interessantes são:
- Ctrl+b-f
-
encontrar uma janela pelo nome.
- Ctrl+b-.
-
alterar o número do índice da janela.
Para conhecer a lista completa de comandos, consulte a página do manual.
Painéis
A facilidade de divisão de janelas do screen
também está presente no tmux
. As divisões resultantes não são chamadas de regiões, mas de painéis. A diferença mais importante entre regiões e painéis é que os últimos são pseudoterminais completos anexados a uma janela. Isso significa que eliminar um painel também eliminará seu pseudo-terminal e todos os programas associados em execução nele.
Para dividir uma janela horizontalmente, usamos Ctrl+b-":
Tasks: 93 total, 1 running, 92 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 4050960 total, 3730920 free, 114880 used, 205160 buff/cache KiB Swap: 4192252 total, 4192252 free, 0 used. 3716004 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1340 carol 20 0 44876 3400 2800 R 0.3 0.1 0:00.24 top 1 root 20 0 139088 6988 5264 S 0.0 0.2 0:00.50 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd 3 root 20 0 0 0 0 S 0.0 0.0 0:00.04 ksoftirqd/0 4 root 20 0 0 0 0 S 0.0 0.0 0:01.62 kworker/0:0 5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H 7 root 20 0 0 0 0 S 0.0 0.0 0:00.06 rcu_sched 8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh 9 root rt 0 0 0 0 S 0.0 0.0 0:00.00 migration/0 10 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 lru-add-drain 11 root rt 0 0 0 0 S 0.0 0.0 0:00.01 watchdog/0 12 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuhp/0 $ ─────────────────────────────────────────────────────────────────────────────────────────────── $ [LPI] 0:Window zero- 1:Window one* "debian" 19:05 27-Aug-19
Para dividi-la verticalmente, usamos Ctrl+b-%:
│$ 1 root 20 0 139088 6988 5264 S 0.0 0.2 0:00.50 systemd │ │ 2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd │ │ 3 root 20 0 0 0 0 S 0.0 0.0 0:00.04 ksoftirqd/0 │ 4 root 20 0 0 0 0 S 0.0 0.0 0:01.62 kworker/0:0 │ 5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H│ 7 root 20 0 0 0 0 S 0.0 0.0 0:00.06 rcu_sched │ 8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh │ 9 root rt 0 0 0 0 S 0.0 0.0 0:00.00 migration/0 │ │ 10 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 lru-add-drai│ n │ 11 root rt 0 0 0 0 S 0.0 0.0 0:00.01 watchdog/0 │ │ 12 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuhp/0 │ │ $ │ ───────────────────────────────────────────────────────────────────────────────┴─────────────── $ [LPI] 0:Window zero- 1:Window one* "debian" 19:05 27-Aug-19
Para destruir o painel atual (junto com o pseudoterminal rodando dentro dele e quaisquer programas associados), use Ctrl+b-x. Será solicitada a confirmação na barra de status:
kill-pane 1? (y/n)
Comandos importantes dos painéis:
- Ctrl+b-↑,↓,←,→
-
mover-se entre painéis.
- Ctrl+b-;
-
passar para o último painel ativo.
- Ctrl+b-Ctrl+seta
-
redimensionar o painel em uma linha.
- Ctrl+b-Alt+seta
-
redimensionar o painel em cinco linhas.
- Ctrl+b-{
-
trocar de painel (do atual para o anterior).
- Ctrl+b-}
-
trocar de painel (do atual para o seguinte).
- Ctrl+b-z
-
aproximar/afastar o painel.
- Ctrl+b-t
-
O
tmux
exibe um relógio elegante dentro do painel (para removê-lo, pressioneq
). - Ctrl+b-!
-
transforma o painel em janela.
Para conhecer a lista completa de comandos, consulte a página do manual.
Sessões
Para listar as sessões no tmux
, você pode usar Ctrl+b-s:
(0) + LPI: 2 windows (attached)
Outra alternativa é usar o comando tmux ls
:
$ tmux ls LPI: 2 windows (created Tue Aug 27 19:01:49 2019) [158x39] (attached)
Existe apenas uma sessão (LPI
) que inclui duas janelas. Vamos criar uma nova sessão de dentro de nossa sessão atual. Isso pode ser feito usando Ctrl+b. Digite :new
no prompt e pressione Enter. Você será enviado para a nova sessão, conforme pode ser observado na barra de status:
[2] 0:bash* "debian" 19:15 27-Aug-19
Por padrão, o tmux
denomina a sessão 2
. Para renomeá-la, use Ctrl+b-$. Quando solicitado, informe o novo nome e pressione Enter:
(rename-session) Second Session
Para trocar de sessão, o atalho é Ctrl+b-s (use as setas do teclado e enter):
(0) + LPI: 2 windows (1) + Second Session: 1 windows (attached)
Para eliminar uma sessão, você pode usar o comando tmux kill-session -t SESSION-NAME
. Se digitar o comando de dentro da sessão atual anexada, você será retirado do tmux
e levado de volta à sua sessão de terminal inicial:
$ tmux kill-session -t "Second Session" [exited] $
Desanexando sessões
Ao eliminar Second Session
, fomos levados para fora do tmux
. No entanto, ainda temos uma sessão ativa. Peça ao tmux
uma lista de sessões e você certamente a encontrará ali:
$ tmux ls LPI: 2 windows (created Tue Aug 27 19:01:49 2019) [158x39]
No entanto, esta sessão está desanexada de seu terminal. Podemos anexá-la com tmux attach -t SESSION-NAME
(attach
pode ser substituído por at
ou — simplesmente — a
). Quando há apenas uma sessão, a especificação do nome é opcional:
$ tmux a
Agora você está de volta à sua sessão; para desanexá-la, pressione Ctrl+b-d:
[detached (from session LPI)] $
Tip
|
A mesma sessão pode ser anexada a mais de um terminal. Se quiser anexar uma sessão e ter certeza de que ela foi primeiramente desanexada de quaisquer outros terminais, use a opção |
Comandos importantes para anexar/desanexar sessão:
- Ctrl+b-D
-
seleciona o cliente a desanexar.
- Ctrl+b-r
-
atualiza o terminal do cliente.
Para conhecer a lista completa de comandos, consulte a página do manual.
Copiar e colar: Modo de rolagem
O tmux
também possui um modo de cópia, basicamente igual ao do screen
(lembre-se de usar o prefixo de comando do tmux e não o de screen!). A única diferença em termos de comando é que usamos Ctrl + Espaço para marcar o início da seleção e Alt+w para copiar o texto selecionado.
Personalização do tmux
Os arquivos de configuração do tmux
tipicamente se localizam em /etc/tmux.conf
and ~/.tmux.conf
. Quando iniciado, o tmux
procura por esses arquivos, se eles existirem. Também existe a possibilidade de iniciar o tmux
com a opção -f
para fornecer um arquivo de configuração alternativo. Um exemplo de arquivo de configuração do tmux
pode ser encontrado em /usr/share/doc/tmux/example_tmux.conf
. O nível de personalização é altíssimo. Eis algumas das coisas que é possível fazer:
-
Alterar a tecla de prefixo
# Change the prefix key to C-a set -g prefix C-a unbind C-b bind C-a send-prefix
-
Definir atalhos de teclado extras para janelas superiores a 9
# Some extra key bindings to select higher numbered windows bind F1 selectw -t:10 bind F2 selectw -t:11 bind F3 selectw -t:12
Para ver uma lista abrangente com todos os atalhos, digite Ctrl+b-? (pressione q
para sair) ou consulte a página de manual.
Exercícios Guiados
-
Indique se as seguintes afirmações/recursos correspondem ao GNU Screen, ao tmux ou a ambos:
Recurso/Afirmação GNU Screen tmux O prefixo dos comandos por padrão é Ctrl+a
Modelo Cliente-Servidor
Os painéis são pseudo-terminais
Eliminar uma região não elimina as janelas associadas
As sessões incluem janelas
As sessões podem ser desanexadas
Mude o nome da janela atual para vi
:
. Instale o tmux
em seu computador (nome do pacote: tmux
) e realize as tarefas a seguir:
+ * Inicie o programa. Que comando você usa?
+
+
* Inicie top
(note como — em poucos segundos — o nome da janela na barra de status muda para top
):
+
+
* Usando o prefixo de teclado do tmux, abra uma nova janela; em seguida, crie ~/.tmux.conf
usando nano
:
+
+ * Divida a janela verticalmente e reduza o tamanho do novo painel algumas vezes:
+
+
* Agora mude o nome da janela atual para text editing
; em seguida, faça o tmux
exibir uma lista de todas as sessões:
+
+
* Passe para a janela que está rodando top
e volte à janela atual usando a mesma combinação de teclas:
+
+
* Desanexe a sessão atual e crie uma nova chamada ssh
com uma janela chamada ssh window
:
+
+
* Desanexe também a sessão ssh
e faça o tmux
exibir outra vez a lista de sessões:
+
+
Note
|
A partir deste ponto, o exercício requer o uso de uma máquina remota para conexões |
+
* Agora, inicie uma máquina remota e conecte-se via ssh
de seu host local. Quando a conexão for estabelecida, procure por sessões do tmux
:
+
+
* No host remoto, anexe a sessão do ssh
pelo nome:
+
+
* De volta à máquina local, anexe a sessão do ssh
pelo nome, garantindo que a conexão ao hospedeiro remoto seja encerrada antes:
+
+
* Exiba todas as sessões para seleção e vá à primeira sessão ([0]
). Uma vez ali, elimine a sessão ssh
pelo nome:
+
+ * Finalmente, desanexe a sessão atual e elimine-a pelo nome:
+
Exercícios Exploratórios
-
Tanto
screen
quantotmux
podem entrar no modo de linha de comando através do atalho prefixo do comando + : (já vimos um breve exemplo comtmux
). Faça uma pesquisa e realize as seguintes tarefas em modo de linha de comando:-
Faça o
screen
entrar em modo de cópia: -
Faça o
tmux
renomear a janela atual: -
Faça o
screen
fechar todas as janelas e encerrar a sessão: -
Faça o
tmux
dividir um painel em dois: -
Faça o
tmux
eliminar a janela atual:
-
-
Quando entramos no modo de cópia no
screen
, não somente podemos usar as setas do teclado e PgUP or PgDown para navegar na janela atual e no buffer de rolagem; também há a possibilidade de usar um editor de tela completo como o vi. Usando esse editor, realize as seguintes tarefas:-
Ecoe (echo)
supercalifragilisticexpialidocious
em seu terminal descreen
: -
Agora, copie os cinco caracteres consecutivos (da esquerda para a direita) na linha acima de seu cursor:
-
Finalmente, cole a seleção (
stice
) em seu prompt de comando:
-
-
Suponha que você quer compartilhar uma sessão do
tmux
(our_session
) com outro usuário. Você criou o socket (/tmp/our_socket
) com as permissões corretas, para que você e o outro usuário possam ler e escrever. Quais são as outras duas condições para que o segundo usuário possa anexar com sucesso a sessão usandotmux -S /tmp/our_socket a -t our_session
?
Resumo
Nesta lição, você aprendeu sobre multiplexadores de terminal em geral e o GNU Screen e o tmux em particular. Estes são os conceitos importantes a lembrar:
-
Prefixo do comando: o
screen
usa Ctrl+a + caractere; otmux
, Ctrl+b + caractere. -
Estrutura de sessões, janelas e divisões de janelas (regiões ou painéis).
-
Modo de cópia.
-
Desanexar sessões: um dos recursos mais poderosos dos multiplexadores.
Comandos usados nesta lição:
screen
-
Inicia uma sessão do screen.
tmux
-
Inicia uma sessão do
tmux
.
Respostas aos Exercícios Guiados
-
Indique se as seguintes afirmações/recursos correspondem ao GNU Screen, ao tmux ou a ambos:
Recurso/Afirmação GNU Screen tmux O prefixo dos comandos por padrão é Ctrl+a
x
Modelo Cliente-Servidor
x
Os painéis são pseudo-terminais
x
Eliminar uma região não elimina as janelas associadas
x
As sessões incluem janelas
x
x
As sessões podem ser desanexadas
x
x
-
Instale o GNU Screen no seu computador (nome do pacote:
screen
) e realize as seguintes tarefas:-
Inicie o programa. Que comando você usa?
screen
-
Inicie
top
:top
-
Usando o prefixo de teclado de screen, abra uma nova janela; em seguida, abra
/etc/screenrc
usandovi
:Ctrl+a-c
sudo vi /etc/screenrc
-
Liste as janelas na parte de baixo da tela:
Ctrl+a-w
-
Mude o nome da janela atual para
vi
:Ctrl+a-A. Depois digitamos
vi
e pressionamos enter. -
Mude o nome da janela restante para
top
. Para isso, primeiro exiba uma lista de todas as janelas para poder navegar entre elas e selecionar a correta:Primeiro, digitamos Ctrl+a-". Em seguida usamos as setas do teclado para marcar a janela que diz
0 bash
e pressionamos enter. Finalmente, digitamos Ctrl+a-A, em seguidatop
e pressionamos enter. -
Confira se os nomes foram alterados exibindo o nome das janelas novamente na parte de baixo da tela:
Ctrl+a-w
-
Agora, desanexe a sessão e faça o
screen
criar uma nova de nomessh
:Ctrl+a-d
screen -S "ssh"
e pressione enter. -
Desanexe
ssh
e faça oscreen
exibir a lista de sessões:Ctrl+a-d
screen -list
ouscreen -ls
. -
Agora, anexe-a à primeira sessão usando seu PID:
screen -r PID-OF-SESSION
-
Você deve ter retornado à janela que está exibindo
top
. Divida a janela horizontalmente e passe para a nova região vazia:Ctrl+a-S
Ctrl+a-Tab
-
Faça o
screen
listar todas as janelas e selecionevi
para ser exibido na nova região vazia:Usamos Ctrl+a-" para exibir todas as janelas para seleção, marcamos
vi
e pressionamos enter. -
Agora, divida a região atual verticalmente, passe para a nova região vazia e associe-a a uma nova janela:
Ctrl+a-|
Ctrl+a-Tab
Ctrl+a-c
-
Elimine todas as regiões exceto a atual (lembre-se de que, embora você esteja eliminando as regiões, as janelas ainda estão vivas). Depois, saia de todas as janelas da sessão atual até que a sessão em si seja encerrada:
Ctrl+a-Q.
exit
(para sair do Bash). Shift+:, depois digitamosquit
e pressionamos enter (para sair dovi
). Em seguida, digitamosexit
(para sair do shell Bash subjacente),q
(para encerrartop
); depois digitamosexit
(para sair do shell Bash subjacente). -
Finalmente, faça o
screen
listar novamente suas sessões, elimine a sessãossh
restante pelo PID e confira se não sobrou nenhuma sessão:screen -list
ouscreen -ls
screen -S PID-OF-SESSION -X quit
screen -list
ouscreen -ls
-
-
Instale o
tmux
em seu computador (nome do pacote:tmux
) e realize as tarefas a seguir:-
Inicie o programa. Que comando você usa?
tmux
-
Inicie
top
(note como — em poucos segundos — o nome da janela na barra de status muda paratop
):top
-
Usando o prefixo de teclado do tmux, abra uma nova janela; em seguida, crie
~/.tmux.conf
usandonano
:Ctrl+b-c
nano ~/.tmux.conf
-
Divida a janela verticalmente e reduza o tamanho do novo painel algumas vezes:
Ctrl+b-"
Ctrl+b-Ctrl+↓
-
Agora mude o nome da janela atual para
text editing
; em seguida, faça otmux
exibir uma lista de todas as sessões:Ctrl+b-,. Daí informamos o novo nome e pressionamos enter. Ctrl+b-s ou
tmux ls
. -
Passe para a janela que está rodando
top
e volte à janela atual usando a mesma combinação de teclas:Ctrl+b-n or Ctrl+b-p
-
Desanexe a sessão atual e crie uma nova chamada
ssh
com uma janela chamadassh window
:Ctrl+b-d
tmux new -s "ssh" -n "ssh window"
-
Desanexe também a sessão
ssh
e faça otmux
exibir outra vez a lista de sessões:Ctrl+b-d
tmux ls
NoteA partir deste ponto, o exercício requer o uso de uma máquina remota para conexões
ssh
ao seu host local (uma máquina virtual é perfeitamente válida e pode ser muito prática). Certifique-se de ter oopenssh-server
instalado e rodando em sua máquina local e que pelo menos oopenssh-client
esteja instalado na máquina remota. -
Agora, inicie uma máquina remota e conecte-se via
ssh
de seu host local. Quando a conexão for estabelecida, procure por sessões dotmux
:No hospedeiro remoto:
ssh local-username@local-ipaddress
. Depois de conectá-lo à máquina local:tmux ls
. -
No host remoto, anexe a sessão do
ssh
pelo nome:tmux a -t ssh
(a
pode ser substituído porat
ouattach
). -
De volta à máquina local, anexe a sessão do
ssh
pelo nome, garantindo que a conexão ao hospedeiro remoto seja encerrada antes:tmux a -d -t ssh
(a
pode ser substituído porat
ouattach
). -
Exiba todas as sessões para seleção e vá à primeira sessão (
[0]
). Uma vez ali, elimine a sessãossh
pelo nome:Digitamos Ctrl+b-s, usamos as setas do teclado para marcar a sessão
0
e damos entertmux kill-session -t ssh
. -
Finalmente, desanexe a sessão atual e elimine-a pelo nome:
Ctrl+b-d
tmux kill-session -t 0
.
-
Respostas aos Exercícios Exploratórios
-
Tanto
screen
quantotmux
podem entrar no modo de linha de comando através do atalho prefixo do comando + : (já vimos um breve exemplo comtmux
). Faça uma pesquisa e realize as seguintes tarefas em modo de linha de comando:-
Faça o
screen
entrar em modo de cópia:Ctrl+a-: — depois, digitamos
copy
. -
Faça o
tmux
renomear a janela atual:Ctrl+b-: — depois, digitamos
rename-window
. -
Faça o
screen
fechar todas as janelas e encerrar a sessão:Ctrl+a-: — depois, digitamos
quit
. -
Faça o
tmux
dividir um painel em dois:Ctrl+b-: — depois, digitamos
split-window
. -
Faça o
tmux
eliminar a janela atual:Ctrl+b-: — depois, digitamos
kill-window
.
-
-
Quando entramos no modo de cópia no
screen
, não somente podemos usar as setas do teclado e PgUP or PgDown para navegar na janela atual e no buffer de rolagem; também há a possibilidade de usar um editor de tela completo como o vi. Usando esse editor, realize as seguintes tarefas:-
Ecoe (echo)
supercalifragilisticexpialidocious
em seu terminal descreen
:echo supercalifragilisticexpialidocious
-
Agora, copie os cinco caracteres consecutivos (da esquerda para a direita) na linha acima de seu cursor:
Para entrar no modo de cópia: Ctrl+a-[ ou Ctrl+a-: e digitamos
copy
. Daí, passamos para a linha de cima usandok
e pressionamos espaço para marcar o início da seleção. Finalmente, avançamos quatro caracteres usandol
e pressionamos espaço novamente para marcar o final da seleção. -
Finalmente, cole a seleção (
stice
) em seu prompt de comando:Ctrl+a-]
-
-
Suponha que você quer compartilhar uma sessão do
tmux
(our_session
) com outro usuário. Você criou o socket (/tmp/our_socket
) com as permissões corretas, para que você e o outro usuário possam ler e escrever. Quais são as outras duas condições para que o segundo usuário possa anexar com sucesso a sessão usandotmux -S /tmp/our_socket a -t our_session
?Ambos os usuários devem ter um grupo em comum, p. ex.
multiplexer
. Em seguida o socket também deve ser passado para esse grupo:chgrp multiplexer /tmp/our_socket
.