O script de inicialização pode ser executado várias vezes, apesar do arquivo pid

1

O motivo pelo qual estou fazendo este script é porque quero daemonizar o supervisord: neste momento estou em um host na nuvem no qual não tenho acesso ao comando /etc ou sudo ; esse script é minha melhor tentativa de fazer tudo do meu /home . Eu tenho esse script bash com o comando start-stop-daemon , mas ele permite que eu execute várias vezes, e gostaria que fosse executado apenas uma vez. Até agora, aqui está o que eu tenho:

#! /bin/bash 
SUPERVISORD=/usr/local/bin/supervisord
PIDFILE=/home/user/supervisor/supervisord.pid
OPTS="-c /home/user/supervisor/supervisord.conf -j $PIDFILE"

test -x $SUPERVISORD || exit 0

. /lib/lsb/init-functions

export PATH="${PATH:+$PATH:}/usr/local/bin:/usr/sbin:/sbin"

case "$1" in
start)
    log_begin_msg "Starting Supervisor daemon manager..."
    start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $SUPERVISORD -- $OPTS || log_end_msg 1
    log_end_msg 0
    ;;

stop)
    log_begin_msg "Stopping Supervisor daemon manager..."
    start-stop-daemon --stop --quiet --oknodo --pidfile $PIDFILE || log_end_msg 1
    log_end_msg 0
    ;;

restart|reload|force-reload)
    log_begin_msg "Restarting Supervisor daemon manager..."
    start-stop-daemon --stop --quiet --oknodo --retry 30 --pidfile $PIDFILE
    start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $SUPERVISORD -- $OPTS || log_end_msg 1
    log_end_msg 0
    ;;

*)
    log_success_msg "Usage: {start|stop|reload|force-reload|restart}"
    exit 1
    ;;
esac

exit 0

Eu assumo que quando o arquivo pid é criado ele sobrescreve o anterior, então fazer múltiplas paradas também não funciona. Como posso fazer este script apenas executar uma vez e não executar vários processos se eu fizer "script de início" 5 vezes? Deve reclamar dizendo que o processo já está em andamento.

    
por ocespedes 06.05.2014 / 23:07

1 resposta

0

Eu descobri qual era o problema, meu script não estava verificando se o processo já estava em execução, por isso começou apenas o processo que você executou, mas adicionando:

    if [ -f $PIDFILE ]; then
      echo "supervisord already running: $PIDFILE" 
      exit 1 
    fi

no caso start) resolveu meu problema, isso verifica se o supervisord gerou seu respectivo arquivo .pid e, se existir, não faz nada.

    
por ocespedes 09.05.2014 / 04:36