Вычисление процессорного времени процесса в RHEL 5.3

Для управления процессом мне нужно будет удалить процесс, который превышает определенное количество процессорного времени, например, 1 час. В команде PS он имеет параметр TIME, показывающий общее время процессора процесса. Таким образом, это правильный способ взять процессорное время процесса? Также есть и другие команды, которые можно было бы использовать при вычислении процессорного времени процесса.

2 Solutions collect form web for “Вычисление процессорного времени процесса в RHEL 5.3”

В большинстве систем вы можете использовать команду ulimit при запуске программы, чтобы ограничить количество времени процессора, которое она может использовать. Под капотом это вызывает setrlimit с аргументом RLIMIT_CPU . После того, как программа использовала это много времени, программа будет убита.

 (ulimit -t 3600; myprogram) 

Вы можете дополнительно уточнить, установив мягкий предел, после которого программа получит сигнал SIGXCPU (который он может поймать) и жесткий предел, после которого программа получает сигнал SIGKILL (что неизбежно приводит к летальному исходу).

 (ulimit -t -S 3590; ulimit -t -H 3600; myprogram) 

Я не знаю никакой утилиты оболочки, чтобы изменить предел работающей программы. Вы можете заставить процесс выполнить системный вызов setrlimit через ptrace , например, используя отладчик. Обратите внимание, что некоторые системы безопасности отключают это использование ptrace (например, он отключен по умолчанию для текущих выпусков Ubuntu), я не знаю, разрешает ли RHEL 5.

 gdb -n -pid 1234 -batch -x /dev/stdin <<EOF call setrlimit(RLIMIT_CPU, {(rlim_t) 3590, (rlim_t) 3600}) detach quit EOF 

( 1234 – идентификатор процесса, а два числа внутри скобок – это мягкий и жесткий предел).

В зависимости от требуемой точности вам может потребоваться использование ps и некоторых друзей.

Однако имейте в виду, что ps получает свои данные откуда-то; нет ничего волшебного в этом конкретном приложении.

Посмотрите /proc/$$/sched и, в частности, значение se.sum_exec_runtime . Это значение представляет собой общее количество наносекунд, затраченных на процессор . Я не собираюсь тратить много времени, чтобы проследить его историю, но похоже, что значение отслеживается, по крайней мере, с 2.6.32 .

Чтобы получить более полезную ценность (миллисекунды), возьмите указанное значение и разделите его на 1 000 000.

Есть, вероятно, другие способы получить одни и те же данные, но это может быть нетривиально, не прибегая к syscalls в ядро, что не так просто сделать из сценария оболочки.

  • В Ubuntu - / var / log / messages отметки времени на 4 минуты вперед
  • Удаление файла после X дней не работает
  • Как сообщить время и другую информацию обо всех командах bash?
  • Как спать до определенной даты и времени?
  • Какая аппаратная поддержка необходима, чтобы linux выполнял `gettimeofday` /` clock_gettime` в пользовательском пространстве с помощью `hped`?
  • Я не могу установить дату и время в Debian на основе оружия!
  • Как сделать этот поиск быстрее в fgrep / Ag?
  • stat: время печати в формате «long-iso»
  • конвертировать в эпоху и обратно
  • Использование аппаратных часов в Linux
  • Unix-эпоха в миллисекундах
  • Linux и Unix - лучшая ОС в мире.