22:38 “多难”如何可以“兴邦” » 中外对话新鲜出炉

中国人民经受了2008年以来的重重灾难的考验。唐昊说,从这些灾难中,中国可获得从提高建筑防震标准到完善紧急情况应急机制等多方面的经验和教训。

迄今为止的2008年灾祸连连,似乎要以大不幸来刺痛这个古老的民族。当这个民族历经雪灾、暴乱、车祸、地震的重重考验之后,原来那种肤浅的盛世喜悦也被冲淡了许多,代之而起的是一种凝重和沉痛。在灾区的小学课堂上,温家宝总理更是手书“多难兴邦”四个字来表达中华民族面对频仍的灾难依然不屈奋发的态度。

灾难固然是一种不幸,但是,如果一个国家,能够彻底反思灾难之成因并励精图治;如果一个民族,面对灾难时能激发起贯注着理性与信仰的救赎之心;如果一个社会,已在充满着艰难险阻的茫茫前路中看准了方向——灾难就会成为“兴邦”的契机!在这个意义上,我们如果能从这次地震灾害中反思和汲取足够教训,并开启改革之路,应该是对生者和死者最好的告慰。

为此,首先应该改革的是中国的危机处理机制。在中国,危机处理必须要成为一种日常机制。笔者在英国访学期间,曾对英国处理突发性危机的方式留下了深刻印象。他们的做法其实很简单,就是使民众时刻意识到危机的存在。在各种建筑物的显眼位置随处可见消防条例、安全规则、注意事项等警示性贴纸,并且都是简单粘贴,便于经常更新。此外,英国经常进行消防、逃生等演练。演练时间经常在半夜两三点钟,并且要求居住人员在几分钟之内就全部撤出楼外。而每个人也都非常郑重地对待这些演习,用最快的速度冲到楼下,甚至穿着短裤在12月的寒风里瑟瑟发抖,直到消防员确认了每一个人都撤出,检查了所有消防设施,记录下整个过程之后才回去。

平时的演练越逼真,在真正的危机来临时所受到的损害就越小。而危机处理规程的完善细化、政府的危机处理能力、民众的危机应对能力也是在这一次次看似劳民伤财的演练中不断提高的。在这样的环境中,如何应对可能发生的危机性事件,如何保护自己的安全已经成了人们的一种本能。学生可以不用老师组织,就在第一时间用最快速度逃生和救人。而在中国,由于公众对于地震的防治平时很少被训练和引导,时间长了,公众自己也会松懈甚至淡忘,危机关头逃生效率、救灾的效率自然不高。应该说,这也是地震灾害中造成人员损失巨大的原因之一。

其次,像这样的灾害,仅靠政府本身是无法应对的,必须要动员全社会的力量。地震后进入四川灾区的志愿者有数十万人,在没有任何官方机构发出号召的情况下,许多医生、律师、公司的董事长、农民工、学生、甚至一些受灾者本身,都从全国各地汇集而来。公民热情在这次灾难面前空前高涨,即使在那些最难以进入的山区,都有志愿者的身影出现。但与此同时,政府平时对NGO缺乏沟通和管理的后果也显现了出来。对志愿者的组织工作十分混乱,信息提供不够完整及时,地方上没有这方面的经验,表现得有些不知所措,什邡市委书记甚至表示不再欢迎志愿者的到来。平时与NGO不加强联系,关键时候也不知道如何处理双方的关系,甚至认为他们是来添乱而简单地赶走,这不是正确的方法。灾后政府应该反思如何加强对志愿者的培训和引导,完善社会志愿服务的日常化管理体制,把公民志愿意识对接到政府的危机处理体系中来,同时还要加强政府本身的管理水平——这些都是重要的基础性工作。

最后,我们国家应该以此次令人痛心的灾难为契机,改革过度以发展为中心的思路,而把更多的精力投入到社会民生系统的完善上。

