Magento Cron Job Monitor

donvictorio

Хранитель порядка
Регистрация
28 Янв 2010
Сообщения
872
Реакции
849
нарыл интересный скрипт, показывает в удобочитаемом виде информацию по заданиям крон, вытягивая её из базы.
запускается из каталога на уровень выше от корневого , чтобы удобно было его запаролить (можно поправить пути и запускать его откуда угодно)

крон можно запускать как файлом Для просмотра ссылки Войди или Зарегистрируйся из браузера, так и из консоли файлом cron.sh. последний вариант удобнее для добавления в расписание crontab:
Код:
crontab -e
i
* * * * * /path-to-cron.sh
Enter (после строки с заданием должна быть пустая строка)
Esc
:wq
код скрипта - создать php файл со следующим содержанием и запустить в браузере:
PHP:
<?php
//Magento Cron Job Monitor. GNU/GPL
//oliver.higgins@gmail.com
//provided without warranty or support
//
//modifications by chiefair to retrieve Magento connection and database
//info, display time, connection info and all job execution states
//================================================================
 
/** Get current date, time, UTC and offset **/
$date  = date("Y-m-d");
$time  = date("H:i:s T");
$offset = date("P");
$utc    = gmdate("H:i:s");
 
/** Mage locations **/
$mageconf = '../app/etc/local.xml';  // Mage local.xml config
$mageapp  = '../app/Mage.php';      // Mage app location
 
/*******************
* Let George do it
* Get connection information from Magento's local.xml file
*******************/
 
if (file_exists($mageconf)) {
 
$xml = simplexml_load_file('../app/etc/local.xml', NULL, LIBXML_NOCDATA);
 
$db['host'] = $xml->global->resources->default_setup->connection->host;
$db['name'] = $xml->global->resources->default_setup->connection->dbname;
$db['user'] = $xml->global->resources->default_setup->connection->username;
$db['pass'] = $xml->global->resources->default_setup->connection->password;
$db['pref'] = $xml->global->resources->db->table_prefix;
 
$tblname= $db['pref'] . "cron_schedule";
 
}
 
else {
    exit('Failed to open ../app/etc/local.xml');
}
 
/* Initialize profile to be run as Magento Admin and log start of export */
 
require_once $mageapp;
umask(0);
Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);
 
$storetimestamp = Mage::getModel('core/date')->timestamp(time());
 
$storetime = date("H:i:s",$storetimestamp);
 
/************************
* Start HTML output
************************/
 
