?

Log in

mitroko
Понадобилось мне как-то узнать потребление ресурсов и длительность по времени каждого задания в планировщике cron.

Стандартного решения я не нашёл. Увеличение уровня журналирования демона не помогло. Я смог выяснять только когда задача завершалась и вычислять время задачи на лету становилось затруднительно.

Для помощи я обратился к утилите time, которая позволяет узнать время работы процесса и некоторые ресурсы, которые процесс потребовал для работы (такие как память, количество ЦПУ, нагрузку на диск и сеть).
Если честно, то характеристики нагрузки на диск и сеть несколько неверны, так как показывают только цифры для родительского процесса, без суммы ресурсов по всем дочерним.

Затем, я начал писать скрипт-обёртку для заданий в кроне и напоролся на ещё одну неприятность. Если вы используете bash (а он как правило по-умолчанию вместо sh на многих debian/redhat основанных дистрибутивах), то встроенная в интерпретатор комманда time имеет мало общего с основной утилитой и вызов придётся делать по полному пути.
У меня это был /usr/bin/time.

Итак, от слов к делу.
mitroko@host:~# cat /bin/cronresources
#!/bin/bash
MD=$(date +%b\ %d\ %H:%M:%S);
/usr/bin/time -f"$MD Process: %C\nTime: %es; Memory: %MK; Exitcode: %x; FS I/O: %I/%O; NET I/O: %r/%s" -a -o /var/log/cron-resources.log $*;

Разрешаем запуск этого скрипта.

Создаём пустой логфайл /var/log/cron-resources.log и выдаём ему 777 в качестве прав. Для тех, кого эти права не устраивают - пользуйтесь sudo. Тогда для каждого пользователя, обозначенного в заданиях cron необходимо будет давать разрешение.

Затем, к каждому заданию в cron дописать cronresources перед исполняемым файлом, указанном в задании.
Например:
*/5 * * * * cronresources php /some/path/devel_script.php --request=MadeMyDay >/some/path/mmd.log 2>&1

Как видно я не нарушаю даже условий перенаправления потоков.
Скрипт складывает в свой журнал STDERR и STDOUT а time пишет свой журнал.

На выходе получается что-то вроде:
mitroko@host:~# tail -n30 /var/log/cron-resources.log
Jul 24 09:47:01 Process: php /some/path/devel_script.php --request=MadeMyDay
Time: 17.10s; Memory: 60752K; Exitcode: 0; FS I/O: 0/8; NET I/O: 0/0