例如,事关民众生命安全的地震科学观测工作,由于片面强调经济发展而受到很大冲击。就在地震发生前几天,北京的某地震观测站在一夜之间被房地产开发商夷为平地——一切为发展让路。同时,科学研究本身也做得不够,例如地震地区的地震局网站上,主要内容、包括震前几天的信息就是春游、跳绳比赛、学习政治文件等等,没有一件是和地震预测工作相关的。长此以往,如何全面完善中国的地震监测系统?改革国家地震灾害的预测体制,去除官僚化的习气,重新建立专家、公众、政府之间的有效互动,是经历了唐山大地震和汶川大地震的中国所必须面对的首要任务!

同时,这次地震之所以造成如此重大的损失,与政府监管缺位、教育弱势、公共建筑标准过低等一系列体制性因素也有关系。在地震中有近7000所校舍垮塌,其中北川中学教学楼跨塌导致1000多名学生死亡;都江堰聚源中学教学楼倒塌,十几个班级的学生遇难;汶川县映秀小学教室垮塌,数百学生遇难。与此形成鲜明对照的是,离北川县城极近的五所希望小学在这次地震中不仅教学楼没有垮塌,连玻璃幕墙也没有掉落,原因只不过是这五所由同一出资者严格监督建造的学校在建筑过程中没有偷工减料,按照建筑标准施工而已。在中国,学校倒塌已不是新闻,学校不倒才是新闻;偷工减料是常态,实实在在按标准盖楼反而罕见,这才是最大的悲哀。在建筑过程、监督过程、甚至设计过程都存在很大问题而导致塌楼的情况下,尽管有老师奋不顾身去救学生,但他们又能救几个人呢?这些由制度缺陷所造成的人为错误,却要老师们付出生命的代价才能弥补其万一,实在令人义愤填膺。

因此,最重要的防震工作就是——把房子盖得结实些!地震不会杀人,杀人的是建筑。而要想盖更多结实的房子,最需要的其实是制度的全面改革。有人说,这次地震后应该提高学校建筑的防震标准,但问题是,如果制度不进步,光是提高标准又有什么用呢?更重要的是以此为契机,改变以往单纯注重发展而牺牲环境和自然,不重视民生保障体系的做法,全面提升中国民生保障体系的制度化水平。

曾子墨在采访唐山大地震预测者后说过一句话:“一个民族能够承认自己的弱点,就有进步;一个人能够承认自己的过失,就有希望。”95年日本阪神大地震损失同样巨大,暴露出日本在关西地区缺乏足够的防范措施和救灾系统,但也引起了全日本对相关问题的反思和改革。之后的十几年,即使在同样强度的地震中,也再没有那样大的损失。

所以说,多难不是兴邦的原因,只有因多难而警觉、而改革才是兴邦的原因。从这个角度看,那降下的国旗对生者的意义要大于对死者的意义。因为它逼迫我们必须要反思如下问题——怎样把学校建筑得更坚固,并严惩豆腐渣工程的责任人,以保障人民的生存权;怎样保持这次新闻媒体所表现出来的及时有效传播的能力,以保障人民的知情权;怎样将捐款去向透明化,以保障人民的慈善爱心不被滥用等等——生命的代价只有换来进步,才对得起那些逝去的生命!

唐昊,华南师范大学政治学副教授,《市民》杂志副总编辑,著名专栏作家。曾在《现代国际关系》《国际问题研究》《南风窗》《南方都市报》《羊城晚报》等学术期刊和平面媒体发表文章数十万字。

首页图片由Jane Liu

20:12 山中无老虎(呆伯特-20080624) » 呆伯特

原图

华氏32度=摄氏0度…

widget找不到合适的词索性不译了

订书机的“GO TO SB'S HEAD”做字面意思解。暴力呀!

15:53 使用php发送MSN消息 sendMsg: Sending messages using PHP at Fanatic Live » del.icio.us/chedong
sendMsg is a class which allows you to send a message to a contact from a specified account. It logs in, changes status to online, creates a new IM session with the target user, sends the message and ends both connections.
15:15 Google推出广告优化工具:Ad Planner » WebLeOn's Blog
Google Ad Planner是Google刚刚推出的一项面向广告主和广告代理商的服务。它可以为这些需要发布网络广告的用户提供最优化的网络广告计划。

