Знайдіть (і вбийте) старі процеси


10

В основному мені потрібно вміти сканувати дерево процесів і знаходити процеси, які відповідають певній назві і почали працювати більше тижня. Як тільки я їх маю, мені потрібно вбити їх. Усі процеси все ще розглядаються системою як у запущеному стані, лише не використовуючи системний час. Зазвичай вони також вічно сидять у такому стані.

В ідеалі я хотів би знайти щось подібне, але для процесів.

Система - Linux Debian, і це буде сценарій та керування за допомогою 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 }'

які надрукують підказки всіх команд, які відповідають "mycommand", які працюють більше 7 днів. Передайте цей список на вбивство, і ви закінчите:

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

Гарна подяка. Повністю забув про параметри форматування в пс.
Ryaner

2
Це не показує вам процеси, що працюють "більше 7 днів". Він показує, що ви працюєте між 7 днями, але менше ніж 8 днями.
hobodave

etimesзручніше - serverfault.com/a/393476/67675
poige

4

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


1
Це чудово працює на Ubuntu 16.04, і ви можете використовувати прапор -i (інтерактивний) для тестування та переконання, що він орієнтований на процеси, які ви вважаєте, що це має бути.
ezwrighter

1

Всю інформацію, яка вам потрібна, можна захопити ps -ef. Дивіться стовпчик "STIME". Поєднайте це, grepщоб розібрати потрібні процеси. У цей момент ви можете скористатись cutпідом усіх відповідних процесів і передати їх kill.

Будь ласка, дайте мені знати, чи хочете ви детальніше про те, як це зробити.


Мені хотілося б більше деталей. Інші відповіді просто невірні.
hobodave

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 є першим результатом, він не повертає жодних процесів, і я впевнений, що багато хто повинен відповідати.
hobodave

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

0

Тут ніхто не згадав пс-спостерігача . Я думаю, що ви, можливо, зможете порівняти $ 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.