Estou lançando um script distante através do SSH assim:
ssh user@ipaddress '~/my_script.sh'
Tudo está indo bem, mas depois que o script é concluído, a conexão não é fechada. Eu tenho que pressionar CTRL-C para interromper a conexão atual.
Eu tentei o comando "exit" em '~ / my_script.sh' e é inútil. Eu tentei o comando "logout" em '~ / my_script.sh' e recebo uma mensagem:
logout: not login shell: use exit
...
Alguma idéia de como eu poderia fazer para fechar automaticamente e corretamente o SSH depois que o script for concluído?
(Modificação para esclarecimentos :) Aqui está o que está dentro do meu script:
#!/bin/sh
path_sources_qas=/sources/QuickAddress/
path_qas_bin=/usr/bin/qas
umount_disque_qas()
{
# Umount du disque 'qas' s'il n'avait pas été 'umount' :
nom_disque_monte=`cat /etc/mtab | grep qas | awk '{ print $2}'`
if [ "$nom_disque_monte" != "" ]
then
echo "For safety, umount : $nom_disque_monte"
umount $nom_disque_monte
fi
}
# Umount twice (we never know if a st***d guy mounted it twice) :
umount_disque_qas
umount_disque_qas
echo "--------------------------------"
echo "Install ISO quick address..."
nom_fichier_iso=`ls -t $path_sources_qas | awk '{if (NR==1) {print $1}}'`
echo "Mount disk $nom_fichier_iso..."
mount -o loop -t iso9660 $path_sources_qas/$nom_fichier_iso /mnt/qas
echo "Done."
# All the folders are like this :
# /usr/bin/qas/Data.old.10
# /usr/bin/qas/Data.old.11
# /usr/bin/qas/Data.old.12
# ...
echo "--------------------------------"
echo "Stopping QuickAdress server..."
cd $path_qas_bin/apps/
./wvmgmtd shutdown qaserver:2021
sleep 3
echo "Done."
# Get last number of the folder:
num_dernier_dossier_backup=`ls -Atd $path_qas_bin/Data.old* | awk '{if (NR==1) {print $1}}' | awk -F . '{print $NF}'`
# Add 1 :
let "num_dernier_dossier_backup += 1"
# Full name :
nom_dossier_backup=Data.old.$num_dernier_dossier_backup
echo "--------------------------------"
echo "Saving Data to $nom_dossier_backup..."
cd $path_qas_bin
mv Data $nom_dossier_backup
echo "Done."
echo "--------------------------------"
echo "Copying new folder Data..."
cd $path_qas_bin
cp -r /mnt/qas/Data .
echo "Done."
echo "--------------------------------"
echo "Deleting unused datas..."
cd $path_qas_bin/apps/
rm -f $path_qas_bin/Data/frxmos.dap
echo "Done."
echo "--------------------------------"
echo "Restart server..."
cd $path_qas_bin/apps/
./qaswvd &
sleep 3
echo "Done."
sleep 3
echo "--------------------------------"
echo "Check: server state: you should read 'OK':"
./wvmgmtd srvlist
echo "Done."
echo "--------------------------------"
echo "Check: active licences (only one here):"
./wvmgmtd licencelistread qaserver:2021
echo "Done."
echo "--------------------------------"
echo "Check: counters: number of addresses left:"
./wvmgmtd counterinforead qaserver:2021
echo "Done."
echo "--------------------------------"
echo "Check: Datasets avalaibles:"
./wvmgmtd datalistread current qaserver:2021
echo "Done."
echo "--------------------------------"
echo "Check: "meters" for "licence by click":"
./wvmgmtd meterslistread current qaserver:2021
echo "Done."
echo "--------------------------------"
echo "Removing virtual disk..."
umount_disque_qas
echo "Done."
echo "All done"
echo "Click 'Ctrl-C' to quit."
exit
Quando o inicio através do SSH, ele é executado e, no final, eu leio "Tudo pronto". então isso significa que ele atinge as duas últimas linhas .
Alguma idéia de como eu poderia fazer para fechar automaticamente e pr
fonte
~/.ssh/config
, tente sem ele e passe as opções-a -x
(e não-o
)ssh
para garantir que não haja encaminhamento. Se ainda assim não funcionar, mostre o conteúdo do script.ssh <yourusername>@localhost '(ls; sleep 10 &); echo Done; jobs'
irá listar arquivos, exibir pronto e aguardar 10 segundos antes de retornar.Respostas:
A saída no script do shell não funciona porque está saindo do script, não do shell. Para sair do shell após a conclusão do script, faça
Isso executará o script e sairá do shell.
fonte
sshd
e o shell em execuçãomyscript.sh
. O queexit
você escreveu atuará quando o script sair, o que não ajuda. A única maneira de sua solução funcionar é se o script faz algo bizarro quando seu pai ésshd
e não faz essa coisa bizarra quando seu pai é um shell.~/my_script.sh && exit
sai assim que~/my_script.sh
sai. Se o script do shell não sair, seu comando nunca chegará ao pontoexit
. Então é apenas inútil.A conexão ssh permanece aberta quando o processo iniciado pelo ssh (aqui, um shell) termina, se houver outros processos que ainda a estejam usando. Não sei as regras exatas que o daemon ssh segue, mas uma conexão está em uso, pelo menos, se a saída padrão de qualquer processo filho ainda estiver conectada ao pipe original fornecido pelo ssh. Comparar:
Ao iniciar um daemon, você deve colocá-lo em segundo plano e fechar seus descritores de arquivo. Pelo menos, use isto:
Você pode adicionar
nohup
na frente; não fará diferença aqui, mas seria útil se o script fosse executado em um terminal. Muitos programas projetados para agir como daemon têm opções de linha de comando para fazer com que bifurcem, fechem descritores de arquivos, ignorem sinais e outros detalhes. Verifique naqaswvd
documentação se ela possui uma. Você também pode investigar os utilitários do "daemonizer".fonte
Vi este post quando pesquisei a solução da mesma situação. Embora seja meio tarde para resolver o problema de @ Oliver, já que a resposta aceita claramente não estava funcionando para o OP ou para mim (não sei por que ela foi aceita), eu ainda gostaria de postar minha própria solução para futuros googler. É simples: adicione uma
-f
opção nossh
comando:EDITAR
O efeito da
-f
opção é colocarssh
em segundo plano, portanto, sem nenhuma opção adicional adicionada, é possível que a conexão ainda esteja viva, mesmo que pareça que está quebrada. Pode-se consultar a resposta dada em outro post neste site, se estiver interessado.fonte
Como Ignacio, estou curioso para saber o que está no seu script.
Talvez você possa tentar reduzir seu script ao menor exemplo possível que produz a condição de erro.
Ou comece com um script vazio e adicione um comando de cada vez até ver o problema, para saber qual comando faz com que seu script seja bloqueado.
Se o script vazio causar um problema, você pode investigar sua configuração ssh, por exemplo, é .bash_logout ou algo chamado na saída que pode causar um problema?
fonte
Você provavelmente pode usar trabalhos em seu script. Se for esse o caso, o shell apenas espera que seus trabalhos sejam concluídos e não deseja se desconectar.
Não vou repostar, apenas encaminhá-lo-á http://en.wikipedia.org/wiki/Nohup#Existing_jobs
fonte
nohup
não é diretamente o problema aqui, pois não há terminal no lado do servidor: acho que o culpado é especificamente o descritor de arquivo aberto.Você precisará matar o processo pai de dentro do seu script.
kill -SIGHUP $PPID
fonte
O problema provavelmente é a seguinte linha.
Este comando provavelmente ainda está em execução e manterá o pipe ssh aberto até que stdin e stdout & stderr sejam fechados.
Use isto:
fonte