Это зависит значительно от файловой системы, которую Вы используете. Определенные более старые версии ext3 были зверскими с этим, которое является, как B-деревья появились. Reiser намного более производителен с большими количествами файлов, такими как это. В более старые дни у меня был каталог Novell NSS на сервере NetWare с 250 000, файлы 4 КБ в нем из-за промаха GroupWise, и он работал просто великолепно. Перечисление каталога высосало много, но доступ к определенному файлу в том каталоге работал с такой скоростью, как Вы будете надеяться. Поскольку это было 8 лет назад, я должен предположить, что современные файловые системы Linux могут обработать это с самоуверенностью.
Можно сделать это с комбинацией 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
Вся информация, в которой Вы нуждаетесь, может быть захвачена от ps -ef
. См. столбец "STIME". Объединение это с grep
для разбираний в процессах, Вам нужно. В той точке можно использовать cut
захватить pid всего соответствия обрабатывают и передать тех, которые к kill
.
Сообщите мне, хотели ли бы Вы больше деталей о том, как сделать это.
Когда процесс запускает, он создает каталог в/proc файловой системе. Можно использовать команду находки, чтобы получить каталоги, более старые, чем 7 дней и уничтожить процессы следующим образом:
find /proc -user myuser -maxdepth 1 -type d -mtime +7 -exec basename {} \; | xargs kill -9
если Вы - корень, для избавлений от мусора (/proc/fs proc/stat...)
find /proc -maxdepth 1 -regex '/proc/[0-9]*' -type d -mtime +2 -exec basename {} \;
Никто не упомянул наблюдателя 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
никакая идея, если это работает, но это должна быть хорошая начальная точка.
Если у вас есть сценарий 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 скрипта.
Если есть какие-либо процессы, убить их.