我继承了一个基于Magento Enterprise 1.9的网站,该网站定期运行许多cron作业。
这些cron作业由第三方模块配置,不属于Magento核心。
一组作业处理从Magento到仓库管理系统的数据文件的导出和导入,有时cron作业会陷入某种循环,并且只需要几分钟就可以处理数小时。
我想以某种方式监视这些作业的持续时间,但不修改每个脚本本身。也许是某种观察者,如果这样的话可能吗?
有什么想法吗?
答案 0 :(得分:3)
可以从core_schedule
表中收集有关Magento中预定作业的计划和运行的基本信息。请注意,根据系统&gt;中的设置添加和删除条目。配置&gt;系统&gt; Cron时间表。可以从任何给定模块的 config.xml 中的<crontab />
节点确定原始预定作业配置(类,方法和cron表达式)。
使用Fabrizio Branca's AOE_Scheduler module (link)可以在管理员中对其中的许多内容进行可视化和互动。
要捕获性能(内存使用,开始/停止时间),可能需要在这些启用cron的脚本中删除一些日志记录调用。
答案 1 :(得分:2)
构建一个脚本,该脚本执行从 cron_schedule 表创建的格式化表格。
我知道关于发布链接的常见事情,但MagentoCommerce.com可能不会很快消失,并且在这里获得代码发布是皇家PITA。 So here's the link to a PHP script that reads cron_schedule and creates a full report. 请参阅底部的代码。进入系统配置cron设置并告诉它保存信息24小时。
您现在可以看到正在安排的所有内容以及已执行的所有内容,如以下输出示例所示。
对于链接上的MageBayvaporation感到抱歉,我试图将最重要的东西移到这里,但错过了这个。幸运的是,它仍然在其中一个网站上运行。
<?php
/******************************************************
* Magento Log File Contents Monitor.
* Released under the Digital Damnation Copyright
* Free to do whatever the 7734 you want to do with it.
* provided without warranty or support
******************************************************/
/***********************
* Scan Magento local.xml file for connection information
* Run out of password protected scripts/ directory
***********************/
if (file_exists('../app/etc/local.xml')) {
$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;
$tables = array(
'dataflow_batch_export',
'dataflow_batch_import',
'log_customer',
'log_quote',
'log_summary',
'log_summary_type',
'log_url',
'log_url_info',
'log_visitor',
'log_visitor_info',
'log_visitor_online',
'catalog_compare_item',
'report_event',
'report_compared_product_index',
'report_viewed_product_index',
'sales_flat_quote',
'sales_flat_quote_address',
'sales_flat_quote_address_item',
'sales_flat_quote_item',
'sales_flat_quote_item_option',
'sales_flat_quote_payment',
'sales_flat_quote_shipping_rate'
);
}
else {
exit('Failed to open ../app/etc/local.xml');
}
/** 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");
/***********************
* Start HTML output
***********************/
echo '<html><head><title>Magento Log File Contents on ' . $date . ' ' . $time . '</title>
<meta http-equiv="refresh" content="30">
<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;}
th.stattitle {text-align: left; font-size: 100%; font-weight: bold; color: white; background-color: #101010;}
th {text-align: center; font-size: 90%; font-weight: bold; padding: 5px; border-bottom: 1px solid black; border-left: 1px solid black; }
td {font-size: 90%; 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 Log File Contents Report</h2><h3>Connection: '.$db['user'].'@'.$db['host'].' – Database: ' . $db['name'] . '</h3>';
echo '<h3>Runtime: ' . $date . ' ' .$time . ' ' . $utc . ' UTC</h3>';
echo '<h4>Note: Your 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());
/***********************
* Get table record counts
***********************/
echo '<table><tbody><tr><th class="stattitle" colspan="2">Log Tables</th></tr>';
echo '<tr><th>Table</th><th>Row Count</th></tr>';
foreach($tables as $tblname) {
$result = mysql_query('SELECT COUNT(*) FROM ' . $db['pref'] . $tblname) or die(mysql_error());
$numrows = mysql_fetch_array($result);
$num = $numrows[0];
/* Table output */
echo '<tr>';
echo '<td>'.$db['pref'].$tblname.'</td>';
echo '<td align="right">'.$num.'</td>';
echo '</tr>';
}
echo '</tbody></table></body></html>';
/***********************
* End of report
***********************/
mysql_close($conn);
?>
答案 2 :(得分:0)
我有一个客户也有同样的顾虑,他们看不到工作有多长时间,并且对他们的计划发生了什么也没有很好的了解。那里有一些解决方案,但是他们并没有完全按照他们想要的去做,所以我最终建立了一个称为Job Health Data Vault的小型服务。任何人都可以免费使用它。