echo '<html><head><title>Magento Cron Schedule on ' . $date . ' ' . $time . '</title>
<meta http-equiv="refresh" content="60">
<style type="text/css">html {width: 100%; font-family:  Arial,Helvetica, sans-serif;}
body {line-height:1.0em; font-size: 100%;}
table {border-spacing: 1px; width: 100%;}
th.stattitle {text-align: left; font-size: 100%; font-weight: bold; color: white; background-color: #101010;}
th {text-align: center; font-size: 80%; font-weight: bold; padding: 5px; border-bottom: 1px solid black; border-left: 1px solid black; }
td {text-align: left; font-size: 80%; padding: 4px; border-bottom: 1px solid black; border-left: 1px solid black;}
</style>
</head><body>';
 
/** Output title, connection info and cron job monitor runtime **/
 
echo "<h2>Magento Cron Schedule Report</h2><h3>Connection: ".$db['user']."@".$db['host']."&nbsp;&nbsp;&ndash;&nbsp;&nbsp;Database: " . $db['name'] . "&nbsp;&nbsp;&ndash;&nbsp;&nbsp;Table: " . $tblname . "</h3>";
echo "<h4>Runtime: " . $date . "&nbsp;&nbsp;&nbsp;Server: " .$time . "&nbsp;&nbsp;&nbsp;Store: " .$storetime . "&nbsp;&nbsp;&nbsp;Zulu: " . $utc . " UTC</h4>";
echo "<h4>Note: All logged times are UTC, your server timezone offset is " . $offset . " hours from UTC</h4>";
 
/** Connect to database **/
 
$conn = mysql_connect($db['host'],$db['user'],$db['pass']);
@mysql_select_db($db['name']) or die(mysql_error());
 
//================================================================
//Pending jobs
 
$query='SELECT * FROM ' . $tblname . ' WHERE status ="pending" ORDER BY scheduled_at DESC' ;
$result=mysql_query($query);
$num=mysql_numrows($result);
echo '<table><tbody><tr><th class="stattitle" colspan="5">Jobs Pending: ' . $num . '</th></tr>';
echo "<tr><th>ID</th><th>Job Code</th><th>Status</th><th>Created At</th><th>Scheduled At</th>";
$i=0;
while ($i < $num) {
 
$schedule_id=mysql_result ($result,$i,"schedule_id");                               
$job_code=  mysql_result($result,$i,"job_code");
$status=mysql_result ($result,$i,"status");
$created_at=mysql_result ($result,$i,"created_at");
$scheduled_at=mysql_result ($result,$i,"scheduled_at");
$executed_at=mysql_result ($result,$i,"executed_at");
$finished_at=mysql_result ($result,$i,"finished_at");
 
//output html
echo "<tr>";
echo "<td>".$schedule_id."</td>";
echo '<td>'.$job_code."</td>";
echo '<td style="color: red;">'.$status."</td>";
echo "<td>".$created_at."</td>";
echo "<td>".$scheduled_at."</td>";
echo "</tr>";         
$i++;
}
echo "</tbody></table><hr>";
 
//================================================================
//Running jobs
 
$query='SELECT * FROM ' . $tblname . ' WHERE status ="running" ORDER BY executed_at DESC' ;
$result=mysql_query($query);
$num=mysql_numrows($result);
echo '<table><tbody><th class="stattitle" colspan="7">Jobs Running: ' . $num . '</th></tr>';
echo "<tr><th>ID</th><th>Job Code</th><th>Status</th><th>Created At</th><th>Scheduled At</th>";
echo "<th>Executed At</th><th>Finished At</th></tr>";
$i=0;
while ($i < $num) {
 
$schedule_id=mysql_result ($result,$i,"schedule_id");                               
$job_code=  mysql_result($result,$i,"job_code");
$status=mysql_result ($result,$i,"status");
$created_at=mysql_result ($result,$i,"created_at");
$scheduled_at=mysql_result ($result,$i,"scheduled_at");
$executed_at=mysql_result ($result,$i,"executed_at");
$finished_at=mysql_result ($result,$i,"finished_at");
 
//output html
echo "<tr>";
echo "<td>".$schedule_id."</td>";
echo "<td>".$job_code."</td>";
echo "<td>".$status."</td>";
echo "<td>".$created_at."</td>";
echo "<td>".$scheduled_at."</td>";
echo "<td>".$executed_at."</td>";
echo "<td>".$finished_at."</td>";
echo "</tr>";         
$i++;
}
echo "</tbody>";
 
//================================================================
//Succsessful jobs
 
$query='SELECT * FROM ' . $tblname . ' WHERE status ="success" ORDER BY executed_at DESC' ;
$result=mysql_query($query);
$num=mysql_numrows($result);
echo '<tbody><tr><th class="stattitle" colspan="7">Jobs Successful: ' . $num . '</th></tr>';
echo "<tr><th>ID</th><th>Job Code</th><th>Status</th><th>Created At</th><th>Scheduled At</th>";
echo "<th>Executed At</th><th>Finished At</th></tr>";
$i=0;
while ($i < $num) {
 
$schedule_id=mysql_result ($result,$i,"schedule_id");                               
$job_code=  mysql_result($result,$i,"job_code");
$status=mysql_result ($result,$i,"status");
$created_at=mysql_result ($result,$i,"created_at");
$scheduled_at=mysql_result ($result,$i,"scheduled_at");
$executed_at=mysql_result ($result,$i,"executed_at");
$finished_at=mysql_result ($result,$i,"finished_at");
 
//output html
echo "<tr>";
echo "<td>".$schedule_id."</td>";
echo "<td>".$job_code."</td>";
echo "<td>".$status."</td>";
echo "<td>".$created_at."</td>";
echo "<td>".$scheduled_at."</td>";
echo "<td>".$executed_at."</td>";
echo "<td>".$finished_at."</td>";
echo "</tr>";         
$i++;
}
echo "</tbody>";
 
//================================================================
//Missed jobs
 
$query='SELECT * FROM ' . $tblname . ' WHERE status ="missed" ORDER BY executed_at DESC' ;
$result=mysql_query($query);
$num=mysql_numrows($result);
echo '<tbody><tr><th class="stattitle" colspan="7">Jobs Missed: ' . $num . '</th></tr>';
echo "<tr><th>ID</th><th>Job Code</th><th>Status</th><th>Created At</th><th>Scheduled At</th>";
echo "<th>Executed At</th><th>Finished At</th></tr>";
$i=0;
while ($i < $num) {
 
$schedule_id=mysql_result ($result,$i,"schedule_id");                               
$job_code=  mysql_result($result,$i,"job_code");
$status=mysql_result ($result,$i,"status");
$created_at=mysql_result ($result,$i,"created_at");
$scheduled_at=mysql_result ($result,$i,"scheduled_at");
$executed_at=mysql_result ($result,$i,"executed_at");
$finished_at=mysql_result ($result,$i,"finished_at");
 
//output html
echo "<tr>";
echo "<td>".$schedule_id."</td>";
echo "<td>".$job_code."</td>";
echo "<td>".$status."</td>";
echo "<td>".$created_at."</td>";
echo "<td>".$scheduled_at."</td>";
echo "<td>".$executed_at."</td>";
echo "<td>".$finished_at."</td>";
echo "</tr>";         
$i++;
}
echo "</tbody>";
 
//================================================================
//Failed jobs
 
$query='SELECT * FROM ' . $tblname . ' WHERE status ="error" ORDER BY executed_at DESC' ;
$result=mysql_query($query);
$num=mysql_numrows($result);
echo '<tbody><tr><th class="stattitle" colspan="7">Jobs Failed: ' . $num . '</th></tr>';
echo "<tr><th>ID</th><th>Job Code</th><th>Status</th><th>Created At</th><th>Scheduled At</th>";
echo "<th>Executed At</th><th>Finished At</th></tr>";
$i=0;
while ($i < $num) {
 
$schedule_id=mysql_result ($result,$i,"schedule_id");                               
$job_code=  mysql_result($result,$i,"job_code");
$status=mysql_result ($result,$i,"status");
$created_at=mysql_result ($result,$i,"created_at");
$scheduled_at=mysql_result ($result,$i,"scheduled_at");
$executed_at=mysql_result ($result,$i,"executed_at");
$finished_at=mysql_result ($result,$i,"finished_at");
 
//output html
echo "<tr>";
echo "<td>".$schedule_id."</td>";
echo "<td>".$job_code."</td>";
echo "<td>".$status."</td>";
echo "<td>".$created_at."</td>";
echo "<td>".$scheduled_at."</td>";
echo "<td>".$executed_at."</td>";
echo "<td>".$finished_at."</td>";
echo "</tr>";         
$i++;
}
echo "</tbody></table></body></html>";
 
//================================================================
// End of report
 
mysql_close($conn);
?>


для того, чтобы в логах /var/log/system.log отображалась запись о том, что крон был запущен, нужно в файле cron.php в самом конце в блоке

PHP:
try {
    Mage::getConfig()->init()->loadEventObservers('crontab');
    Mage::app()->addEventArea('crontab');
    Mage::dispatchEvent('default');
    Mage::log("Cron run"); //Добавить строку, чтобы крон логировался
} catch (Exception $e) {
    Mage::printException($e);
}
добавить строчку Mage::log("Cron run");

запись в логе будет выглядеть так:

Код:
2013-06-03T22:39:49+00:00 DEBUG (7): Cron run


удобный модуль для настройки крона
Для просмотра ссылки Войди или Зарегистрируйся
 
По теме советую посмотреть еще на Для просмотра ссылки Войди или Зарегистрируйся
поюзал пару дней на 1.8.1
что понравилось: таймлайн - отображение в виде линейки и на ней частота выполняемых заданий.
возможность просто включить и выключить задание.

что не понравилось: невозможность изменить время выполнения задания. в целом глючный, в логах куча ошибок и рандомно пропускал задания по неизвестным причинам (сайт полностью статичен, даже посетителей нету)
 
Hmm, я его использовал на 1.6 (кстати на странице нет совместимости с 1.8) и в свое время он был пассивным (т.е. использовался для того чтобы отслеживать кроны а не изменять их).

Возможно большинство проблем от 1.8, хотя хз :)
 
