[gilug.org] problema amb bash script

David Casals hakd0c telefonica net
2007-05-23 13:01:36 UTC


Estic fent el següent programa (quant estigui a una versió mes avançada 
sera llicenciat amb GPL), aquest es tipus cibercafe però només controla 
el credit dels usuaris.

El programa es engegat quant un usuari inicia una sessió gràfica a 
través d'un fitxer ubicat a: /etc/X11/Xsession.d/ i tot lo que fa es 
comprovar el tipus d'usuari, si aquest te saldo i cada segon anar 
restant el saldo, anar-ho notificant per pantalla i un cop s'acaba el 
saldo bloqueja la pantalla.

El problema que tinc es que quant un usuari surt de la seva sessió el 
programa no desapareix de memoria i continua decrementant el credi de 
l'usuari.

Segur que es alguna parida, pero ja i porto algunes hores donant voltes 
i no trobo en quin lloc m'equivoco.

##
## INICI DEL PROGRAMA
##

#AGAFO EL SEU ID D'USUARI A PARTIR DEL SOBRENOM QUE OBRA LA SESSIO
DBUSERID=$(mysql-query "SELECT id_usuari FROM usuari WHERE 
sobrenom=\"$USERNAME\"";);


# COMPROVO SI ES EVENTUAL
TIPUS=$(mysql-query "SELECT tipus FROM usuari WHERE id_usuari=$DBUSERID";);
if [ $TIPUS = "Eventual" ]; then
    # DEIXEM QUE LA SESSIÓ COMENCI ABANS DE MOSTRAR RES PER PANTALLA
        sleep 10;

        # REGISTRE DE LA SESSIÓ A LA BASE DE DADES
        # ESTARIA BÉ POSAR-HI EL HOST
        $(mysql-query "INSERT INTO sessio 
(data_sessio,hora_sessio,idusuari,host,display,temps) VALUES 
(CURDATE(),CURTIME(),$DBUSERID,\"$HOSTNAME\",\"$DISPLAY\",0);");
        SESSID=$(mysql-query "SELECT MAX(id_sessio) FROM sessio WHERE 
idusuari=$DBUSERID;");


    osd_eventual
#MENTRE NO TANQUI LA SESSIO
while [[ ! $CLOSE_SESSION ]]; do    
    sleep 60;
    # ACTUALITZAR LA BASE DE DADES (CRÈDIT I TEMPS DE SESSIÓ)
    TEMPS=$(($TEMPS + 1))
    $(mysql-query "UPDATE sessio SET temps=$TEMPS WHERE 
id_sessio=$SESSID;");
    osd_eventual;
done

#exit 0

#EN CAS DE NO SER EVENTUAL
else
    # EN CAS DE NO TENIR CRÈDIT SUFICIENT PER A UN MINUT DE SESSIÓ, JA ES
    # POT CANCEL·LAR LA SESSIÓ
    get_credit;
    if [[ $DBUSERID == "" || $CREDIT -lt $TARIFA ]];then
        CLOSE_SESSION=1;
        osd_err "L'usuari '$USERNAME' no te prou credit."
    else
        # DEIXEM QUE LA SESSIÓ COMENCI ABANS DE MOSTRAR RES PER PANTALLA
        sleep 10;

        # REGISTRE DE LA SESSIÓ A LA BASE DE DADES
        # ESTARIA BÉ POSAR-HI EL HOST
        $(mysql-query "INSERT INTO sessio 
(data_sessio,hora_sessio,idusuari,host,display,temps) VALUES 
(CURDATE(),CURTIME(),$DBUSERID,\"$HOSTNAME\",\"$DISPLAY\",0);");
        SESSID=$(mysql-query "SELECT MAX(id_sessio) FROM sessio WHERE 
idusuari=$DBUSERID;");
    fi



    # MENTRE L'USUARI NO VULGUI TANCAR LA SESSIÓ,
    while [[ ! $CLOSE_SESSION ]];do
        get_credit;
        osd_credit;

        # EN CAS DE QUE EL CRÈDIT DE NOMÉS CINC MINUTS
        # AVISAR A L'USUARI QUE S'ESTÀ QUEDANT SENSE
        MINUTS=$(($CREDIT/$TARIFA))
        if [[ $MINUTS -eq 10 || $MINUTS -eq 5 ]];then
        xmessage -center "Atencio, queden $MINUTS minuts." -timeout 10 &
        fi

        # DECREMENTAR EL CRÈDIT EN FUNCIÓ DE LA TARIFA, PER UN MINUT DE
        # SESSIÓ
        CREDIT=$(($CREDIT - $TARIFA))

        # ACTUALITZAR LA BASE DE DADES (CRÈDIT I TEMPS DE SESSIÓ)
        TEMPS=$TEMPS+1
        $(mysql-query "UPDATE usuari SET credit=GREATEST(0,$CREDIT) 
WHERE id_usuari=$DBUSERID;");
        $(mysql-query "UPDATE sessio SET temps=$TEMPS WHERE 
id_sessio=$SESSID;");

        # ESPEREM UN MINUT
        sleep 60;

        # EN CAS DE NO TENIR CRÈDIT, BLOQUEJAR LA SESSIÓ.
        while [[ $CREDIT -le 0 && ! $CLOSE_SESSION ]];do
        $LOCKING_PROG
        if [ $? == 1 ];then
            CLOSE_SESSION=1;
        fi
        get_credit;
        done
    done

    osd_err "Tancant la sessio de l'usuari '$USERNAME'."

    # M'HE TROBAT QUE EN CONCRET EL 'killall' DE LA UBUNTU BREEZE NO TÉ LA
    # OPCIÓ DEL "-u usuari", el 'killall' AMB EL QUE M'HAVIA BASAT PER
    # MATAR TOTS ELS PROCESSOS DE L'USUARI D'UNA FORMA ELEGANT ERA AMB EL
    # PAQUET psmisc VERSIÓ 22-1.1, UNA LLÀSTIMA...

    #killall -u $USERNAME;
    for proces in `ps -U $USERNAME -u $USERNAME h | cut -c -5`;do
        kill -9 $proces;
    done

    #exit 0

fi


exit 0



Més informació sobre la llista de correu gilug