+ Responder ao Tópico



  1. #1

    Question Como captar a saída de uma função/comando do linux?

    Olá amigos.

    Desenvolvi um script simples, para uma máquina que estava perdendo a rede wireless, devido a alguns problemas técnicos da placa wireless da máquina.


    #!/bin/bash

    vivo=`ping -c1 172.17.1.130 | grep received | cut -d" " -f4`

    if [ "$vivo" = 1 ]; then
    echo "AP01 NBCGIB está on-line"
    else
    echo "AP01 NBCGIB está inalcançável. Reiniciando serviço de rede"
    /etc/init.d/net.wlan0 restart
    fi



    Contudo, na man page do ping, tem essa passagem:


    ...
    If ping does not receive any reply packets at all it will exit with code 1. If a packet count and deadline are both specified, and fewer than count packets are received by the time the deadline has arrived, it will also exit with code 1. On other error it exits with code 2. Otherwise it exits with code 0. This makes it possible to use the exit code to see if a host is alive or not.
    ...



    Alguém pode me dizer como captar o exit code neste caso? .
    Porque assim, eu não preciso executar um comando que vai retornar um valor, o qual eu guardo numa variável e depois comparo. Basta executar o ping e captar o código de saída e depois comparar.
    Fiz alguns testes aqui, mas sem sucesso.

    Ab, Duca.
    Última edição por Duca; 25-11-2008 às 17:26.

  2. #2

    Padrão

    Duca, em shell script eu não sei, mas esse exit code (ou ret code) que ele se refere é pra chamadas de sistemas em linguagens de programação.

    Por exemplo, em c:


    #include <stdio.h>
    #include <stdlib.h>

    int main ()
    {
    int i;
    printf ("Testando o ping...\n");
    i=system("ping -c 172.17.1.130");
    printf ("Ret code: %d.\n",i);
    return 0;
    }



    ou em python:


    import os

    print 'testando ping...\n'
    ret = os.system('print -c 1 172.17.1.130')
    print "Ret code:",ret,"\n"



    O ret code é "acessado" pela chamada de sistema, no caso system ou os.system. Como o shell script tem acesso direto ao sistema, não sei se tem como ele obter esse retcode.

    Se quiser implementar isso em Python ou C posso te dar uma força...

    Até mais...

  3. #3

    Padrão

    Simples: $?

    O conteúdo da "variavel" " $? " é o exit code do último programa/função executada, logo:
    ping x.y.z.w
    if [ $? = 0 ]; then
    echo Beleza "campeao"!
    else
    echo Ih. Fu.."
    fi
    Última edição por candrecn; 25-11-2008 às 08:48.

  4. #4

    Arrow

    Citação Postado originalmente por candrecn Ver Post
    Simples: $?

    O conteúdo da "variavel" " $? " é o exit code do último programa/função executada, logo:
    ping x.y.z.w
    if [ $? = 0 ]; then
    echo Beleza "campeao"!
    else
    echo Ih. Fu.."
    fi

    Obrigado!
    Fiz uns testes e realmente ele guardou o exit code na variável $? .
    Desconhecia esse uso dessa variável.

    Agora, tentei guardar o exit code em uma variável comum, tipo :

    resultado=`ping -c1 172.17.1.130`



    mas este retornou:

    # echo $opa
    PING 172.17.1.130 (172.17.1.130) 56(84) bytes of data. 64 bytes from 172.17.1.130: icmp_seq=1 ttl=255 time=1.33 ms --- 172.17.1.130 ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 1.332/1.332/1.332/0.000 ms



    Existe alguma maneira de guardar o exit code em um variável, assim como o $? guarda?

    Muito obrigado, Duca.
    Última edição por Duca; 25-11-2008 às 16:13.

  5. #5

    Padrão

    Já tinha ouvido falar desse $? mas nem lembrava mais... pra manter ele joga pra dentro de outra variável. Usando seu script:


    #!/bin/bash

    # Testa a conectividade
    ping -c1 172.17.1.130 > /dev/null
    # Armazena o exit code
    vivo=$?

    # Testa condição
    if [ $vivo = 1 ]; then
    echo "AP01 NBCGIB está on-line"
    else
    echo "AP01 NBCGIB está inalcançável. Reiniciando serviço de rede"
    /etc/init.d/net.wlan0 restart
    fi

    Última edição por Duca; 25-11-2008 às 17:27.

  6. #6

    Padrão

    Ok amigos!

    A dúvida foi sanada, lembrar-me-ei do $? mais vezes.
    A partir de agora é discussão.

    Seria possível jogar a sáida de um exit code diretamente numa variável?
    Em vez jogar o valor da última função na variável $?, jogaria o valor na variável $exit_code. ??

    Vou procurar sobre isso também, fiquei curioso!

    Ab, Duca.

  7. #7

    Padrão

    hum.. eu desconheço... Mas meu conhecimento em shell script é bem básico... Talvez mexendo nas variáveis de ambiente, não sei...

    Se eu achar alguma coisa posto aqui...