PDA

Visualizza la versione completa : killare processi vecchi


magnus
25-09-2008, 15:35
Ciao ragazzi,
avrei bisogno di killare n processi del tipo:

...
postgres 6331 0.0 0.0 21456 2320 ? S 14:43 0:00 postgres: nomeutente nomedatabase 62.149.206.XXX idle
postgres 6331 0.0 0.0 21456 2320 ? S 14:44 0:00 postgres: nomeutente nomedatabase 62.149.206.XXX idle
postgres 6331 0.0 0.0 21456 2320 ? S 14:45 0:00 postgres: nomeutente nomedatabase 62.149.206.XXX idle
postgres 6331 0.0 0.0 21456 2320 ? S 14:46 0:00 postgres: nomeutente nomedatabase 62.149.206.XXX idle
postgres 6331 0.0 0.0 21456 2320 ? S 14:47 0:00 postgres: nomeutente nomedatabase 62.149.206.XXX idle
...

in base al pił vecchio.

Le parole chiave nel processo dovrebbero essere nomeutente e postgres.

Lanciando un comando del tipo:

killa 4 nomeutente

la shell dovrebbe generare il seguente risultato ( lanciando ps aux ):

...
postgres 6331 0.0 0.0 21456 2320 ? S 14:47 0:00 postgres: nomeutente nomedatabase 62.149.206.XXX idle
...

Chi mi aiuta a realizzare la cosa?

:ciauz:

magnus
25-09-2008, 16:05
Qualcosa di simile sembra fare questo script:

#!/bin/bash
# Days ago
DAYS="3"
PROCS="eggdrop|psybnc"

# Old date
AGO=$(date --date="$DAYS days ago" +"%b %d")

# Get pids
PIDS=$(ps eaxo bsdstart,cmd,pid | egrep "^$AGO"' | egrep "$PROCS" | awk '{ print $4}')

# Now kill em
echo "Killing $PROCS process created $AGO days ago..."
kill -9 $PIDS

Ma andrebbe modificato.

magnus
25-09-2008, 16:29
Pensavo ad una soluzione del genere...(qualora a qualcuno servisse ).
L'ho creata di getto, appena sono a casa controllo che non ci siano errori. Come logica secondo me ci sono.

Consigli?

if [ $1 = "" ] then;
echo "Specificare username";
exit 1;
fi
if [ $2 = "" ] then;
echo "Specificare processi da lasciare attivi.";
exit 1;
fi

ps eaxo bsdstart,cmd,pid | grep "$1" | grep "postgres" | awk '{ print $4}' > kill_processo.tmp

cp kill_processo.tmp _kill_processo.tmp

NUMERO_RIGHE=`wc -l _kill_processo.tmp | awk '{ print $1 }'`

NUMERO_RIGHE=`expr $NUMERO_RIGHE + -$2`

X=1
while [ $X -le $NUMERO_RIGHE ]
do
PID=`head -n 1 _kill_processo.tmp`

kill $PID

NUMERO_RIGHE_TMP=`wc -l _kill_processo.tmp | awk '{ print $1 }'`

RIGHE_ERASE=`expr $NUMERO_RIGHE_TMP + -1`

tail -n $RIGHE_ERASE _kill_processo.tmp > _kill_processo.tmp2
cp _kill_processo.tmp2 _kill_processo.tmp

X=`expr $X + 1`
done

rm -f _kill_processo.tmp
rm -f _kill_processo.tmp2

PinguinoGoloso
25-09-2008, 17:19
Teoricamente i PID sono assegnati in ordine progressivo, quindi ti dovrebbe bastare ordinare crescentemente la lista dei processi con sort...

Mutato
25-09-2008, 17:22
Io farei cosi`



1 #!/bin/bash
2
3 utente=""; processo=""; active=0;
4 while [ $# -gt 0 ];
5 do
6 case "$1" in
7 -a)
8 active=$2
9 shift;
10 ;;
11 -u)
12 utente=$2
13 shift;
14 ;;
15 -p)
16 processo=$2
17 shift;
18 ;;
19 -h|-*)
20 echo "usage: $0 -u [utente] -p [processo] -a [attivi]"
21 exit 1;
22 ;;
23 esac
24 shift;
25 done
26
27 line=`ps -u $utente -U $utente u | grep $processo | grep -v "grep" | grep -v $0 | awk '{print $2}' | sort -n | wc -l`
28 tokill=`echo "${line}-${active}" | bc`
29 kill -9 `ps -u $utente -U $utente u | grep $processo | grep -v "grep" | grep -v $0 | awk '{print $2}' | sort -n | head -n $tokill`


ti apre 7 xclock
for i in `seq 1 7`; do xclock &; sleep 5; done

uccide i primi 5 e ne lascia attivi 2
./killolder -u $USER -p xclock -a 2

magnus
25-09-2008, 22:17
Ciao ragazzi,
ho debuggato lo script ed ora funziona molto bene.

Lo posto qualora serva a qualcuno:


if [ "$1" = "" ]; then
echo "Specificare username"
exit 1
fi
if [ "$2" = "" ]; then
echo "Specificare processi da lasciare attivi."
exit 1
fi

echo "---> Output ps aux"
ps aux | grep "$1" | grep "postgres" | grep "idle"
ps aux | grep "$1" | grep "postgres" | grep "idle" | awk '{ print $2}' > kill_processo.tmp

cp kill_processo.tmp _kill_processo.tmp

NUMERO_RIGHE=`wc -l _kill_processo.tmp | awk '{ print $1 }'`

NUMERO_RIGHE=`expr $NUMERO_RIGHE + -$2`

echo "---> Cancellare $NUMERO_RIGHE processi."

X=1
while [ $X -le $NUMERO_RIGHE ]
do
PID=`head -n 1 _kill_processo.tmp`

echo "kill $PID"
kill $PID

NUMERO_RIGHE_TMP=`wc -l _kill_processo.tmp | awk '{ print $1 }'`

RIGHE_ERASE=`expr $NUMERO_RIGHE_TMP + -1`

tail -n $RIGHE_ERASE _kill_processo.tmp > _kill_processo.tmp2
cp _kill_processo.tmp2 _kill_processo.tmp

X=`expr $X + 1`
done

rm -f _kill_processo.tmp
rm -f _kill_processo.tmp2

:ciauz:

Loading