env : centos7, lang : bash
insira a descrição da imagem aqui
Se eu chamar wasctl
de um servidor remoto, ssh remote1 "./wasctl start"
ele trava para sempre depois de executar todos os trabalhos com êxito.
Acontece que minha chamada ssh estava aguardando um loop while mesmo que o loop fosse executado em segundo plano.
restartwas_start.sh
1 #!/bin/sh
2 INTERVAL=10
3 LOG_TIME=`date +'%Y-%m-%d-%H:%M:%S'`
4 RESTARTWAS_PID=`ps -ef|grep "restartwas.sh"| grep -v grep|awk '{print $2}'`
5 if [ -z ${RESTARTWAS_PID} ]; then
6 nohup ./restartwas.sh &
7 fi
restartwas.sh
1 #!/bin/sh
2 INTERVAL=5
3 while true
4 do
5 sleep $INTERVAL
6 LOG_TIME=`date +'%Y-%m-%d-%H:%M:%S'`
7 ONLINE_JAVA_PID=`ps -ef|grep java|grep "instance.name"|grep -v grep|awk '{print $2}'`
8 if [ -z ${ONLINE_JAVA_PID} ]; then
9 echo $LOG_TIME" was down"
10 echo $LOG_TIME" was restart start"
11 ./wasctl start
12 while true
13 do
14 START_JAVA_PID=`ps -ef|grep java|grep "instance.name"|grep -v grep|awk '{print $2}'`
15 if [ -n ${START_JAVA_PID} ]; then
16 break;
17 fi
18 sleep 1
19 done
20 echo $LOG_TIME" was restart stop"
21 fi
22 done
Se eu não ligar restartwas_start.sh
a ligação remota termina normalmente.
Como executo o shell de loop em segundo plano e ainda encerro a chamada normalmente?
Em restartwas_start.sh:
6 nohup ./restartwas.sh &
Faça:
6 nohup ./restartwas.sh < /dev/null >& XXXX &
Aqui XXXX pode ser /dev/null, nesse caso você não obterá as saídas de eco.
Ou XXXX pode ser /tmp/my_was_script.log ou algo semelhante, onde as saídas de eco serão capturadas.
Isso deve funcionar.
O problema é que o ssh não estava saindo porque os processos iniciados pelo nohup (restartwas.sh e os vários comandos nesse script) ainda estavam usando o STDIN STDOUT & STDERR comum e o ssh estava esperando por EOF neles.
Ao redirecionar esses 3 para /dev/null ou para algum arquivo, garantimos que o ssh não fica esperando.
Referência:
http://www.snailbook.com/faq/background-jobs.auto.html
https://www.gnu.org/software/bash/manual/html_node/Redirections.html