Eu uso o Byobu para executar diferentes processos de execução longa. Às vezes, quero parar esses processos. Eles nem sempre respondem a Ctrl-C
ou Ctrl-Z
. É possível fazer uma tecla de atalho do Byobu que apenas encontre o processo em primeiro plano em execução na janela do Byobu atualmente ativa e kill -9
ele?
Vamos utilizar
bindkey
para criar um atalho e comandos internospgrep
epkill
. Como informação/demonstração adicional, usareips
com algumas de suas opções.Vamos:
1.
ps
tem alguns parâmetros interessantes, aqueles nos quais vamos nos concentrar sãoT
,-C <command name>
e-o pid=
(sim, nada depois=
!).OBSERVAÇÃO: todo este parágrafo tem o objetivo de ser uma demonstração, uma maneira de verificar facilmente a correção da solução real no próximo.
ps T
imprime processos em execução no terminal atual . Como exemplo, criei um symlink temporário/bin/phps
para meu PhpStorm, então a execuçãophps &
abre uma instância do IDE mencionado em segundo plano. Depois de executá-lo em um terminal (>/dev/null 2>&1
adicionado para que não imprima nada,&
significa "executar em segundo plano"):(você também pode notar que o número de trabalhos em segundo plano em execução no terminal atual mudou de verde
0
para vermelho!1!
)Agora, veja como fica no segundo terminal:
Agora vamos tentar
ps -C <command name>
- colocar meu phps como um comando pesquisado:e no outro terminal temos:
Note que o segundo terminal é
pts/0
(confira a imagem anterior), mas em ambos recebemospts/1
como resultado (corretamente!) - já que é o terminal em que estamos executando nosso comando.Por causa desse comportamento, comecei com
ps T
- para que possamos capturar oPID
do processo em execução no terminal atual .O último parâmetro que eu gostaria de elaborar é
-o pid=
. É um modificador de saída que simplesmente faz aps
impressão somente de PIDs, sem o cabeçalho (primeira linha). A maneira mais fácil de explicar é sempre a maneira visual:Então - a última coisa a fazer aqui é combinar tudo acima. Vamos simplesmente usar
ps -C phps -o pid=
on a result ofps T
:e no outro terminal:
Como podemos ver, alcançamos o resultado esperado: podemos capturar o PID de um processo escolhido, mas somente se ele estiver em execução no terminal atual.
2. Minha solução real é baseada nos comandos 'pgrep' e 'pkill', pois eles se encaixam melhor, mas observe que usar os mencionados acima
ps
também funcionaria.O principal motivo para o uso
pgrep
é seu parâmetro interno-s 0
, documentado como "Corresponde apenas aos processos cujo ID de sessão do processo está listado. O ID de sessão 0 é traduzido no ID de sessão do próprio pgrep ou pkill" .Então, vamos ver em ação:
e no segundo terminal:
Como mostrado - podemos conseguir o que fizemos antes com
ps
, mas com um único comando.pkill
é irmão depgrep
, então ele pega os mesmos parâmetros. Vamos ver como funciona - no segundo terminal :Como esperado - não matou o processo, porque ele não pertence ao terminal atual. Agora para o console principal:
Então - finalmente alcançamos o resultado que queríamos. O último passo é vincular nosso comando a um atalho.
Para criá-lo para zsh usaremos o seguinte comando:
(este exemplo em particular vincula o comando à combinação CTRL+k)
Depois, basta adicioná-lo ao seu
~/.zshrc
ou/etc/zsh/zshrc
(para fornecimento global) e pronto.Bônus : Observe que
pkill
(e tambémkill
para o assunto de fato) enviaSIGTERM
sinal por padrão (se nenhum for especificado), e se seu processo aceitar outros sinais, você pode facilmente utilizá-lo usando--signal <NAME>
como um parâmetro adicional para pkill. O propósito disso é, por exemplo, fechar o processo graciosamente . Normalmente, a lista de sinais que o daemon em particular aceita é listada emman <NAME>
, naSIGNALS
seção. Exemplo deman stunnel
:A lista de sinais disponíveis pode ser facilmente acessada usando
kill -l
o comando.Então, se você quiser usar o equivalente a ie
kill -9 <PROCESS>
(que é igual akill -SIGKILL <PROCESS>
) - basta adicionar--signal SIGKILL
(ou simplesmente:-9
) ao seupkill
comando.~/bin/_byobu_kill_process.sh
:~/.bybou/keybindings.tmux
:Sim, você pode criar uma tecla de atalho Byobu personalizada para matar o processo em primeiro plano na janela Byobu atualmente ativa. Veja como você pode configurá-la:
Crie um script para matar o processo em primeiro plano Você precisará escrever um pequeno script que identifique o processo em primeiro plano na janela ativa do Byobu e envie a ele um sinal de eliminação -9.
Crie um arquivo chamado kill_foreground_process.sh no seu diretório home (ou onde você preferir):