Newsgroup: it.comp.os.linux.software
Titolo: Aiuto su un semplice script in BASH

Salve a tutti
ho realizzato un elementare script in bash, che si occupa di
controllare se esistono dei processi attivi di un particolare utente e
killarli senza troppi complimenti.
Cosi' come e' funziona gia', ma vorrei includere anche un controllo
sell'effettiva esistenza dei processi.
In pratica, ora come ore assume che gli utenti "pippo" siano restati
collegati anche una volta finito l'orario di lavoro e li uccide
brutalmente, in modo da liberare il gestionale che puo' cosi' fare il
backup notturno senza paura.
Ma non si chiede "l'utente e' davvero rimasto collegato? O stasera ha
spento il pc?"
Ecco, io vorrei includere questo controllo, differenziando quindi i
messggi che stampa a video, ma purtroppo le mie nozioni di bash sono
vergognosamente limitate e non saprei come creare il ciclo if-then
necessario.
Lo script e' il seguente:
-----8<-----8<-----8<-----8<-----8<-----8<-----8<-----8<-----8<-----8<----
#!/bin/bash
# userkill.sh
# Lo script controlla se ci sono processi attivi da parte di un utente
prefissato e li killa senza il minimo rispetto
# IMPOSTAZIONE DEL NOME UTENTE DA TRACCIARE
#
USER="pippo"
IF=$(ps auxww | grep $USER | grep -v grep | grep -v root | cut -c10-14)
echo Rilevati processi attivi!
echo Uccido i PID $IF
kill -9 $IF
echo Ho eseguito il lavoro sporco!
-----8<-----8<-----8<-----8<-----8<-----8<-----8<-----8<-----8<-----8<----
Grazie a chi vorra' darmi una mano :)
-- 
 Cristian Castellari - 
www.skyflash.it
 XBox Live TAG: Wiitiful Sky
 Wii TAG: 2634 4285 3158 4638

 kill -9 $IF
killall -s 9 -u $USER

>>>>> "WSACC" == Wiitiful Sky AKA Cristian Castellari <cris...@localhost.localdomain> writes:
WSACC> Ma non si chiede "l'utente e' davvero rimasto collegato? O
WSACC> stasera ha spento il pc?"
Oddio, e questo come lo verificheresti ?
Se i processi  sono ancora attivi o si sono  impiantati e non ricevono
piu` i SIGHUP  dal terminale di controllo oppure  la shell dell'utente
da cui  sono stati lanciati c'e` ma  non puoi sapere se  lui e` ancora
davanti al computer oppure se ne e` andato senza chiudere.
Contro la seconda ipotesi  potrebbe funzionare il "pollare" gli utenti
che  non  si  scollegano  ("pollare"  da "pollo",  volatile  da  basso
cortile, e  non da "to poll")  in modo che  possa essere sfotticchiato
dai colleghi...
-- 
 /\           ___
/___/\_|_|\_|__|___Gian Uberto Lauri_____
  //--\| | \|  |   Integralista GNUslamico
\/                 e coltivatore diretto di Software

 killall -s 9 -u $USER
Ah, con questo sistema mi risparmio tutta la catena di ps aux | grep,
giusto? Ancora meglio, in effetti :)
Piccola precisazione: l'utente "pippo" non e' uno solo. Nel senso che
tutti gli utenti che sono loggati al gestionale lavorano come "pippo",
ognuno ovviamente col suo bel PID.
Io devo semplicemente verificare se
qualcuno e' ancora connesso (perche' altrimenti il gestionale del
cavolo che mi ritrovo non fa il backup notturno) e killarlo, diciamo
verso le 23 o giu' di li, tramite uno script (qesto) messo in cron.daily


 dai colleghi...
ROTFL :)


 2) Se "si", allora killali tutti. Se "no", stampa un messaggio ed esci
Guarda che e` quello che fa killall:
[..]
       killall returns a zero return code if at least one process has been killed for each listed command, or no com-
       mands were listed and at least one process matched the -u and -Z search  criteria.  killall  returns  non-zero
       otherwise.
[..]
Te la dovresti cavare con un
if [ ! `killall foo bar foo bar` ]; then
        echo "Nessuno da uccidere "
fi
In ogni caso andare di SIGKILL direttamente e` proprio brutale,
potresti prima dare una botta di SIGTERM per far chiudere i processi
in maniera un minimo elegante (sempre che i programmi non siano scritti col culo eh).

 scritti col culo eh).
Vero. Ma non saprei che altro comando usare... Suggerimenti? :)


 Vero. Ma non saprei che altro comando usare... Suggerimenti? :)
Una botta di SIGTERM (killall senza opzioni) e poi vai di KILL violento ( 9 )
che rappresenta sempre l'extrema ratio.

>>>>> "WSACC" == Wiitiful Sky AKA Cristian Castellari <cris...@localhost.localdomain> writes:
WSACC> Ma non si chiede "l'utente e' davvero rimasto collegato? O
WSACC> stasera ha spento il pc?"
Che ne dici di 
if ps -fu user | grep comando | grep -v grep
then
  # Viuuuuuuuleeeeeeeenzaaaaaaaaaaaaaaaaaa
  # sui processi di user
else
  # user non c'e`
fi


 stasera ha spento il pc?"
man who
Nessuno se ne rircorda?

 ho realizzato un elementare script in bash, che si occupa di
non perdere tempo e usa
killall <processo> -u <user>
puoi anche specificare un segnale (es -9) con l'opzione -s
Trovi tutto in
man killall.
-- 
Felinux, la distribuzione linux Made in Italy
http://www.fmtec.it/felinux