Zabijanie wszystkich procesów użytkownika
Z
ałóżmy, że z jakiegoś typowego powodu (zabieranie zbyt dużej ilości zasobów systemowych lub przepustowości łącza) chcemy zabić wszystkie procesy użytkownika. Oczywiście znamy komendę: skill -9 -u użytkownik, ale załóżmy, że użytkownik ten ustawił węzeł z podłączonym agentem, który za każdym zabitym procesem uruchamia nowy, po zabiciu agenta proces uruchamia kolejnego agenta…
W tej sytuacji przydałby się skrypt, który w pętli będzie tak długo zabijał procesy użytkownika aż wszystkie zostaną finalnie zakończone. Skrypt taki stworzył David Brock:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
#!/bin/bash USER=$1 MYNAME=`basename $0` if [ ! -n "$USER" ] then echo "Użycie: $MYNAME użytkownik" >&2 exit 1 elif ! grep "^$USER:" /etc/passwd >/dev/null then echo "Użytkownik $USER nie istnieje!" >&2 exit 2 fi while [ `ps -ef | grep "^$USER" | wc -l` -gt 0 ] do PIDS=`ps -ef | grep "^$USER" | awk '{print $2}'` echo "Zabijam " `echo $PIDS | wc -w` " procesów użytkownika $USER." for PID in $PIDS do kill -9 $PID 2>&1 >/dev/null done done echo "Użytkownik $USER nie posiada już żadnych uruchomionych procesów." |
Oto wynik działania skryptu, który musiał przetworzyć podwójnie pętle, aby unicestwić wszystkie procesy użytkownika agresor:
Zabijam 7 procesów użytkownika agresor
Zabijam 2 procesów użytkownika agresor
Użytkownik agresor nie posiada już żadnych uruchomionych procesów.
Pętla takiego skryptu potrafi wykonać się szybciej, niż podniesienie kolejnego procesu czy agenta, w ten sposób zabicie wszystkich procesów będzie tylko kwestią czasu.