Mate um processo suspenso?

16

Eu estava um pouco confuso com:

% vim tmp
zsh: suspended   vim tmp
% kill %1
% jobs
[1]  + suspended   vim tmp
% kill -SIGINT %1
% jobs
[1]  + suspended   vim tmp
% kill -INT %1
% jobs
[1]  + suspended   vim tmp

Por isso, resignei-me a apenas "fazer eu mesmo" e pergunto-me porquê mais tarde:

% fg
[1]  - continued   vim tmp
Vim: Caught deadly signal TERM
Vim: Finished.
zsh: terminated   vim tmp
%

Oh!

Faz sentido, agora que penso nisso, que vim precisa estar em execução para que o manipulador de sinal seja instruído a sair e fazer isso.

Mas obviamente não é o que eu pretendia.

Existe uma maneira de "acordar e sair" em um único comando? ou seja, um alias interno para kill %N && fg %N ?

Por que a retomada em segundo plano não funciona? Se eu bg em vez de fg , o Vim permanece vivo até eu fg , o que quebra minha intuição acima.

    
por OJFord 15.08.2015 / 18:43

2 respostas

16

vi-vi-vi é do diabo. Você deve matá-lo com fogo. Ou SIGKILL :

kill -KILL %1

O kill s incorporado tem a gentileza de enviar SIGCONT para processos suspensos, para que você não precise fazer isso sozinho, mas isso não ajudará se o processo bloquear o sinal que você está enviando ou se manipular o sinal faz com que os processos fiquem suspensos novamente (se um processo em segundo plano tentar ler a partir do terminal, por padrão, será enviado SIGTTIN , que suspende o processo se não for manipulado).

    
por 15.08.2015 / 19:22
6

vim está instalando manipuladores de sinais (e provavelmente configurando também sigprocmask(2) ) para ignorar os sinais comuns, de modo que os arquivos que estão sendo editados não sejam perdidos devido a um sinal de controle de dispersão + c ou aleatório. Um programa mais simples é morto:

% cat busyloop.c
int main(void) {
for (;;) { ; }
return 0;
}
% make busyloop
cc     busyloop.c  -o busyloop
% ./busyloop
^Z
zsh: suspended  ./busyloop
% kill %1
%
[1]  + terminated  ./busyloop

Fazer vim exit (com segurança) exigiria um manipulador de sinal em vim que aceita TERM ou USR1 ou algo assim, salva (ou descarta?) qualquer buffer, etc. O que você está tentando fazer para precisa fazer vim sair assim?

    
por 15.08.2015 / 19:01