+ Responder ao Tópico



  1. #1

    Question Monitoramento de processos (duplicação de processos)

    Um amigo meu fez um scriptzinhu pra mim e funcionou perfeitamente para rodar as rádios!

    Veja o script:
    radio.sh
    Código :
    #!/bin/sh
     
    PORTAS="8110 8112 8114"
     
    # nao alterar a partir daqui
    for PORTA in $PORTAS
    do
            VAR=`ps aux | grep "sc_serv $PORTA.conf" | wc -l`
     
            echo -n "Shoutcast na $PORTA: "
            if [ $VAR -eq 2 ]; then
                    echo "OK"
            else
                    echo "OFF"
                    date
                    echo "- Colocando para rodar..."
                    cd /home/shoutcast/
                    ./sc_serv $PORTA.conf > /var/log/shoutcast.log &
            fi
            echo ""
    done
    Copiei o mesmo código e só modifiquei o comando e estou tendo problemas com uma multiplicação dos processos.
    Ele roda vários processos iguais "./sc_autodj 8110.adj" e tbm com os outros de portas diferentes.

    autodj.sh
    Código :
    #!/bin/sh
     
    PORTAS="8110 8112"
     
    # nao alterar a partir daqui
    for PORTA in $PORTAS
    do
            VAR=`ps aux | grep "sc_autodj $PORTA.adj" | wc -l`
     
            echo -n "Auto-DJ na porta $PORTA: "
            if [ $VAR -eq 2 ]; then
                    echo "OK"
            else
                    echo "OFF"
                    date
                    echo "- Colocando para rodar..."
                    cd /home/shoutcast/
                    ./sc_autodj $PORTA.adj > /var/log/shoutcast.log &
            fi
            echo ""
    done
    Ele roda os 2 script a cada 20 minutos, para que eles verifiquem se as rádios e autodjs estão funcionando perfeitamente. Se não estiverem, ele executa novamente:
    Código :
    0,20,40 * * * * /home/shoutcast/radio.sh > /dev/null 2>&1
    0,20,40 * * * * /home/shoutcast/autodj.sh > /dev/null 2>&1
    Por algum motivo ele ta executando os "autodj" novamente, mesmo eles funcionando.
    Se eu rodar o comando manualmente, ele não executa esses vários processos.

    Alguém saberia me dizer o que poderia ser?

  2. #2

    Padrão

    Na linha:

    Código :
    if [ $VAR -eq 2 ]; then

    Tente trocar o 2 por 1 e veja se resolve o problema.

    Até!

  3. #3

    Question

    Se eu alterar o 2 pelo 1, vai mudar a ordem da lógica do IF. Deveria ficar assim então né?

    Código :
    #!/bin/sh
     
    PORTAS="8110 8112"
     
    # nao alterar a partir daqui
    for PORTA in $PORTAS
    do
            VAR=`ps aux | grep "sc_autodj $PORTA.adj" | wc -l`
     
            echo -n "Auto-DJ na porta $PORTA: "
            if [ $VAR -eq 1 ]; then
                    echo "OFF"
                    date
                    echo "- Colocando para rodar..."
                    cd /home/shoutcast/
                    ./sc_autodj $PORTA.adj > /var/log/shoutcast.log &
            else
                    echo "OK"
            fi
            echo ""
    done

    Gostaria que o crontab executasse isso a cada 5 min, ficaria assim? :
    Código :
    0-59/5 * * * * sh /home/shoutcast/autodj.sh > /dev/null 2>&1

    Abraços e obg pela atenção!

  4. #4

    Padrão

    Geralmente, esses problemas estão relacionados com a variável PATH. Quando você roda o comando manualmente, o script recebe a variável do ambiente. Já no caso do cron, ele não possui a variável PATH definida. O que deve estar acontecendo é que os comando "ps", "grep" e "wc" não estão sendo encontrados, e VAR está recebendo um valor arbitrário diferente de 2, ocasionando que ele sempre entrará na clausula else. Tende trocar as chamadas relativas aos comando por chamadas a endereços absolutos. Ex: "ps" por "/usr/bin/ps". Acho que deve resolver.

  5. #5

    Padrão

    Vamos fazer o seguinte... é difícil fazer alteração em um script sem saber o que o script espera encontrar. Tenha certeza de que os dois scripts estão rodando e manda o resultado dos seguintes comandos:

    Código :
    # ps -aux | egrep "(sc_autodj|sc_serv)"

    Código :
    # pidof sc_autodj
    # pidof sc_serv

    Até!

  6. #6

    Thumbs up Resultado dos testes

    Abaixo os resultados:
    Código :
    [root@servidor4 ~]# ps -aux | egrep "(sc_autodj|sc_serv)"
    Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.7/FAQ
    root      1812  0.2  0.4  39632  3536 ?        Sl   Aug25   2:01 ./sc_serv 8110.conf
    root      1867  2.6  0.5  22320  4420 ?        Sl   Aug25  18:55 ./sc_autodj 8110.adj
    root      3166  0.2  0.3  30568  2736 ?        Sl   Aug24   7:37 ./sc_serv 8112.conf
    root      3176  0.2  0.3  30564  2536 ?        Sl   Aug24   6:38 ./sc_serv 8114.conf
    root     18361  2.6  0.5  22200  4380 ?        Sl   Aug25  19:18 ./sc_autodj 8112.adj
    root     30008  0.0  0.1   2996   796 pts/2    S+   00:24   0:00 egrep (sc_autodj|sc_serv)
    [root@servidor4 ~]# pidof sc_autodj
    18361 1867
    [root@servidor4 ~]# pidof sc_serv
    3176 3166 1812

    Esses resultados estão corretos agora, pois eu tinha feito a alteração sugerida do PATH correto no código e alterado a ordem da lógica do IF. Meu código está assim:
    Código :
    #!/bin/sh
     
    PORTAS="8110 8112"
     
    # nao alterar a partir daqui
    for PORTA in $PORTAS
    do
            VAR=`/bin/ps aux | /bin/grep "sc_autodj $PORTA.adj" | /usr/bin/wc -l`
     
            echo -n "Auto-DJ na porta $PORTA: "
            if [ $VAR -eq 1 ]; then
                    echo "OFF"
                    echo "...Colocando para rodar..."
                    cd /home/shoutcast/
                    ./sc_autodj $PORTA_trans.conf > /var/log/shoutcast.log &
            else
                    echo "OK"
            fi
            echo ""
    done

    Quando eu rodo o arquivo manualmente:
    Código :
    [root@servidor4 ~]# sh /home/shoutcast/autodj.sh
    Auto-DJ na porta 8110: OK
     
    Auto-DJ na porta 8112: OK

    Só me confirme se o comando do crontab está correto (verificar a cada 5 minutos):
    Código :
    0-59/5 * * * * sh /home/shoutcast/autodj.sh > /dev/null 2>&1

    Creio que o meu problema esteja resolvido, pois não houve mais uma multiplicação dos processos.

  7. #7

    Padrão

    Você já tentou matar um dos processos e rodar o script para ver se ele vai subir novamente só aquele processo?

    Quanto ao crontab, está certo sim... tanto pode ser o 0-59/5 como pode ser */5

    Até!

  8. #8

    Padrão

    Galahad,

    sim, já matei um processo e rodei manualmente e não funcionou! Assim como já matei processo e deixei o crontab levantar o processo automaticamente e também não funcionou (AUTODJ).

    PS.: Substitui o 0-59/5 pelo */5

    O que poderia ser agora?

    -EDIT-

    Retirei a parte do comando "> /var/log/shoutcast.log &" e agora ele ta exibindo o erro. O autodj está informando que não foi passado nenhum arquivo de configuração pra ser utilizado.

    Como se o comando estivesse indo apenas o seguinte "./sc_autodj" em vez de "./sc_autodj 8110.adj" por exemplo.

    Verifiquei o script e achei o erro no comando que está assim: "./sc_autodj $PORTA_trans.conf" e deveria ser "./sc_autodj $PORTA.adj"

    Vou deixar tudo rodando aqui automaticamente pra ver o resultado e qualquer problema eu volto a informá-los.
    Última edição por ThOhT; 26-08-2009 às 02:11.