A saída no script de shell não funciona porque está saindo do script, não do shell. Para sair do shell após o script ser concluído
ssh user@ipaddress '~/my_script.sh && exit'
Isso executará o script e sairá do shell.
Estou lançando um script distante por SSH assim:
ssh user@ipaddress '~/my_script.sh'
Tudo está indo bem, mas quando o script terminar, a conexão não será fechada. Eu Tem que pressionar CTRL-C para quebrar 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 estiver pronto?
(modificação para esclarecimento :) 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 eu o inicio através do SSH, ele é executado e, no final, eu leio "Tudo pronto." então isso significa que ele alcança as últimas 2 linhas .
Alguma idéia de como eu poderia fazer para fechar automaticamente e pr
A conexão ssh permanece aberta quando o processo iniciado por ssh (aqui, um shell) é encerrado, se houver outros processos que ainda estejam sendo usados. Eu 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:
ssh somehost 'sleep 5 &' # exits after 5 seconds
ssh somehost 'sleep 5 >/dev/null &' # exits immediately seconds
Quando você inicia um daemon, você deve contextualizá-lo e fechar seus descritores de arquivo. Pelo menos, use isso:
./qaswvd </dev/null >/dev/null 2>/dev/null &
Você pode querer adicionar nohup
na frente; não fará diferença aqui, mas seria útil se o script fosse executado a partir de um terminal. Muitos programas projetados para atuar como daemon possuem opções de linha de comando para obtê-los, separar descritores de arquivos, ignorar sinais e outras sutilezas. Verifique na documentação qaswvd
se ela tiver um. Você também pode investigar os utilitários "daemonizer".
Eu vi este post quando pesquisei pela solução da mesma situação. Embora seja meio tarde para resolver o problema do @ Oliver, já que a resposta aceita claramente não estava funcionando nem para o OP nem para mim (não sei por que ele é aceito), eu ainda gostaria de postar minha própria solução para o futuro googler. É simples: adicione uma opção -f
no comando ssh
:
ssh -f user@ipaddress '~/my_script.sh'
O efeito da opção -f
é colocar ssh
em segundo plano, portanto, sem nenhuma outra opção adicional, é possível que a conexão ainda esteja ativa, mesmo que pareça estar quebrada. Pode-se referir a resposta dada em outro post neste site se estiver interessado.
Como Ignacio, estou curioso para saber o que está no seu roteiro.
Talvez você possa tentar reduzir seu script ao menor exemplo possível que produza a condição de erro.
Ou inicie a partir de um script vazio e adicione um comando por vez até ver o problema, então você saberá qual comando faz com que seu script seja bloqueado.
Se o script vazio causar um problema, talvez você queira investigar a configuração do ssh, por exemplo, .bash_logout ou algo assim chamado na saída que pode causar um problema?
Você provavelmente pode usar trabalhos no seu script. Se for esse o caso, o shell apenas espera que seus trabalhos sejam concluídos e não deseja se soltar.
Eu não vou repostar, apenas o encaminharei link
Você precisará matar seu processo pai de dentro do seu script.
kill -SIGHUP $PPID
O problema é provavelmente a seguinte linha.
./qaswvd &
Este comando provavelmente ainda está em execução e manterá o canal ssh aberto até stdin e stdout & stderr está fechado.
Use isso:
./qaswvd </dev/null >/dev/null 2>&1 &
Tags ssh bash shell-script