Google上周刚刚发布Trends for Websites,为普通用户提供大中型网站的流量统计数据。今天的Google Ad Planner显然是Google对于网站统计更为商业化的产品。根据帮助文件,我们可以了解到,这个服务可以:

——定义受众的人口统计学资料及他们的兴趣;
——搜索和这些受众相关的网站;
——获得40个国家上百万个网站的独立访客、页面浏览等统计数据;
——创建媒体计划来保存你想要投放广告的的网站;
——为你所创建的媒体计划生成聚合的网站统计信息。

简而言之,Google Ad Planner可以帮助广告主或者广告代理商快速高效的建立并管理网络广告的媒体计划。虽然我们现在还不能说Ad Planner是一个杀手级的应用,但我们已经可以隐约感觉到它潜在的巨大商业价值:

——通过收费服务向用户提供更加详细的数据信息和更多服务;
——向网站收取费用让它们出现在Ad Planner中以获得更多的广告;
——帮助AdWords的销售,同时让更多网站使用AdSense。

Google的确有很多途径来获得网站的信息:用户在Google上搜索时候的点击、AdSense的广告代码、Analytics的统计代码、用户安装的Toolbar,不管Google是否愿意承认,这些数据来源经过组合整理之后,的确可以为AdPlanner提供比较准确的网站数据。

AdPlanner目前并没有和AdWords后台直接连接,这一方面可以说是Google还不太愿意让它们两者之间看起来有直接的联系;另一方面也可能昭示着AdPlanner有更大的目标,或许是成为评判所有网络广告投放的标准。

AdPlanner如果能够得以普及,不仅对comScoreNielsen或者Quantcast这样的专业互联网统计公司的商用业务构成了直接的威胁,最终也将不同程度的影响到众多网络广告的中间商和代理商的利益。

Google作为一个商业机器,似乎没有什么人能停下它的脚步。
14:12 关于”以用户为中心的产品设计”培训 » UCDChina.com

实际上”以用户为中心的产品设计”培训一直是UCDChina唯一的收入来源。但因为运作UCDChina本身并不需要太多的收入,所以我们一直没有推广过这个培训服务。

在去年的用户体验年会上有参与会者体验过我们的培训,前一段我们也在北京做过一个免费的公开培训,再加上这几个月来我们陆续给七八家公司做过商业的培训。所以虽然我们没有公开推广过这个培训的事情,在行业内却一直有很多人知道并了解。最近一段时间有很多朋友写信,或者直接给我和我所在的五季咨询打电话询问培训的事情。相信这也是参加过培训的朋友们帮忙口碑相传的功劳,谢谢大家。 :)

在这里特公开说明一下这个培训的相关事宜:

1、培训的形式:工作坊式模拟真实项目,整个过程以培训师带领学员”练习”为主。
2、培训的内容:以一个简单的项目背景模拟未基础,从市场分析入手,练习产品设计流程中需求分析、产品设计和界面设计、用户研究和可用性测试等环节。包括整个项目流程的讲解、方式方法的练习、角色分工和协作等。
具体内容的侧重点会根据不同公司的不同情况,以及参与者的情况进行调整。
3、培训的时间:三天或两天。
4、适用的人群:产品策划和架构师、产品设计师、交互设计、用户研究等PM和UE团队成员。(但不详细讲解视觉设计和前端开发的内容)
5、适用的企业:互联网企业。(我们的模拟项目不能是公司的实际产品,但要和该公司的实际产品类似)。目前只针对企业,不接受零散个人。
6、培训师:白鸦和另外一位资深专家。两个培训师一起。
7、地点不限。收费恕不直接公布。
8、用户体验年会上的精简讲义下载部分相关图片参加者的总结博文
9、更多详细信息请邮件咨询。

