Найдите (и уничтожьте), старые процессы

Это зависит значительно от файловой системы, которую Вы используете. Определенные более старые версии ext3 были зверскими с этим, которое является, как B-деревья появились. Reiser намного более производителен с большими количествами файлов, такими как это. В более старые дни у меня был каталог Novell NSS на сервере NetWare с 250 000, файлы 4 КБ в нем из-за промаха GroupWise, и он работал просто великолепно. Перечисление каталога высосало много, но доступ к определенному файлу в том каталоге работал с такой скоростью, как Вы будете надеяться. Поскольку это было 8 лет назад, я должен предположить, что современные файловые системы Linux могут обработать это с самоуверенностью.

10
задан 5 October 2009 в 17:32
7 ответов

Можно сделать это с комбинацией PS, awk и уничтожить:

ps -eo pid,etime,comm

Дает Вам вывод на три столбца, с процессом PID, прошедшее время начиная с процесса, запущенного, и название команды, без аргументов. Прошедшее время похоже на один из них:

mm:ss
hh:mm:ss
d-hh:mm:ss

Так как Вы хотите процессы, которые работали больше недели, Вы искали бы строки, соответствующие тому третьему шаблону. Можно использовать awk для отфильтровывания процессов ко времени выполнения и названием команды, как это:

ps -eo pid,etime,comm | awk '$2~/^7-/ && $3~/mycommand/ { print $1 }'

который распечатает pids всех команд, соответствующих 'mycommand', которые работали больше 7 дней. Канал, которые перечисляют в уничтожение, и Вы сделаны:

ps -eo pid,etime,comm | awk '$2~/^7-/ && $3~/mycommand/ { print $1 }' | kill -9
9
ответ дан 2 December 2019 в 22:06
  • 1
    Хороший спасибо. Полностью забыл о параметрах форматирования в PS. –  Ryaner 5 October 2009 в 18:39

Вся информация, в которой Вы нуждаетесь, может быть захвачена от ps -ef. См. столбец "STIME". Объединение это с grep для разбираний в процессах, Вам нужно. В той точке можно использовать cut захватить pid всего соответствия обрабатывают и передать тех, которые к kill.

Сообщите мне, хотели ли бы Вы больше деталей о том, как сделать это.

1
ответ дан 2 December 2019 в 22:06

Когда процесс запускает, он создает каталог в/proc файловой системе. Можно использовать команду находки, чтобы получить каталоги, более старые, чем 7 дней и уничтожить процессы следующим образом:

find /proc -user myuser -maxdepth 1 -type d -mtime +7 -exec basename {} \; | xargs kill -9 
0
ответ дан 2 December 2019 в 22:06

если Вы - корень, для избавлений от мусора (/proc/fs proc/stat...)

find /proc -maxdepth 1 -regex '/proc/[0-9]*' -type d -mtime +2 -exec basename {} \;
1
ответ дан 2 December 2019 в 22:06

Никто не упомянул наблюдателя PS здесь. Я думаю, что Вы смогли сравнивать $start_time с помощью функции elapsed2sec, но я не совсем уверен. Вот моя первая мысль:

[myproc]
occurs = every
trigger = elapsed2secs('$start_time') > 7*DAYS
action = <<EOT
  echo "$command has been running more than 7 days" | /bin/mail user\@host
  kill -TERM $pid
EOT

никакая идея, если это работает, но это должна быть хорошая начальная точка.

0
ответ дан 2 December 2019 в 22:06

killall --quiet --older-than 1w имя_процесса

4
ответ дан 2 December 2019 в 22:06

Если у вас есть сценарий Python / Perl / Ruby, который вы хотите убить, killall вам не поможет, поскольку killall будет просто искать " python »или« perl », он не может совпадать с именем конкретного скрипта.

Чтобы убить все процессы старше X секунд, где любая часть полной выполняющейся команды соответствует строке, вы можете запустить это как root:

MAX_SECONDS=43200
PROGRAM_THAT_NEEDS_TO_DIE=bad-python-script.py
ps -eo pid,etimes \
    | grep -v PID \
    | awk '$2>'$MAX_SECONDS'{ print $1 }' \
    | xargs --no-run-if-empty ps -f --pid \
    | grep $PROGRAM_THAT_NEEDS_TO_DIE \
    | awk '{ print $2 }' \
    | xargs --no-run-if-empty kill -9

Используйте ps , чтобы получить список всех процессов ( -e ) и выводит только pid и прошедшее количество секунд ( -o pid, etimes ).

grep -v PID , чтобы удалить строку заголовка.

Используйте awk , чтобы выбрать только строки, в которых прошедшие секунды больше 43200 с (12 часов), и вырезать только первый столбец с PID.

Передайте список PID обратно в ps , чтобы получить полный список процессов.

Используйте grep , чтобы найти строки, содержащие имя сценария, который вы хотите убить.

Снова используйте awk , чтобы получить PID скрипта.

Если есть какие-либо процессы, убить их.

1
ответ дан 7 May 2020 в 18:25

Теги

Похожие вопросы