Como fazer o script de inicialização imprimir “OK” somente quando todos os subprocessos são interrompidos?

2

Eu tenho um aplicativo python muito complexo. Tem seu próprio script de inicialização, mas quando eu executo:

sudo service my_service_daemon stop

Ele imprime "Parando meu_serviço_daemon [OK]", mas em subprocessos reais ainda vivos, até que eles terminem seu trabalho (eles captaram o sinal 15, mas têm que terminar algum trabalho). Então, eu quero que a mensagem "[OK]" seja impressa somente quando não houver nenhum subprocesso. Aqui faz parte do script init (roda no CentOS 6)

...

. /etc/init.d/functions 

...

stop(){
    echo -n $"Stopping $prog: "
    if [ -a $pidfile ]; then
    group_id=$(ps -o pgid= $(cat $pidfile) | grep -o [0-9]*)
    if [ ! -z $group_id ]; then
            kill -- -$group_id
        success
    fi
    else
        failure
    fi
    RETVAL=$?
    echo
    [ $RETVAL = 0 ] && rm -f $lockfile $pidfile
}
    
por Sergius 20.10.2015 / 19:50

3 respostas

1

Depois de fazer o kill -- -$group_id , espere que todos os processos terminem. Por exemplo, eu faria algo como

...
if [ ! -z "$group_id" ]; then
    kill -- -$group_id
    while pgrep -g $group_id &>/dev/null; do
        sleep 1
    done
    success
...

Isso terá pgrep de pesquisa para todos os membros do grupo de processos ( -g ) $group_id . Normalmente, ele imprimirá todos os PIDs na tela, mas não queremos vê-los, então redireciono toda a saída para /dev/null . pgrep sairá com sucesso ( 0 ) se encontrar pelo menos um processo correspondente aos critérios de pesquisa, o que manterá o loop while em andamento. Uma vez que não encontre nenhum processo, ele sairá com um "falso" ( 1 ), que sairá do loop e chegará à linha success . Para não esmagar o sistema com um loop apertado, coloquei um sleep 1 lá.

    
por 20.10.2015 / 19:59
2

Use a manipulação de processos de systemd ou use um cgroup manualmente para controlar o zoológico de decendentes. Brincadeiras com ps(1) de saída e arquivos PID são propensos a corrida, e é conhecido por levar à calvície precoce devido ao puxão de cabelo.

    
por 20.10.2015 / 21:05
1

Mantenha um arquivo aberto no aplicativo Python. Ou seja, abra-o no script de inicialização e não o feche no aplicativo.

Este arquivo pode ser o arquivo PID. Prova de conceito (sem manipulação de simultaneidade):

pidfile=/var/run/myapp.pid
logfile=/var/log/myapp.log
start () {
  sh -c 'echo $$ >"$1"; exec myapp <"$1" >/dev/null 2>"$2"' &
}
stop () {
  master_pid=$(cat "$pidfile")
  while
    case " $(fuser "$pidfile" 2>/dev/null) " in
      *" $master_pid "*)
        echo "Master process is alive, killing it"
        kill "$master_pid";;
      "  ") echo "Master process is dead and no subprocesses remain"; false;;
      *) echo "Master process is already dead but some processes remain";;
    esac
  do
    sleep 1
  done
  rm "$pidfile"
}
    
por 27.10.2015 / 00:46

Tags