.
另外,我自己也在作一天的培训。主要以设计思想、理论和团队分工、流程、方法讲解为主,实际练习相对较少。

转载请注明出自UCDChina.com,谢谢。

相关文章

13:30 账户更新指南 » Inside AdSense-中文


在前面的文章中,我们向大家简单介绍了把
AdSense 账户更新为 Google 账户的信息。有些发布商在更新时遇到了一些问题,今天我们就对如何进行更新给大家提供更详细的帮助。

首先,当您登录账户以后,会出现更新提示页面,页面上有三个选项:

1. 我还有另外一个 AdSense 账户。
2. 我已经有用于 GmailOrkut iGoogle 主页等 Google 服务的电子邮件地址和密码(Google 账户)。
3. 我不使用其他这些服务。我希望创建新的 Google 账户。

您要根据自己的情况选择合适的选项。选项一很容易判断,如果您除了这个 AdSense 账户还有其他账户,就要选择这个选项,然后根据系统的提示完成所有操作。

对于选项2 3,您首先要确定自己是否已经拥有了 Google 账户,您可以按照我们的帮助中心如何知道自己是否已有 Google 账户”的说明查看您是不是已经拥有了Google 账户。

如果您确定了自己已经拥有了 Google 账户,就应该选择选项2。选中以后页面会出现一个新的提示问题,问您是否要把您拥有的这个 Google 账户作为新的 AdSense 登录信息,如下图所示:

如果您想把 AdSense 和其他服务统一管理,就可以选择“我希望将现有 Google 账户用于 AdSense。”

如果您想把 AdSense 和其他服务分开管理,就可以选择“我希望转为 AdSense 选择一个新的登录名和密码”。

千万别忘记,在完成这些更新以后,系统会发一封确认邮件到您选用的 Google 账户邮箱,您必须打开这封邮件并进行确认以后才算真正完成了账户的更新。在这之前您都不能用新的登录名登录账户。所以请大家完成更新页面的步骤后一定要到邮箱查看邮件,有些邮件可能被您的邮箱自动过滤并放进垃圾箱,所以我们建议您好好查看一下邮箱。

13:25 为什么Twitter很烂 但我们依然爱它 » WebLeOn's Blog

Leo的BetaShow上说到了“Twitter is over capacity.”的画面,让我再次想起了Twitter稳定性这个问题。

对于Twitter重度用户来说,这个画面其实并不鲜见。根据Pingdom的一项对社交网络类型网站的调查显示,Twitter的网站在线率是最低的,第一季度的故障时间超过了37个小时。大大超过了其它所有网站。这还不包括,从今年以来Twitter对于API请求次数的限制对用户带来的极大不便。

让人感到奇怪的是,虽然我们也会抱怨,但为什么我们周围的人依然会忍受Twitter的不稳定,保持对它的热情?我觉得,这样的现象和Twitter使用者的使用目的有很大的关系。对于“为什么使用Twitter”的解释,我分了几个类别:

1,用Twitter因为它很酷,在这里可以找到很多厉害的角色。从Techcrunch的作者到下一届美国总统奥巴马都在Twitter上有他们的账号。你可以和他们在同一平台上,知道他们的最新消息,向他们发送信息,而且这一切都是实时的。通过Twitter和你的偶像交流,比起电子邮件和Facebook那样的社交网络更加方便和直观。

2,Twitter是一个发牢骚的最佳场所。TweetStats可以帮助我们看到某一个用户在Twitter的活动情况,我们可以发现大部分人在工作日更多的使用Twitter。可以对多人发泄自己的情绪,同时还能看别人的碎碎念。许多人是通过Twitter来疏解自己的工作压力。

3,Twitter是最新的推广工具。根据Compete的统计,4个Twitter用户中就有一个是重度用户,用Twitter来进行Blog推广、网站推广甚至是企业推广都变得越来越流行。虽然如何正确的利用Twitter还需斟酌,但是Twitter成为一个重要的推广手段已经为很多人所赞同。Dell已经通过Twitter获得了50万美元的销售额

