+ Responder ao Tópico



  1. #1

    Padrão script como servico

    gostaria de colocar um script como se fosse um servico do sistema...

    eh um script que a cada 30 segundos faz uma função

    mas o problema eh que eu jah coloquei ele em background mas ao fechar o terminal ele para

    queria que o script funcionasse como se fosse um bin ou semelhante.

    e só parasse quando eu abrir o console e digitar o comando stop dele

    ex...
    /pasta/script stop

    ae ele abre o pid do script e dah um kill pid

    ate ai eu consigo fazer

    mas oque eu nao estou conseguindo mesmo eh fazer com que ele execute sem que o terminal esteje aberto


    isso é oque ele tem que rodar

    Código :
     
    #!/bin/bash
    PIDFILE=/softov/so.pid
    echo $$ > $PIDFILE
    while true
    do
    /usr/bin/php -q << PHP
    <? include("/softov/desloga.php"); ?>
    PHP
    sleep 30
    done
    exit 0

  2. #2

    Padrão

    é melhor fazer algumas pequenas modificações e deixar o micro trampar pra vc. Crie uma entrada no seu crontab:

    */2 * * * * /home/softov/onde_esta_seu_sh

    o seu sh será modificado levemente para:
    #!/bin/bash
    PIDFILE=/softov/so.pid
    echo $$ > $PIDFILE
    if [ -f /path/teste.txt ]; then ##---> atenção
    /usr/bin/php -q << PHP
    <? include("/softov/desloga.php"); ?>
    PHP
    fi ##--> termina aqui

    bem, como vc faz:

    suponha que o "path", ali no if seja /home/seu_nome/algum_lugar

    touch /home/seu_nome/algum_lugar/teste.txt (troque o nome para alguma coisa que faça sentido pra vc, mas NÃO ESQUEÇA de altera-lo no script)

    enquanto o "/home/seu_nome/algum_lugar/teste.txt" existir, o seu script será executado então, para paralizar sua atuação basta:

    rm -fv /home/seu_nome/algum_lugar/teste.txt

    pronto. O script será executado a cada 30 segundos, dia e noite. Se o "teste.txt" existir EXECUTA seus comandos senão aguarda 30 segundos para verificar novamente.

    divirta-se.
    Última edição por irado; 29-04-2009 às 11:37. Razão: correção do cron-script para */2 (30 seg)

  3. #3

    Padrão

    jah consegui resolver este problema.....


    nao vou usar contrab pois o funcionamento sairia da logica que eu quero que é a de o usuário quando for usar o sistema apenas digite

    /pasta/dosistema/script start

    e ele jah faz tudo, não sendo nescessária nem mesmo a configuração ou entradas de codigo no contrab.

    pois o mesmo eu fiz com o mrtg, o usuário nao precisa colocar ele no contrab....

    segue o codigo

    script start | status | stop | restart

    Código :
    #!/bin/bash
     
     
    NAME="script_desloga"
     
    DESC="Verificação de usuários"
     
    EXEC_FILE="/softov/scripts/${NAME}"
    PID_FILE="/softov/scripts/pids/${NAME}.pid"
    RM="/bin/rm"
     
    start() {
        echo -n "Iniciando $DESC: "
        start-stop-daemon --start --quiet --background \
            --name ${NAME} --make-pidfile \
            --pidfile ${PID_FILE} --startas ${EXEC_FILE}
        echo "pronto."
    }
     
    stop() {
        echo -n "Parando $DESC: "
        start-stop-daemon --stop --quiet --name ${NAME} --pidfile ${PID_FILE}
        ${RM} -f ${PID_FILE}
        echo "pronto."
    }
     
    status(){  
        echo -n "Status de $DESC: "  
        if [ ! -r "$PID_FILE" ]; then  
        echo "$NAME nao esta rodando."  
            exit 3  
        fi  
        if read pid < "$PID_FILE" && ps -p "$pid" > /dev/null 2>&1; then  
            echo "$NAME esta rodando."  
            exit 0  
        else  
           echo "$NAME nao esta rodando mas $PID_FILE existe."  
           exit 1  
        fi  
    }
     
    case "$1" in
        start)
            start
            ;;
        stop)
            stop
            ;;
        status)
            status
            ;;
        restart)
            stop
            start
            ;;
        *)
            echo "Usage: $0 {start|stop|restart}"
            ;;
    esac
     
    exit 0

    script_desloga

    Código :
     
    #!/bin/bash
    while true
    do
    /usr/bin/php -q << PHP
    <? include("/softov/scripts/desloga.php"); ?>
    PHP
    sleep 600
    done
    exit 0

    uso o php para o caso de conexão com o banco de dados para verificar quais users estão com status 1
    e se ainda estão logados usando arping

    o php para entendimento e se alguem quiser usar


    Código PHP:

    <?
    include("/softov/public_html/conexao.php");
    include(
    "/softov/public_html/funcoes.php");
    $sql mysql_query("select * from usuarios where status='1'");
    while(
    $row mysql_fetch_array($sql)){
        
    $ip2 $row['ip'];
        if(!
    status($ip2)){ // se esta logado
            
    userlogout($iptable$ip2$row['mac'], $log_saiu$servidor);
        }
    }
    ?>
    no funcoes.php

    tenho a função status usada na linha 7 do código acima

    Código PHP:

    function status($ipp){
        
    $mac shell_exec("/usr/bin/sudo /sbin/arping -c1 -I eth1 $ipp | fgrep [ | cut -f2 -d[ | cut -f1 -d]");
        if(!
    ereg(":",$mac)){
            return 
    false;
        }else{
            return 
    true;
        }

    uso php pois as mesmas funções são usadas em um painel adm web

  4. #4

    Padrão

    e mais uma coisa nao coloco no contrab, pois eu perderia o dinamismo do status, stop, restart

  5. #5

    Padrão

    Tópico movido para a área de Shell Script!

    Ajude a manter o fórum organizado pessoal!

    Até mais...