PDA

View Full Version : [BASH] Osservare i processi


Futuregames
03-08-2010, 10:03
Salve a tutti,

volevo chiedere un piccolo aiuto. Dovrei creare uno script bash per osservare i processi in esecuzione ed avvisare l'utente se uno di questi supera un tot di percentuale di utilizzo della cpu.

Ci sono ovviamente molti modi di farlo e sono arrivato a questo:

top -b -n 1 | grep 'processo' | grep -v 'grep' | awk '{print $9}'

o

ps -eo %cpu PIDdelprocesso | tail -1

Ora: per monitorare più processi dovrei lanciare più volte questi comandi. C'è un modo per farlo con un comando? Io potrei mettere nel primo "egrep 'processo|processo1' ma non riuscirei a dire che processo2 ha il 100% della CPU. Mi sono spiegato? Dovrei filtrare l'output in qualche strano modo :D

zuper
03-08-2010, 11:04
bisogna vedere su che sistema lavori...

io ottengo quello che vuoi con

ps -eo user,pid,pcpu,args |awk '{if($3>=10) print $0}'


dove chiaramente il 10 è la percentuale che voglio :)

Futuregames
03-08-2010, 12:24
bisogna vedere su che sistema lavori...

io ottengo quello che vuoi con

ps -eo user,pid,pcpu,args |awk '{if($3>=10) print $0}'


dove chiaramente il 10 è la percentuale che voglio :)


WOW ottimo! Grazie. E se dovessi chiedere "vuoi terminare il processo?" ?

zuper
03-08-2010, 14:01
WOW ottimo! Grazie. E se dovessi chiedere "vuoi terminare il processo?" ?

vuoi che ad ogni processo che trova te lo chieda?

puoi fare così, tanto sei in uno script mi pare di capire.

1- logghi in un file il risultato di quello sopra (chiamiamo il file "lista")
2- crei una funzioncina all'interno dello script (chiamiamo kill_proc) che conterrà
kill_proc() {
processo=$1
echo `grep $processo lista`
read -p "Vuoi killare il processo? [Y][N]" yn
case $yn in
[Yy]) kill $processo;return 0;;
[Nn]) return 0;;
esac
}

3- all'interno della main function fai fare un ciclo for sul file "lista"
for processo in `nawk '{print $2}' lista `;do kill_proc $processo;done

Futuregames
06-08-2010, 09:29
vuoi che ad ogni processo che trova te lo chieda?

puoi fare così, tanto sei in uno script mi pare di capire.

1- logghi in un file il risultato di quello sopra (chiamiamo il file "lista")
2- crei una funzioncina all'interno dello script (chiamiamo kill_proc) che conterrà
kill_proc() {
processo=$1
echo `grep $processo lista`
read -p "Vuoi killare il processo? [Y][N]" yn
case $yn in
[Yy]) kill $processo;return 0;;
[Nn]) return 0;;
esac
}

3- all'interno della main function fai fare un ciclo for sul file "lista"
for processo in `nawk '{print $2}' lista `;do kill_proc $processo;done


ti ho amato :D

ora... dopo un bel po' di ore passate a cercare, sto tentando di creare un array a due dimensioni in modo da chiamare la funzione kill_proc con $pid e $nomeprocesso.
Quindi:

PID NOME
1 comando1
2 comando3
11 comando2

Poi lo scorrerei con il for e passerei gli argomenti alla funzione, senza fare il grep ogni volta. Penso sia più efficente no? Tuttavia sto impazzendo per farlo :D

xcdegasp
06-08-2010, 09:48
@ zuper: come mai uusi la funzione read per mostrare la scelta e non un print?

Futuregames
06-08-2010, 09:58
@ zuper: come mai uusi la funzione read per mostrare la scelta e non un print?

non vorrei dire eresie ma penso per leggere la risposta y/n :)

zuper
17-08-2010, 11:04
ti ho amato :D

ora... dopo un bel po' di ore passate a cercare, sto tentando di creare un array a due dimensioni in modo da chiamare la funzione kill_proc con $pid e $nomeprocesso.
Quindi:

PID NOME
1 comando1
2 comando3
11 comando2

Poi lo scorrerei con il for e passerei gli argomenti alla funzione, senza fare il grep ogni volta. Penso sia più efficente no? Tuttavia sto impazzendo per farlo :D

sorry mi ero un po perso sto 3d :)
hai risolto alla fine per il passaggio del comando?
se no invece del for processo...prova con

while read user pid pcpu args;do kill_proc $pid $args;done < lista

e poi chiaramente

kill_proc() {
pid=$1
processo=$2
# echo `grep $processo lista`
echo $1 $2
read -p "Vuoi killare il processo? [Y][N]" yn
case $yn in
[Yy]) kill $pid;return 0;;
[Nn]) return 0;;
esac
}



@ zuper: come mai uusi la funzione read per mostrare la scelta e non un print?

non vorrei dire eresie ma penso per leggere la risposta y/n :)

yes :)

Futuregames
17-08-2010, 21:35
sorry mi ero un po perso sto 3d :)
hai risolto alla fine per il passaggio del comando?
se no invece del for processo...prova con

while read user pid pcpu args;do kill_proc $pid $args;done < lista

e poi chiaramente

kill_proc() {
pid=$1
processo=$2
# echo `grep $processo lista`
echo $1 $2
read -p "Vuoi killare il processo? [Y][N]" yn
case $yn in
[Yy]) kill $pid;return 0;;
[Nn]) return 0;;
esac
}







yes :)

avevo "risolto" passando tutta la lista ed il pid, nella funzione kill_proc cercavo il pid e via. Chiaramente non efficente (secondo me).

Il tuo codice mi da errore: "nessun file o directory". Siamo sicuri che la read più il < lista sia giusto? lista è una variabile per me, come faccio a farla accettare come file?

Futuregames
18-08-2010, 11:30
Come non detto ho fatto così

echo "$lista" | while read pid pcpu cmd;do kill_proc $pid $cmd;done

Tuttavia sembra che ora le due read vadano come in conflitto, quindi non mi chiede più se voglio terminare il processo. (Entra nella funzione eh ma la read per la domanda la ignora e passa oltre)

edit: ho creato un for, modificando l'IFS ('\n') ed, al suo interno ho trasformato la linea letta in array, passando la prima e la terza colonna della linea. Risolto. Penso sia pure elegante ed efficente