4,Twitter是Geek的游乐场。Twitter本身的功能可以用简陋来形容,但是开放的API和大量活跃的用户让Twitter成为Geek们最热衷的游乐场。会写代码的人可以开发各种基于Twitter的第三方应用,这里绝对不缺试用者;即使不是程序员,也可以在这里尝试各种新奇的应用,或者大玩信息聚合获得和分享各种最新的消息。

5,Twitter是小团体的俱乐部。也许你没有注意到,Twitter上有不少小团体。他们和Twitter上的其它部分相对隔绝,只是在几个或者几十个至亲密友的范围内进行交流。利用Twitter的功能,既能做到一定的私密性,又能保证交流的方便。在这里,Twitter有点像论坛,但是比论坛更好的地方是它更关注于每个人,而不是每一个话题。

可以看出来,上面说到的这些用户使用Twitter都有比较明了的目的。这也许可以从一个方面来解释:为什么这么多人虽然觉得Twitter很烂,但依然离不开它的原因吧。
Linux服务器系统监控框架与MSN、E-mail、手机短信报警的实现[原创]回忆未来[张宴] » Che, Dong's shared items in Google Reader
  [文章作者:张宴 本文版本:v1.0 最后修改:2008.06.25 转载请注明原文链接:http://blog.s135.com/read.php/354.htm]

  最近,在我原有的“Linux服务器系统监控程序”基础上,完善了HTTP、TCP、MySQL主动监控与MSN、E-mail、手机短信报警。监控程序以shell和PHP程序编写,以下为主要框架与部分代码:

  一、系统监控接口程序(interface.php)具有的报警方式
  1、MSN实时报警
  ①、监控程序每次检测到故障存在、或者故障恢复,都会发送短消息到管理员的MSN。
  点击在新窗口中浏览此图片

  点击在新窗口中浏览此图片

  发送MSN短消息用了一个PHP类:sendMsg,使用该PHP类发消息,必须将发送、接收双方的MSN加为联系人,发送中文时,先用iconv将字符集转为UTF-8:
引用
$sendMsg->sendMessage(iconv("GBK", "UTF-8", $message), 'Times New Roman', '008000');




  2、手机短信报警
  ①、工作日早上10点之前,晚上6点之后,以及周六、周日,监控程序检测到故障,会调用手机短信接口,发送短信给管理员的手机。
  ②、如果监控程序多次检测到同一台服务器的同一类故障,只会在第一次检测到故障时发送一条“故障报警”短信。服务器故障恢复后,监控程序会再发送一条“故障恢复”短信。

  如果没有手机短信网关接口,可以试试中国移动通信的www.139.com邮箱,具有免费的邮件到达手机短信通知功能,可以将收到的邮件标题以短信的形式发送到手机上。



  3、电子邮件报警
  ①、如果监控程序多次检测到同一台服务器的同一类故障,只会在第一次检测到故障时发送一封“故障报警”邮件。服务器故障恢复后,监控程序会再发送一封“故障恢复”邮件。

  系统监控接口程序interface.php(核心部分,仅提供部分代码):
[codes=php]//HTTP服务器监控
if (htmlspecialchars($_POST["menu"]) == "http")  
{  
   $date = htmlspecialchars($_POST["date"]);  
   $ip = htmlspecialchars($_POST["ip"]);
   $port = htmlspecialchars($_POST["port"]);
   $status = htmlspecialchars($_POST["status"]);//状态,0表示无法访问,1表示正常,2表示无法访问但能ping通
   //...下一步处理(省略)...  
}

//TCP服务器监控
if (htmlspecialchars($_POST["menu"]) == "tcp")  
{  
   $date = htmlspecialchars($_POST["date"]);  
   $ip = htmlspecialchars($_POST["ip"]);
   $port = htmlspecialchars($_POST["port"]);
   $status = htmlspecialchars($_POST["status"]);//状态,0表示无法访问,1表示正常,2表示无法访问但能ping通
   //...下一步处理(省略)...
}

//MySQL服务器监控
if (htmlspecialchars($_POST["menu"]) == "mysql")  
{  
   $date = htmlspecialchars($_POST["date"]);  
   $ip = htmlspecialchars($_POST["ip"]);
   $port = htmlspecialchars($_POST["port"]);
   $abstract = htmlspecialchars($_POST["abstract"]);//故障摘要(必须为全角)
   $info = htmlspecialchars($_POST["info"]);//故障详细描述
   $failback = htmlspecialchars($_POST["failback"]);//如果服务器存活,此处接收的值为active
   //...下一步处理(省略)...
}
?>[/codes]

  二、主动探测监控(“监控机”主动探测“被监控机”)
  1、HTTP服务器监控
  脚本:/data0/monitor/http.sh
引用
#!/bin/sh
LANG=C

#被监控服务器、端口列表
server_all_list=(\
192.168.1.1:80 \
192.168.1.2:80 \
192.168.1.3:80 \
)

date=$(date -d "today" +"%Y-%m-%d_%H:%M:%S")

#采用HTTP POST方式发送检测信息给接口程序interface.php,接口程序负责分析信息,决定是否发送报警MSN消息、手机短信、电子邮件。
send_msg_to_interface()
{
   /usr/bin/curl -m 600 -d menu=http -d date=$date -d ip=$server_ip -d port=$server_port -d status=$status http://127.0.0.1:8888/interface.php
}

server_all_len=${#server_all_list[*]}
i=0
while  [ $i -lt $server_all_len ]
do
   server_ip=$(echo ${server_all_list[$i]} | awk -F ':' '{print $1}')
   server_port=$(echo ${server_all_list[$i]} | awk -F ':' '{print $2}')
   if curl -m 10 -G http://${server_all_list[$i]}/ > /dev/null 2>&1
   then
     #status:    0,http down    1,http ok    2,http down but ping ok
     status=1
           echo "服务器${server_ip},端口${server_port}能够正常访问!"
   else
       if curl -m 30 -G http://${server_all_list[$i]}/ > /dev/null 2>&1
       then
           status=1
           echo "服务器${server_ip},端口${server_port}能够正常访问!"
       else
           if ping -c 1 $server_ip > /dev/null 2>&1
           then
               status=2
               echo "服务器${server_ip},端口${server_port}无法访问,但是能够Ping通!"
           else
               status=0
               echo "服务器${server_ip},端口${server_port}无法访问,并且无法Ping通!"
           fi
       fi
   fi
 send_msg_to_interface
   let i++
done



  2、TCP服务器监控
  脚本:/data0/monitor/tcp.sh
引用
#!/bin/sh
LANG=C

#被监控服务器、端口列表
server_all_list=(\
192.168.1.4:11211 \
192.168.1.5:11211 \
192.168.1.6:25 \
192.168.1.7:25 \
)

date=$(date -d "today" +"%Y-%m-%d_%H:%M:%S")

#采用HTTP POST方式发送检测信息给接口程序interface.php,接口程序负责分析信息,决定是否发送报警MSN消息、手机短信、电子邮件。
send_msg_to_interface()
{
   /usr/bin/curl -m 600 -d menu=tcp -d date=$date -d ip=$server_ip -d port=$server_port -d status=$status http://127.0.0.1:8888/interface.php
}

server_all_len=${#server_all_list[*]}
i=0
while  [ $i -lt $server_all_len ]
do
   server_ip=$(echo ${server_all_list[$i]} | awk -F ':' '{print $1}')
   server_port=$(echo ${server_all_list[$i]} | awk -F ':' '{print $2}')
   if nc -vv -z -w 3 $server_ip $server_port > /dev/null 2>&1
   then
       #status:    0,http down    1,http ok    2,http down but ping ok
       status=1
       echo "服务器${server_ip},端口${server_port}能够正常访问!"
   else
       if nc -vv -z -w 10 $server_ip $server_port > /dev/null 2>&1
       then
           status=1
           echo "服务器${server_ip},端口${server_port}能够正常访问!"
       else
           if ping -c 1 $server_ip > /dev/null 2>&1
           then
               status=2
               echo "服务器${server_ip},端口${server_port}无法访问,但是能够Ping通!"
           else
               status=0
               echo "服务器${server_ip},端口${server_port}无法访问,并且无法Ping通!"
           fi
       fi
   fi
   send_msg_to_interface
   let i++
done



  3、MySQL服务器监控
  ①、MySQL是否能够连接
  ②、MySQL是否发生表损坏等错误
  ③、MySQL活动连接数是否过多
  ④、MySQL从库是否同步正常
  ⑤、MySQL从库同步延迟时间是否过大
  脚本:/data0/monitor/mysql.php
[codes=php]//$server_list[]="服务器地址:端口:帐号:密码";
$server_list[]="192.168.1.11:3306:root:password";
$server_list[]="192.168.1.12:3306:root:password";
$server_list[]="192.168.1.13:3306:root:password";

$database="mysql";

$curl = new Curl_Class();

foreach ($server_list as $server) {
   $status=1;//初始化,正常状态
 unset($data);
   $data["menu"] = "mysql";
 $data["info"] = "";
   list($data["ip"], $data["port"], $username, $password) = explode(":", $server);

   $connect = @mysql_connect($data["ip"].":".$data["port"], $username, $password);
   if(! $connect)
   {
       $status=0;
       $data["info"] = $data["info"] . "无法连接MySQL服务器\r\n";
   }
 
   $select = @mysql_select_db($database, $connect);
   $result = @mysql_query("show slave status");
   $rs_slave = @mysql_fetch_array($result);
   $result = @mysql_query("show global status like 'Threads_running'");
   $rs_threads = @mysql_fetch_array($result);
   if($rs_slave["Slave_SQL_Running"] == "No")
   {
       $status=0;//故障状态
       $data["abstract"] = "从库不同步";
       $data["info"] = $data["info"] . "Slave_SQL_Running = No\r\n";  
   }
   if($rs_slave["Slave_IO_Running"] == "No")
   {
       $status=0;
       $data["abstract"] = "从库不同步";
       $data["info"] = $data["info"] . "Slave_IO_Running = No\r\n";  
   }
   if($rs_slave["Last_Error"] != "")
   {
       $status=0;
       $data["abstract"] = "从库同步出错";
       $data["info"] = $data["info"] . "Last_Error = ".substr($rs_slave["Last_Error"], 0, 40)."\r\n";
   }
   if($rs_slave["Seconds_Behind_Master"] > 180)
   {
       $status=0;
       $data["abstract"] = "从库同步延迟时间高达".$rs_slave["Seconds_Behind_Master"]."秒";
       $data["info"] = $data["info"] . "Seconds_Behind_Master = ".$rs_slave["Seconds_Behind_Master"]."\r\n";
   }
   if($rs_threads["Value"] > 60)
   {
       $status=0;
       $data["abstract"] = "活动连接数多达".$rs_threads["Value"];
       $data["info"] = $data["info"] . "Threads_running = ".$rs_threads["Value"]."\r\n";
   }

   $data["date"] = date("Y-m-d_H:i:s");
   if($status == 0)
   {
       $post = @$curl->post("http://127.0.0.1:8888/interface.php", $data);
       echo "MySQL服务器“".$data["ip"].":".$data["port"]."”发生故障!\n";
       print_r($post);      
   }
   else
   {
       $data["failback"] = "active";//服务器正常,发送通知信息
       $post = @$curl->post("http://127.0.0.1:8888/interface.php", $data);
       echo "MySQL服务器“".$data["ip"].":".$data["port"]."”运行正常!\n";
       print_r($post);
   }
}

/**
*********************************************************************
* Curl_Class :curl 类
*********************************************************************/
class Curl_Class
{
   function Curl_Class()
   {
       return true;
   }

   function execute($method, $url, $fields = '', $userAgent = '', $httpHeaders = '',
       $username = '', $password = '')
   {
       $ch = Curl_Class::create();
       if (false === $ch)
       {
           return false;
       }

       if (is_string($url) && strlen($url))
       {
           $ret = curl_setopt($ch, CURLOPT_URL, $url);
       }
       else
       {
           return false;
       }
       //是否显示头部信息
       curl_setopt($ch, CURLOPT_HEADER, false);
       //
       curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

       if ($username != '')
       {
           curl_setopt($ch, CURLOPT_USERPWD, $username . ':' . $password);
       }

       $method = strtolower($method);
       if ('post' == $method)
       {
           curl_setopt($ch, CURLOPT_POST, true);
           if (is_array($fields))
           {
               $sets = array();
               foreach ($fields as $key => $val)
               {
                   $sets[] = $key . '=' . urlencode($val);
               }
               $fields = implode('&', $sets);
           }
           curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
       }
       else
           if ('put' == $method)
           {
               curl_setopt($ch, CURLOPT_PUT, true);
           }

       //curl_setopt($ch, CURLOPT_PROGRESS, true);
       //curl_setopt($ch, CURLOPT_VERBOSE, true);
       //curl_setopt($ch, CURLOPT_MUTE, false);
       curl_setopt($ch, CURLOPT_TIMEOUT, 600);

       if (strlen($userAgent))
       {
           curl_setopt($ch, CURLOPT_USERAGENT, $userAgent);
       }

       if (is_array($httpHeaders))
       {
           curl_setopt($ch, CURLOPT_HTTPHEADER, $httpHeaders);
       }

       $ret = curl_exec($ch);

       if (curl_errno($ch))
       {
           curl_close($ch);
           return array(curl_error($ch), curl_errno($ch));
       }
       else
       {
           curl_close($ch);
           if (!is_string($ret) || !strlen($ret))
           {
               return false;
           }
           return $ret;
       }
   }

   function post($url, $fields, $userAgent = '', $httpHeaders = '', $username = '',
       $password = '')
   {
       $ret = Curl_Class::execute('POST', $url, $fields, $userAgent, $httpHeaders, $username,
           $password);
       if (false === $ret)
       {
           return false;
       }

       if (is_array($ret))
       {
           return false;
       }
       return $ret;
   }

   function get($url, $userAgent = '', $httpHeaders = '', $username = '', $password =
       '')
   {
       $ret = Curl_Class::execute('GET', $url, '', $userAgent, $httpHeaders, $username,
           $password);
       if (false === $ret)
       {
           return false;
       }

       if (is_array($ret))
       {
           return false;
       }
       return $ret;
   }

   function create()
   {
       $ch = null;
       if (!function_exists('curl_init'))
       {
           return false;
       }
       $ch = curl_init();
       if (!is_resource($ch))
       {
           return false;
       }
       return $ch;
   }

}
?>[/codes]

  4、主动监控守护进程
  脚本:/data0/monitor/monitor.sh
引用
#!/bin/sh
while true
do
   /bin/sh /data0/monitor/http.sh > /dev/null 2>&1
   /bin/sh /data0/monitor/tcp.sh > /dev/null 2>&1
   /usr/local/php/bin/php /data0/monitor/mysql.php > /dev/null 2>&1
   sleep 10
done


  启动主动监控守护进程:
/usr/bin/nohup /bin/sh /data0/monitor/monitor.sh 2>&1 > /dev/null &



  三、被动报告监控(“被监控机”采集数据发送给“监控机”)
  1、磁盘空间使用量监控
  2、磁盘Inode使用量监控
  3、Swap交换空间使用量监控
  4、系统负载监控
  5、Apache进程数监控

  被动监控这部分,在我的文章《写完“Linux服务器监控系统 ServMon V1.1” 》中已经实现,就不再详细写出。


Tags - , , , ,

^==Back Home: www.chedong.com

^==Back Digest Home: www.chedong.com/digest/

<== 2008-06-24
  六月 2008  
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30            
==> 2008-06-26