Tenho um script do PowerShell a partir do qual estou executando o seguinte comando:putty.exe -ssh user@srv -pw password -m Execute_Command_File -t
Durante o script, tailf /dir/log/
o comando é gravado em Execute_Command_File. Após a execução do script, a sessão solicitada é aberta e tailf
funciona.
O problema, quando tento sair de tailf
(ctrl+C), ele fecha o terminal.
Tentei adicionar /bin/bash
no final de Execute_Command_File
, não ajudou. E claro que tentei tail -f/F
, também não funcionou...
Alguma ideia?
Responder1
Acontece que tail
morre por causa do CTRL+C mas também é enviado (SINGINT) para o pai, bash
. Como por padrão o bash morre ao receber tal sinal, você deve substituir o comportamento padrão de bash
quando o recebe.
Usararmadilhacomando interno de bash(1)
para mudar isso.
O script a seguir tailf-ctrl.sh
é uma demonstração e mostra a resposta:
#!/bin/bash
function finish {
echo "CTRL-C pressed!"
}
F=testfile
echo hello > $F
# set custom action
trap finish SIGINT # comment this to see the problem
tail -f $F
# reset default action
trap - SIGINT
echo "Hello after" > after
cat after
Observe que:
- SIGINTé o sinal relacionado a CTRL+C
- primeiroarmadilhainstale uma ação personalizada relacionada ao sinal SIGINT
- segundoarmadilharedefinir o comportamento padrão do sinal SIGINT
A saída do script é:
$ bash tailf-ctrl.sh
hello
^CCTRL-C pressed!
Hello after
isso mostra que o segundo arquivo foi gravado de forma que o final do script seja alcançado quando tail
morrer por causa do arquivo CTRL-C
.
se você comentar o primeiro comando trap, verá que seu problema aparece: o bash termina imediatamente e a saída deve ser:
$ bash tailf-ctrl.sh
hello
^C
$