Noovias Cronjobs - пользуюсь, удобный очень, по лучше других будет, в 1.9.0.1 нормально работает.
 
скрипт конечно ничего, но использовать такие скрипты на живых серверах крайне нежелательно, лучше
использовать готовые расширения, они и функциональнее и безопаснее.
по поводу расширений могу порекомендовать
Для просмотра ссылки Войди или Зарегистрируйся
он конечно попроще гораздо чем AOE, но самое необходимое есть и не загаживает логи.
 
По теме советую посмотреть еще на Для просмотра ссылки Войди или Зарегистрируйся

У меня был очень негативный опыт использования данного модуля. Постоянные ошибки, тысячи писем в почте с ошибкой, что путь для логов Watchdog отстутствует и т.п. Разработчики отвечают, что основная проблема в том, что проектом они занимаются только по субботам, и только в свободное время. Никакой поддержки нет, пишите замечания, потом когда-нибудь поправим.

С учетом того, что многие прямо рекомендуют установку этого скрипта, следует предположить, что у них все работает замечательно. Возможно влияет версия установленной Magento. У меня была 1.9.1.0

И еще один важный момент. По ссылке на Connect лежит версия 0.3.2. В соседней же Для просмотра ссылки Войди или Зарегистрируйся имеется последняя версия 1.2.1.
От себя замечу - у меня проблемы были с обеими версиями.
 
Последнее редактирование модератором:
Назад
Сверху