Человеко понятное логирование cron-заданий?

Здравствуйте. Появилась одна проблема — раз в сутки на сервере сильно поднимается нагрузка.

Т.к. это повторяется в одно и тоже время — подозрение падает естественно на задачи, запускаемые cron'ом. Задача — отследить что именно создаёт большую нагрузку, дабы это оптимизировать.

Т.к. задач в кроне у нас достаточно много, скрипты запускаются разные, добавлять какую-то свою систему логирования будет достаточно долго, хочется добавить что-то в течение пары часов, чтобы уже сегодня отследить, а завтра начать исправлять.


Возможно есть какая-то система логирования, которая хотябы сможет логировать всё, что запускается по крону и в идеале как-то совмещать это с отображением нагрузки по задачам? Или возможно у кого-то есть другие идеи?


Заранее спасибо.
  • Вопрос задан
  • 10677 просмотров
Пригласить эксперта
Ответы на вопрос 7
sledopit
@sledopit
Подождите, так вы знаете время, когда это происходит? Почему нельзя просто посмотреть, что именно запускалось в этот момент?
Крон же всё пишет в syslog. grep CRON /var/log/syslog ну и найти нужное время.

Или у вас настолько большой крон, что там по сто заданий в минуту запускается?
Ответ написан
@rozhik
хочется добавить что-то в течение пары часов

Замените в кроне
1 2 3 4 5 /bin/task1
на
1 2 3 4 5 /bin/taskRun.sh
В taskRun.sh
#!/bin/bash
date 2>&1 >> /var/log/task1
time /bin/task1 2>&1 >> /var/log/task1
cat /proc/meminfo >> /var/log/task1
cat /proc/loadavg >> /var/log/task1

Будет выведено много строчек статистики на момент окончания скрипта +
Mon Aug 12 14:21:21 UTC 2013
real 1m8.818s
user 0m35.090s
sys 0m1.332s

Хотя правильнее было бы то-же самое сделать через logger. Но как выше быстрее, не нужно парится с конфигом сислога
Ответ написан
mrstrictly
@mrstrictly
1. У процессов запускаемых по крону родительский процесс называется CRON и его ppid соответствует процессу cron. Пример:
root       514     1  0 авг.10 ?    00:00:00 cron
...
root     21227   514  0 17:30 ?        00:00:00 CRON
root     21228 21227  0 17:30 ?        00:00:00 /bin/sh -c sleep 1

2. Нагрузку на CPU конкретным процессом можно получить командой
ps u -p <pid>


Таким образом, ваша задача сводится к тому, чтобы в вашем крон-логгере:
1. Вычислить все процессы, у которых имя родительского процесса — CRON.
2. Для этих процессов собрать нагрузку на CPU.
3. Красиво вывести в файл.

Надеюсь, это поможет.
Ответ написан
@1x1
можно на коленке написать скрипт, вызывающий все команды крона, вроде такого:
#!/bin/sh
/bin/date >> /var/log/smth
"$@"
/bin/date >> /var/log/smth
/usr/bin/uptime >> /var/log/smth
/usr/bin/iostat -x 1 1 >> /var/log/smth
Ответ написан
@rozhik
Выбирайте что хотите. Опций много ;)man time
Решениеписаться в тот же файл, а не выводиться: [ -o FILE ] [ --append ] то-есть
time -o /var/log/log --append command

Простите писал по памяти, сейчас отпут тайм выдаёт на консоль а не в стдэр ;)
Ответ написан
Комментировать
opium
@opium
Просто люблю качественно работать
А что мешает зайти в это время на сервер и посмотреть топ?
Ответ написан
bestia
@bestia
atop (/usr/ports/sysutils/atop ) умеет работать как демон и писать файлы с состояниями. Потом можно посмотреть сохраненные состояния на любой указанный момент времени
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы