Найти (и убить) старые процессы


10

По сути, мне нужно иметь возможность сканировать дерево процессов и находить процессы, которые соответствуют определенному имени и запускаются более недели назад. Когда они у меня есть, мне нужно их убить. Все процессы по-прежнему воспринимаются системой как работающие, но не используют системное время. Как правило, они всегда будут сидеть в этом состоянии.

В идеале я хотел бы найти что-то похожее, но для процессов.

Система - Debian Linux, и она будет создаваться и запускаться cron, поэтому у меня нет особых проблем с чем-то большим, но понятным.


4
как вы собираетесь различать старые, но важные процессы и процессы, которые вы готовы убить?
Chopper3

Ответы:


9

Вы можете сделать это с помощью комбинации ps, awk и kill:

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 дней. Передайте этот список в kill, и все готово:

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

Хороший спасибо. Полностью забыл про параметры форматирования в пс.
Райанер

2
Это не показывает вам процессы, выполняющиеся "более 7 дней". Он показывает, что процессы выполняются в течение 7 дней, но менее 8 дней.
2010 года


4

killall --quiet --older-than 1w process_name


1
Это прекрасно работает в Ubuntu 16.04, и вы можете использовать флаг -i (интерактивный), чтобы проверить и убедиться, что он нацелен на процессы, которые, по вашему мнению, должны быть.
ezwrighter

1

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

Пожалуйста, дайте мне знать, если вы хотите получить более подробную информацию о том, как это сделать.


Я хотел бы больше деталей. Другие ответы просто неверны.
2010 года

1

если вы root, чтобы избавиться от мусора (/ proc / fs proc / stat ...)

find /proc -maxdepth 1 -regex '/proc/[0-9]*' -type d -mtime +2 -exec basename {} \;

0

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

find /proc -user myuser -maxdepth 1 -type d -mtime +7 -exec basename {} \; | xargs kill -9 

Это тоже не работает. Как есть, он генерирует это предупреждение, и никаких дополнительных выходных данных: find: warning: you have specified the -maxdepth option after a non-option argument -user, but options are not positional (-maxdepth affects tests specified before it as well as those specified after it). Please specify options before other arguments.переводя -maxdepth в качестве первого вывода, он не возвращает никаких процессов, и я уверен, что многие должны соответствовать.
2010 года

также почему mtime не ctime, если вы ищете дату создания dir? dir теоретически может быть изменен, если будет создан дополнительный дочерний элемент, что я не исключаю (возможно, недавно загруженный модуль ядра каким-то образом расширит sysfs)
jmtd

0

Никто не упомянул ps-watcher здесь. Я думаю, что вы могли бы сравнить $ 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

Понятия не имею, работает ли это, но это должно стать хорошей отправной точкой.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.