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
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?" ?
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 :)
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
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.