Po pierwsze, tak, widziałem to pytanie:
Znajdź (i zabij) stare procesy
Odpowiedzi tam są niepoprawne i nie działają. Głosowałem i skomentowałem odpowiednio.
Procesy, które chcę zabić, wyglądają tak, gdy są wymienione na liście ps aux | grep page.py
:
apache 424 0,0 0,1 6996 4564? S 07:02 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py apache 2686 0,0 0,1 7000 3460? S Sep10 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py apache 2926 0,0 0,0 6996 1404? S Sep02 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py apache 7398 0,0 0,0 6996 1400? S Sep01 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py apache 9423 0,0 0,1 6996 3824? S Sep10 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py apache 11022 0,0 0,0 7004 1400? S Sep01 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py apache 15343 0,0 0,1 7004 3788? S Sep09 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py apache 15364 0,0 0,1 7004 3792? S Sep09 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py apache 15397 0,0 0,1 6996 3788? S Sep09 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py apache 16817 0,0 0,1 7000 3788? S Sep09 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py apache 17590 0,0 0,0 7000 1432? S Sep07 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py apache 24448 0,0 0,0 7000 1432? S Sep07 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py apache 30361 0,0 0,1 6996 3776? S Sep09 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py
Chcę skonfigurować prosty codzienny cron, który znajdzie i zabije wszelkie page.py
procesy starsze niż godzina.
Przyjęta odpowiedź na powyższe pytanie nie działa, ponieważ nie pasuje do zakresu czasów, po prostu pasuje do procesów, które działały od 7 dni do 7 dni 23 godzin 59 minut i 59 sekund. Nie chcę zabijać procesów trwających od 1 do 2 godzin, ale raczej cokolwiek dłuższego niż 1 godzina.
Inna odpowiedź na powyższe pytanie find
nie działa, przynajmniej nie w Gentoo lub CentOS 5.4, albo wyrzuca ostrzeżenie, albo nic nie zwraca, jeśli zastosowana zostanie rada wspomnianego ostrzeżenia.
Dzięki odpowiedzi Christophera mogłem dostosować ją do następujących kwestii:
-mmin
było polecenie szukania, którego mi brakowało.źródło
find /proc -maxdepth 1 -type d -name 1 -mmin +60 -ls
- / sbin / init nie znajduje się na liście, pomimo czasu przestojów dla dni, a nie godzin. Wygląda na to, że nie możesz polegać na czasie modyfikacji katalogów / proc /.find nie zawsze działa, nie każdy system ma dostępne etime i może to być mój status regex newb, ale nie sądzę, że potrzebujesz czegoś więcej:
następnie możesz skazać go na zabicie lub cokolwiek innego może być potrzebne.
źródło
ps
, ale złożyłbym wielegrep
s w jedenawk
, i ze względów bezpieczeństwa ograniczyłem dopasowania wzorca do poszczególnych kolumn (aby wykluczyć np. Dopasowanie nazwy polecenia builder itp.)Jeśli chcesz, możesz karmić
ps
z listą PID-ów do wyszukiwania, na przykład:źródło
etimes
działa tylko dla nowszychps
Myślę, że możesz zmodyfikować niektóre z poprzednich odpowiedzi, aby dopasować je do swoich potrzeb. Mianowicie:
Lub
Myślę, że drugi może najlepiej pasować do twoich potrzeb. Wersja znalezienia skończyłaby się nukowaniem innych procesów przez tego użytkownika
- Christopher Karel
źródło
kill -9
chyba że w ostateczności. Użyj-SIGINT
lub-SIGTERM
.ps
wyśle czas w^..:..$
formacie, gdy jest on krótszy niż godzina.źródło
psmisc
narzędzia? OP wspomniał o CentOS; czy jest dostępny jako RPM?Problem
Konwertowanie
etime
(upływający czas) kolumnyps
polecenia na sekundy. Specyfikacja czasu jest w tym formacie[[dd-]hh:]mm:ss
. Nowsze wersjeps
mająetimes
kolumnę, która wyświetlaetime
wartość w sekundach.Rozwiązanie: prosta niestandardowa funkcja awk
Funkcja ta awk obsługuje wszystkie formaty
etime
kolumnie (np03-12:30:59
,00:07
etc.). Wystarczy wkleić go do skryptu awk, jest to rozwiązanie przyjazne dla jednej linii.sec(T)
konwertuje T na sekundyT
specyfikacja czasu w[[dd-]hh:]mm:ss
formacie (np.etime
)C
liczba pól wT
(równoważne zmiennej NF awk)A
tablica pól wT
(odpowiednik zmiennej $ awk)A[C>3?C-3:99]
jest to bezpieczny sposób na odniesienie się do czwartej wartości (tj. liczby dni) w odwrotnej kolejności. Takie podejście jest przydatne, ponieważ dni i godziny są opcjonalne. Jeśli tablica nie jest wystarczająco długa, dereferencjaA[99]
da0
wartość. Zakładam, że99
jest wystarczająco wysoki dla większości przypadków użycia.Przykład z prawdziwego świata
Ten bash oneliner zabije
soffice.bin
proces działający pod bieżącym użytkownikiem, jeśli proces ten jest starszy niż 180 sekund.źródło
lstart
Pola wps
daje spójny format czasu, który możemy karmić siędate
przekonwertować sekund od epoki. Następnie po prostu porównujemy to z obecnym czasem.źródło
Zmodyfikowałem odpowiedź, którą ci dali w poprzednim poście
Wyrażenie regularne wyszukuje 2 typy drugiego argumentu:
Hours:minutes:seconds
wyrażenie.To powinno pasować do wszystkiego oprócz młodych procesów, które miałyby formę
minutes:seconds
.źródło
Jest to prawdopodobnie przesada, ale zainteresowałem się na tyle, aby go zakończyć i przetestować, czy działa (oczywiście pod inną nazwą procesu w moim systemie). Możesz zabić przechwytywanie
$user
i$pid
uprościć wyrażenie regularne, które dodałem tylko do debugowania i nie miałem ochoty wycofywać się. Nazwane przechwytywanie z perla 5.10 zgoliłoby jeszcze kilka linii, ale to powinno działać na starszych perlach.Oczywiście musisz zastąpić wydruk zabiciem, ale tak naprawdę nie miałem zamiaru niczego zabijać w moim systemie.
źródło
Mam serwer z nieprawidłowymi datami w / proc i find nie działa, więc napisałem ten skrypt:
źródło
Wersja Python wykorzystująca ctime wpisów procesu w
/proc
:źródło
Używam tego prostego skryptu, który wymaga dwóch argumentów: nazwa procesu i wiek w sekundach.
źródło
to powinno działać
killall --older-than 1h $proc_name
źródło
--older-than
i łatwo ją przeoczyć. W porównaniu z innymi odpowiedziami jest to o wiele łatwiejsze i jest teraz dostępne również na EL7.Nie byłem usatysfakcjonowany innym rozwiązaniem, większość z nich jest zbyt tajemnicza (moja wiedza na temat bash jest trochę ograniczona), więc nie mogę ich dostosować ...
Stworzyłem własne rozwiązanie. Prawdopodobnie nie jest najlepsze, ale działa i jest czytelny
Możesz zapisać ten skrypt w pliku i ustawić go jako wykonywalny (ewentualnie wywołać go za pomocą crona)
źródło
72 = 3 dni 48 = 2 dni 24 = 1 dzień
to działa :)
źródło