script init terminando com a sessão ssh

2

Precisamos executar o pt-stalk em alguns servidores para Fique de olho no mySQL, e estava cansado de iniciá-lo manualmente toda vez que o servidor fosse reinicializado. Um pequeno googling apareceu em um script de inicialização para o pt E parecia funcionar muito bem. [minha versão ligeiramente modificada incluída no final deste post]

Estava demorando muito para descobrir como empurrar o script e a configuração para fora via ssh [longa história, por favor não pergunte] então decidi entrar nos 20 servidores e configurar tudo manualmente e tudo trabalhado.

Alguns dias depois, meu colega de trabalho comentou que estava recebendo os e-mails, mas eu claramente não estava, e parecia que eu havia colocado o e-mail errado na configuração. Desta vez eu tinha descoberto como empurrar a mudança via ssh, e terminei tudo com:

for server in 'cat serverlist.txt'; do
  ssh -t $server sudo -i service pt-stalk restart
done

E este é o ponto em que o pt-stop parou de funcionar em todos os servidores com:

2013_08_23_11_43_20 Caught signal, exiting
2013_08_23_11_43_20 Exiting because OKTORUN is false
2013_08_23_11_43_20 /usr/bin/pt-stalk exit status 1
2013_08_23_11_43_22 Starting /usr/bin/pt-stalk --function=status --variable=Threads_connected --threshold=100 --match= --cycles=5 --interval=1 --iterations= --run-time=30 --sleep=300 --dest=/var/lib/pt-stalk --prefix= [email protected] --log=/var/log/pt-stalk.log --pid=/var/run/pt-stalk.pid
2013_08_23_11_43_22 Caught signal, exiting

Durante o teste de ontem, eu decifrei que 'Sinal recebido, saindo' significa que foi detectado um HUP / TERM / KILL . O primeiro é de service pt-stalk restart , e o de segundo imediatamente após o início de sucesso é de quando a sessão ssh é fechada. wat.jpg

Se eu simplesmente enviar um ssh para o servidor, digite sudo -i service pt-stalk start ou restart . Eu posso sair e ele continua feliz. No entanto, se eu apenas alimentar um comando para o ssh como o loop acima, use um sinal e saia. Às vezes, ele captura dois sinais antes de sair.

Que diabos está acontecendo?

Meu /etc/init.d/pt-stalk para referência:

#!/usr/bin/env bash
# chkconfig: 2345 20 80
# description: pt-stalk
### BEGIN INIT INFO
# Provides: pt-stalk
# Required-Start: $network $named $remote_fs $syslog
# Required-Stop: $network $named $remote_fs $syslog
# Should-Start: pt-stalk
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
### END INIT INFO

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON="/usr/bin/pt-stalk"
DAEMON_OPTS="--config /etc/pt-stalk.conf"
NAME="pt-stalk"
DESC="pt-stalk"
PIDFILE="/var/run/${NAME}.pid"
STALKHOME="/var/lib/pt-stalk"

test -x $DAEMON || exit 1

[ -r /etc/default/pt-stalk ] && . /etc/default/pt-stalk

#. /lib/lsb/init-functions

sig () {
    test -s "$PIDFILE" && kill -$1 'cat $PIDFILE'
}

start() {
  if [[ -z $MYSQL_OPTS ]]; then
HOME=$STALKHOME $DAEMON $DAEMON_OPTS
  else
HOME=$STALKHOME $DAEMON $DAEMON_OPTS -- $MYSQL_OPTS
  fi
return $?
}

stop() {
  if sig TERM; then
    while sig 0 ; do
      echo -n "."
      sleep 1
    done
    return 0
  else
    echo "$DESC is not running."
    return 1
  fi
}

status() {
  if sig 0 ; then
    echo "$DESC ('cat $PIDFILE') is running."
    return 0
  else
    echo "$DESC is stopped."
    return 1
  fi
}

log_begin_msg() {
        echo $1
}

log_end_msg() {
        if [ $1 -eq 0 ]; then
                echo "Success"
        else
                echo "Failure"
        fi
}

case "$1" in
  start)
   log_begin_msg "Starting $DESC"
   start
   log_end_msg $?
   ;;

  stop)
   log_begin_msg "Stopping $DESC"
   stop
   log_end_msg $?
   ;;
  status)
    status ;;

  restart)
    log_begin_msg "Restarting $DESC"
    stop
    sleep 1
    start
    log_end_msg $?
    ;;

  *)
    echo "Usage: $0 {start|stop|status|}" >&2
    exit 1
    ;;
esac
    
por Sammitch 28.08.2013 / 19:03

1 resposta

0

Como seu daemon é encerrado de uma vez, tenho certeza de que, se a opção --daemonize for dada a /usr/bin/pt-stalk , talvez não feche um dos descritores de arquivo stdin , stdout ou stderr corretamente e cedo o suficiente ou / e não manipula corretamente o sinal SIGHUP .

Para testar qual das minhas suposições está correta, modifique seu script init para que a entrada e a saída de start sejam redirecionadas de e para /dev/null . Exemplo:

start </dev/null >/dev/null 2>/dev/null

Se isso remover o problema de encerramento antecipado, reduza esses redirecionamentos um após o outro novamente. Pode ser que pt-stalk simplesmente bifurque para início . Nesse caso, inserir outro sleep 1 após a chamada para start também poderá contornar isso. Se o problema for lidar com o sinal SIGHUP , também poderá ser uma solução alternativa modificar o script init , adicionando o seguinte:

trap "echo SIGHUP ignored" 1

antes da chamada para start e isto:

trap - 1

logo após a chamada para start .

Eu não baixei pt-stalk e não investiguei e não testei minha teoria descrita acima. Isso foi tudo das minhas experiências com outros daemons.

    
por 03.02.2014 / 08:39