Sinais de traps do Linux para lidar com conexão SSH perdidos / mortos

3

Eu tenho um comando em um script npm que conecta o SSH em um servidor de compilação remota e executa um script Bash. O script configura um arquivo de trava e uma chamada trap para excluir o arquivo de trava quando o script sai.

Estou cancelando a operação com ctrl + C nos dois casos.

LOCKFILEPATH="/tmp/env_app.lock"
# cleanup function just deletes $LOCKFILEPATH
function mutex() {
  if [ -f "$LOCKFILEPATH" ]; then
    echo -e "\n\n${redtext}Build already in progress! Exiting.${resettext}\n\n";
    exit 1;
  else
    touch $LOCKFILEPATH;
    trap cleanup EXIT;
  fi
}

Isso funciona bem quando você primeiro SSH no host para executá-lo, mas a armadilha não está funcionando quando você envia o comando através de SSH com

ssh hostname command

Eu tentei adicionar ao comando trap para executar mais sinais, mas estes não parecem funcionar:

 trap cleanup EXIT SIGHUP SIGKILL SIGTERM SIGINT

O que devo fazer aqui?

Também configurei um script mais simples e ele pareceu funcionar bem ao executá-lo manualmente por SSH. Talvez tenha adicionado camadas quando estou usando um script npm? O script npm é:

"deploy": "ssh HOSTNAME ''deploy-script $(git rev-parse --abbrev-ref HEAD) stage $npm_package_config_deploy_target yes''",

que apenas verifica o nome da ramificação atual e usa isso para implantar no host de compilação. O mesmo que

"deploy": "ssh HOSTNAME ''deploy-script CURRENTBRANCH stage APPNAME''",

ATUALIZAÇÃO: Adicionar uma força tty -t ao script npm parece tê-lo corrigido. Confuso desde que eu não precisei disso para o caso de script simples. Talvez eu esteja gerando muitos subprocessos no script grande (muito para colar aqui sem redigir um monte), então é necessário um tty para acionar a armadilha de limpeza.

"deploy": "ssh -t HOSTNAME ''deploy-script CURRENTBRANCH stage APPNAME''",
    
por Brian 25.01.2018 / 00:48

1 resposta

2

Quando você faz

ssh hostname command

e depois Ctrl + C , você termina o local ssh . O command ainda é executado no lado remoto, nunca recebe o pressionamento de tecla. Isso é diferente com -t . Veja esta resposta para explicação. O fragmento relevante:

On the client side, ssh will try to set the tty used by stdin to "raw" mode, and sshd on the remote host will allocate a pseudo-tty […] if you type Ctrl+C, it will be sent to the remote host, where the command will likely receive SIGINT […]. The remote sshd then closes the connection, and ssh reports Connection to remotehost closed.

Portanto, use:

ssh -t hostname command

e seu command (não o local ssh ) irá receber SIGINT quando você pressionar Ctrl + C .

Isso pode ficar ainda mais interessante. Comparar ssh + here document - o Ctrl + C chega ao lado remoto?

    
por 25.01.2018 / 01:32

Tags