Во-первых, да, я видел этот вопрос:
Найти (и убить) старые процессы
Ответы там неверны и не работают. Я проголосовал и прокомментировал соответственно.
Процессы, которые я хочу убить, выглядят так, когда перечислены с 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
Я ищу, чтобы установить простой ежедневный cron, который будет находить и убивать любые page.py
процессы старше часа.
Принятый ответ на вышеупомянутый вопрос не работает, так как он не соответствует диапазону времени, он просто соответствует процессам, которые выполнялись от 7 дней до 7 дней 23 часа 59 минут и 59 секунд. Я не хочу убивать процессы, которые выполнялись от 1 до 2 часов, а лучше от 1 часа.
Другой ответ на вышеупомянутый вопрос с использованием find
не работает, по крайней мере, в Gentoo или CentOS 5.4, он либо выдает предупреждение, либо ничего не возвращает, если следовать совету упомянутого предупреждения.
Благодаря ответу Кристофера я смог адаптировать его к следующему:
-mmin
была команда поиска, которую я пропустил.источник
find /proc -maxdepth 1 -type d -name 1 -mmin +60 -ls
- / sbin / init не указан в списке, несмотря на то, что время безотказной работы исчисляется днями, а не часами. Кажется, вы не можете полагаться на время модификации / proc /.find не всегда работает, не у каждой системы есть доступное время, и это может быть мой статус regex newb, но я не думаю, что вам нужно что-то большее, чем это:
затем вы можете передать это, чтобы убить или что-то еще, что вам нужно.
источник
ps
, но я бы сложил кратныеgrep
s в единое целоеawk
, и для безопасности ограничиваю совпадения шаблонов для определенных столбцов (исключая, например, сопоставление имени команды строитель и т. д.)Если вы хотите, вы можете добавить
ps
список PID для поиска, например:источник
etimes
работает только для новичковps
Я думаю, что вы можете изменить некоторые из этих предыдущих ответов в соответствии со своими потребностями. А именно:
Или
Я думаю, что второе может лучше всего соответствовать вашим потребностям. Версия find приведет к удалению других процессов этим пользователем -
Кристофер Карел
источник
kill -9
кроме как в крайнем случае. Используйте-SIGINT
или-SIGTERM
.ps
будет выводить время в^..:..$
формате, когда оно меньше часа.источник
psmisc
утилите? ОП упомянул CentOS; это доступно как RPM?Проблема
Преобразование
etime
(истекшее время) столбцаps
команды в секунды. Указание времени в этом формате[[dd-]hh:]mm:ss
. Более новые версииps
имеютetimes
столбец, который выводитetime
значение в секундах.Решение: простая пользовательская функция awk
Эта пользовательская функция awk поддерживает все форматы
etime
столбцов (например03-12:30:59
,00:07
и т. Д.). Просто вставьте его в свой скрипт на awk, это решение для одной строки.sec(T)
преобразует T в секундыT
указание времени в[[dd-]hh:]mm:ss
формате (напримерetime
)C
количество полей вT
(эквивалентно переменной NK в awk)A
массив полей вT
(эквивалентно переменной $ awk)A[C>3?C-3:99]
Это безопасный способ ссылаться на четвертое значение (т.е. количество дней) в обратном порядке. Этот подход полезен, потому что дни и часы не являются обязательными. Если массив не достаточно длинный, это разыменование,A[99]
которое даст0
значение. Я предполагаю,99
что достаточно высок для большинства случаев использования.Пример из реального мира
Этот bash oneliner убьет
soffice.bin
процесс, запущенный под текущим пользователем, если процесс старше 180 секунд.источник
lstart
Полеps
дает последовательный формат времени , который мы можем подать вdate
преобразовать в секундах с начала эпохи. Тогда мы просто сравним это с текущим временем.источник
Я изменил ответ, который они дали вам в предыдущем посте
Регулярное выражение ищет 2 типа второго аргумента:
Hours:minutes:seconds
выражение.Это должно соответствовать всем, кроме молодых процессов, которые будут иметь форму
minutes:seconds
.источник
Это, вероятно, излишне, но мне стало любопытно закончить его и проверить, работает ли он (конечно, с другим именем процесса в моей системе). Вы можете убить захват
$user
и$pid
упростить регулярное выражение, которое я добавил только для отладки, и которое не вырвалось обратно. Именованные захваты из Perl 5.10 сбрили бы еще пару строк, но это должно работать на старых Perl.Конечно, вам придется заменить отпечаток уничтожением, но я не собирался ничего уничтожать в моей собственной системе.
источник
У меня есть сервер с неправильными датами в / proc и find не работает, поэтому я написал этот скрипт:
источник
Версия Python, использующая ctime записей процесса в
/proc
:источник
Я использую этот простой скрипт, он принимает два аргумента имя процесса и возраст в секундах.
источник
это должно работать
killall --older-than 1h $proc_name
источник
--older-than
и его легко не заметить. По сравнению с другими ответами это намного проще, и теперь оно доступно и на EL7.Меня не устраивало другое решение, большинство из них слишком загадочные (мои знания bash ограничены), и поэтому я не могу их настроить ...
Я создал собственное решение, оно, вероятно, не самое лучшее, но оно работает и это читабельно
Вы можете сохранить этот скрипт в файле и сделать его исполняемым (в конце концов, вызовите его с помощью cron)
источник
72 = 3 дня 48 = 2 дня 24 = 1 день
оно работает :)
источник