ajax + shell + perl +CGI 脚本

 


感谢越来越好
https://blog.csdn.net/weixin_42476601/article/details/84801610

$.ajax({
url:"/getData.do"
})
请求的路径是:http://localhost:8080/getData.do

 

 

 

感谢 Seda Özses 使用 Perl、jQuery、Ajax、JSON 和 MySQL 实现简单的登录
https://www.ibm.com/developerworks/cn/webservices/ws-simplelogin/index.html


感谢jQuery之Ajax调试听语音
abc900223

https://jingyan.baidu.com/article/da1091fb3bfc85027849d61e.html


感谢shell脚本--初识CGI
寻觅beyond
https://www.cnblogs.com/-beyond/p/8564108.html

感谢 cgi+perl+ajax初探
hydah
https://www.cnblogs.com/hydah/archive/2011/10/25/cgi-javascript-ajax.html

 

 

shell脚本--初识CGI

 

  CGI按照百度百科的定义,如下:

  CGI 是Web 服务器运行时外部程序的规范,按CGI 编写的程序可以扩展服务器功能。CGI 应用程序能与浏览器进行交互,还可通过数据库API 与数据库服务器等外部数据源进行通信,从数据库服务器中获取数据。格式化为HTML文档后,发送给浏览器,也可以将从浏览器获得的数据放到数据库中。几乎所有服务器都支持CGI,可用任何语言编写CGI,包括流行的C、C ++、VB 和Delphi 等。CGI 分为标准CGI 和间接CGI两种。标准CGI 使用命令行参数或环境变量表示服务器的详细请求,服务器与浏览器通信采用标准输入输出方式。间接CGI 又称缓冲CGI,在CGI 程序和CGI 接口之间插入一个缓冲程序,缓冲程序与CGI 接口间用标准输入输出进行通信。
  
  上面这一段话第一次接触cgi,可能不懂到底什么意思,下面举一个例子方便理解。
  以Apache为例,在配置文件httpd.conf中搜索cgi关键字,下面是主要的配置
1
2
3
4
5
6
7
8
9
10
11
12
13
<IfModule alias_module>
    ScriptAlias /cgi-bin/ "/usr/local/apache/cgi-bin/"
</IfModule>
 
<IfModule cgid_module>
    #Scriptsock cgisock
</IfModule>
 
<Directory "/usr/local/apache/cgi-bin">
    AllowOverride All
    Options None
    Require all granted
</Directory>

  进入Apache下面的cgi-bin目录,创建一个文件,文件名为index.cgi,文件扩展名为.cgi,这个和php文件的扩展名是.php是一样的。

  index.cgi的内容如下:

1
2
3
4
5
6
7
#!/bin/bash
#index.cgi
 
echo "Content-Type:text/html;charset=utf-8"
echo
 
echo "hello world"

  然后在浏览器中访问localhost/cgi-bin/index.cgi,你就会看到结果如下:

 

  然后将index.cgi的内容改一下:

1
2
3
4
5
6
7
8
9
#!/bin/bash
#index.cgi
 
echo "Content-Type:text/html;charset=utf-8"
echo
 
mysql="mysql -uroot -proot"
sql="show databases"
$mysql -e "$sql"

  浏览器运行如下:

  

  其实,从上面的例子中,你就会得出一点结论,cgi就和php类似,只不过php文件中使用的使用php的语法,cgi中使用的shell命令,但是,都可以通过浏览器来运行脚本,获得结果。

  现在看一下CGI的定义:CGI 应用程序能与浏览器进行交互,还可通过数据库API 与数据库服务器等外部数据源进行通信,从数据库服务器中获取数据。格式化为HTML文档后,发送给浏览器,也可以将从浏览器获得的数据放到数据库中。

  是不是有点理解了。

 

 ################

 

 

cgi+perl+ajax初探

   本来任务要求的是用perl实现cgi脚本即可。但是普通的方法都会刷新页面。我想要的结果是不刷新页面,在原页面上进行交互。即通过cgi返回的信息可以作为原网页的部分内容。所以这需要用到ajax。

  很遗憾,在网上没有多少相关的资料。而且手边的教科书上没有说到perl和ajax的结合运用。自己胡乱摸索了一下,已经成功实现不离开页面将信息传给服务器端的cgi脚本,并将服务器端传回来的反馈信息得到,通过javascript动态改变页面内容。但是一个头疼的问题是,通过innerHTML改变div的内容后,页面会自动刷新。使得反馈信息在原页面上一闪而过。没有解决。懒得弄得了。暂时吧源码贴在这。
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<script type="text/javascript">
 
    function loadXMLDoc()
 
    {
 
    var xmlhttp;
 
    if (window.XMLHttpRequest)
 
     {// code for IE7+, Firefox, Chrome, Opera, Safari
 
     xmlhttp=new XMLHttpRequest();
 
     }
 
    else
 
     {// code for IE6, IE5
 
     xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
 
     }
 
     var url="";
 
     var name=document.getElementsByName("name")[0].value;
 
     var age=document.getElementsByName("age")[0].value;
 
     var gender=document.getElementsByName("gender")[0].value;
 
     var email=document.getElementsByName("email")[0].value;
 
     url="?name="+name+"&age="+age+"&gender="+gender+"&email="+email;
 
     alert(url);
 
    xmlhttp.open("GET","http://www.cnblogs.com/cgi-bin/infoQuesAdd1.pl"+url,false);
 
    xmlhttp.send(null);
 
    //document.getElementById("displayboard").innerHTML=xmlhttp.responseText;
 
    alert(xmlhttp.responseText);
 
    }
 
</script>

 


  通过ajax对象将获得的信息通过GET方法传到服务器端。服务器端通过perl脚本的param函数分析参数并作相应处理,且做出反馈。反馈信息由xmlhttp.responseText得到。
 
 
 
##部署 Wash 遇到的问题


1.in oracle user :we running the web program in bash to collect file

sh cash.sh db dbdb11 12.2.101.168 1528 db


2.in web

部署方法:$ cd /var/www/html/doc
-》html 目录部署在 /var/www/html/doc
$ # copy the tar.gz file from github here
$ gzip -d khailey-wash-155931c.tar.gz # name generated for github download
$ tar xvf khailey-wash-155931c.tar
$ mv khailey-wash-155931c/* .


change1:

edit cgi-bin/json_ash.sh
add:
my $MON_HOME="/tmp/MONITOR";


change2:

# 因为AJAX 需要跑的CGI 脚本 ,CGI 在 httpd.conf 配置信息如下:
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
-》CGI 部署位置/var/www/cgi-bin/

所以需要迁移文件
move all file in /var/www/html/doc/cgi-bin to /var/www/cgi-bin/


then use test command 确定能否返回数据:


http://10.200.210.187/cgi-bin/json_ash.sh (OK)

http://10.200.210.187/cgi-bin/json_ash.sh?points=60&vdb=12.2.101.168:db&type=0 (OK)

 


总结:如果

如果查不到数据:IE 界面 最下面 如下
debug data:
http://10.200.210.187/doc/html/ash.html?q=12.2.101.168:db 12.2.101.168:db z errorstart errorend /cgi-bin/json_ash.sh?points=60&vdb=12.2.101.168:db&type=0 complete


如果查得到数据,IE 界面 最下面 如下:
/cgi-bin/json_ash.sh?points=60&vdb=12.2.101.168:db&type=db,M000 102 complete

 

 

 

###sample wash 调试过程

 


1.in oracle user :we running the web program in bash to collect file

sh cash.sh dbmonopr dbmonoprdb11 12.2.101.168 1528 db


2.in web

部署方法:$ cd /var/www/html/doc
-》html 目录部署在 /var/www/html/doc
$ # copy the tar.gz file from github here
$ gzip -d khailey-wash-155931c.tar.gz # name generated for github download
$ tar xvf khailey-wash-155931c.tar
$ mv khailey-wash-155931c/* .


change1:

edit cgi-bin/json_ash.sh

->add:
my $MON_HOME="/tmp/MONITOR";

->mark:
# $vdb='192.168.1.140:o1123';

->change: AHS 默认展示最近5分钟,修改文件使得其展示最近60分钟的,一小时的
$bucket_size=5;

to
$bucket_size=60;


change2:

# 因为AJAX 需要跑的CGI 脚本 ,CGI 在 httpd.conf 配置信息如下:
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
-》CGI 部署位置/var/www/cgi-bin/

所以需要迁移文件
move all file in /var/www/html/doc/cgi-bin to /var/www/cgi-bin/


then use test command 确定能否返回数据:


http://10.200.210.187/cgi-bin/json_ash.sh (OK)

http://10.200.210.187/cgi-bin/json_ash.sh?points=60&vdb=12.2.101.168:db&type=0 (OK)

 


总结:如果

如果查不到数据:IE 界面 最下面 如下
debug data:
http://10.200.210.187/doc/html/ash.html?q=12.2.101.168:db 12.2.101.168:db z errorstart errorend /cgi-bin/json_ash.sh?points=60&vdb=12.2.101.168:db&type=0 complete


如果查得到数据,IE 界面 最下面 如下:
(解释如下 :原始网页'/cgi-bin/json_ash.sh?points='+loadpoints+'&vdb='+vdb+'&type='+sesnames )
AJAX (动态参数)=>传入参数,point=60,vdb=12.2.101.168:db,type=0, 传出参数 point=60,vdb=12.2.101.168:db,type=DBMONOPR,M000)

/cgi-bin/json_ash.sh?points=60&vdb=12.2.101.168:db&type=DBMONOPR,M000 102 complete


use guide:
http://10.200.210.187/doc/html/ash.html?q=12.2.101.168:db

 

因为图标展示主要使用到开源工具Highcharts,highchar 时间轴又是获取距1970年1月1日0时0分0秒的毫秒数表示时间,也就是时间戳
根据描述,历史数据只保留7天,所以我们如果想查询7天之内的历史,实现得使用 如下网页 将UTC 时间 转化 获取一个时间戳,

https://tool.lu/timestamp/
比如2020-05-30 00:48:48
转成时间戳
1590770928

 

那么查询历史数据可以

http://10.200.210.187/doc/html/ash.html?q=12.2.102.48:pas

/cgi-bin/json_ash.sh?&get_details=1&beg_epoch='+beg_epoch+'&end_epoch='+end_epoch+'&vdb='+vdb+'&points='+loadpoints+'&type='+0,

 

/cgi-bin/json_ash.sh?&get_details=1&end_epoch=


http://10.200.210.187/cgi-bin/json_ash.sh?points=60&vdb=12.2.102.48:pas&type=0&_=1590821764659

http://10.200.210.187/cgi-bin/json_ash.sh?points=60&vdb=12.2.102.48:pas&type=0&_=1590770928000

json_ash.sh
points
vdb
json_ash.sh

 

PS:
发现一个小问题,/tmp/num 这个文件增长很快,
$ ls -tlr /tmp/num

检查发现json_ash.sh 下面语句相关,应该是调试用语句,如果就觉得太大,可以考虑屏蔽

system("echo name $name value $value >> /tmp/num ");

#########


感谢mateuszkornecki
https://www.highcharts.com/forum/viewtopic.php?f=9&t=43787&p=154811&hilit=epoch#p154811
How to convert epoch time to browser specific time
epotch time 就是javascript 计算时间戳的方式
UTC 就是2020 可识别的格式
2者之间需要转换


所以只能使用UTC 时区 解析该网站,UTC 网站解析的结果https://www.unixtimestamp.com/index.php


网页
比如1590770928
转成时间戳
2020-05-30 00:48:48


感谢www.highcharts的中文论坛

https://www.highcharts.com.cn/docs/basic-axis

时间轴。时间使用和Javascript 日期对象一样,即用一个距1970年1月1日0时0分0秒的毫秒数表示时间,也就是时间戳。
更多Javascript 日期对象请阅读 W3C school 相关内容。
Highcharts有很多时间格式化函数,列举如下:

1)Date.getTime()
获取当前时间戳。实例用法如下:

time = Date.getTime(); //time = 1384442746960 (ms) 当前时间为 2013-11-14 23:25:46


感谢越来越好
https://blog.csdn.net/weixin_42476601/article/details/84801610

$.ajax({
url:"/getData.do"
})
请求的路径是:http://localhost:8080/getData.do


http://10.200.210.187/doc/html/cgi-bin/json_ash.sh?points=60&vdb=12.2.101.168:db&type=0


http://10.200.210.187/doc/cgi-bin/json_ash.sh?points=60&vdb=12.2.101.168:db&type=0
http://10.200.210.187/doc/cgi-bin/json_ash.pl?points=60&vdb=12.2.101.168:db&type=0

 


change:
--ash.html
--change:
-- url: '/cgi-bin/json_ash.sh?points='+loadpoints+'&vdb='+vdb+'&type='+sesnames,

-- url: '../cgi-bin/json_ash.sh?points='+loadpoints+'&vdb='+vdb+'&type='+sesnames,

 


感谢 Seda Özses 使用 Perl、jQuery、Ajax、JSON 和 MySQL 实现简单的登录
https://www.ibm.com/developerworks/cn/webservices/ws-simplelogin/index.html


感谢jQuery之Ajax调试听语音
abc900223

https://jingyan.baidu.com/article/da1091fb3bfc85027849d61e.html


感谢shell脚本--初识CGI
寻觅beyond
https://www.cnblogs.com/-beyond/p/8564108.html

感谢 cgi+perl+ajax初探
hydah
https://www.cnblogs.com/hydah/archive/2011/10/25/cgi-javascript-ajax.html

 

 

#####20200530 peng 修改

->query string parameter

(ash.html)
->add 102 LINE

# beg_epoch=partsArray[2];
# end_epoch=partsArray[3];

->change
line 332:
# url: '/cgi-bin/json_ash.sh?points='+loadpoints+'&vdb='+vdb+'&type='+sesnames,
to
# url: '/cgi-bin/json_ash.sh?points='+loadpoints+'&vdb='+vdb+'&type='+sesnames+'&end_epoch='+end_epoch,

to
# url: '/cgi-bin/json_ash.sh?points='+loadpoints+'&vdb='+vdb+'&type='+sesnames+'&beg_epoch='+beg_epoch+'&end_epoch='+end_epoch,

 

(cgi-bing/json)
line 9:

add:
#$beg_epoch=@ARGV[3];
#$end_epoch=@ARGV[4];


line 31:
#add:
#$get_details=1;


change:
cgi-bing/json 打开debug
$foo="echo \'$ENV{'QUERY_STRING'}\' > /tmp/ash_args.txt";
system($foo);


add :
$kyle=1;

->调试CGI 脚本的方法 :就可以在CGI 脚本里,通过print 函数,在网页chrome 端观察 执行结果
具体方法F12/network, 选择CGI 脚本执行的路径,然后 选择 preview 菜单,可以看到 对应print 函数结果

调试完成后,需要关闭debug ,mark
#$kyle=1;

 

##碰到问题,采集日志为显示的时间戳为
1590768108

1590769308
应该是5/30 22:30

http://10.200.210.187/doc/html/ash.html?q=12.2.101.168:db=1590768108=1590769308

但是转换成时间戳为
-》5/31 6:30 估计跟时区相关,默认走的是UTC 模式,而不是东八区模式,如果数据来源来自 U
-》东八区转成UTC 网站是正确的,但是原数据不正确,所以不能用转成东八区的 的网站转换, https://c.runoob.com/front-end/852
->https://www.sojson.com/unixtime.html

-》时间戳(Unix timestamp)
1591091280

转成 北京时间:
2020/6/2 19:4:40

转成UTC 时间就是 -8
1591091280996.384 这个时间代表 06/02/2020 @ 11:04am (UTC)


-》经过一下午测试,调试了半天,由于该网站 自动调用了oracle 的 timestamp SQL 如下,没有考虑到东八区,

select
(cast(sysdate as date)-to_date('01-JAN-1970','DD-MON-YYYY'))*(86400) from dual;
=1591091280

( 正确的oracle转换unix timestampe,应该是这些SQL, 但是时区转换成图表,可能又有问题,所以暂时不动
。-- 时间转 10位时间戳
select (sysdate - TO_DATE('19700101', 'yyyymmdd')) * 86400 -
TO_NUMBER(SUBSTR(TZ_OFFSET(sessiontimezone), 1, 3)) * 3600
from dual;

-- 10位时间戳 转 时间
select TO_DATE('19700101', 'yyyymmdd') + 1516862035 / 86400 +
TO_NUMBER(SUBSTR(TZ_OFFSET(sessiontimezone), 1, 3)) / 24
from dual;

所以只能使用UTC 时区 解析该网站,UTC 网站解析的结果https://www.unixtimestamp.com/index.php

1591091280996.384 这个时间代表 06/02/2020 @ 11:04am (UTC),相当于6/2 19:04 (东八区)

 

可以使用如下方法可以调试出UTC timestampe 转成 UTC 时区的结果。
https://www.unixtimestamp.com/index.php

 

->调试javascripts 方法

F12/sources / 在有问题的行数 line 355设置断点

比如 if ( key == "Other" ) oth=val; // 0

/重新刷新网页/ 就可以在右边的watch 看debug 结果

看结果:鼠标移动到变量,停止3秒,变量变黄,就可以查看变量结果了。

开结果2,有的时候,在调试debug点 之前的变量,都会在每行末尾 加红色 显示
(有时候source 里面看不到JS 代码,这个时候可以 将右边的 breakpoint 的部分拿掉 即可,重新刷新既可以出来新结果)

 

(下方可以看到断点的详细信息,如监控变量、调用栈、事件等。如下图所示)

##感谢shaoweibd

https://jingyan.baidu.com/article/9113f81b64b9da2b3214c72e.html

 

 


##感谢runoob 教程
setTimeout() 是属于 window 的方法,该方法用于在指定的毫秒数后调用函数或计算表达式。

语法格式可以是以下两种:

setTimeout(要执行的代码, 等待的毫秒数)
setTimeout(JavaScript 函数, 等待的毫秒数)

##add ash.html

 

#########20200603

1.为了测试历史数据,
-》 我们需要新加 一张 html报表 , 通过 历史数据  走的 另一张表, 用另一张表 来显示历史数据
->为了不影响现有数据,我们通过复制ash.html 和 json_ash.sh,

-》cp ash.html to ash_his.html
->cp json_ash.sh to json_ash_his.sh

-> ash_his.html
1)修改line 109
chnage
loadata
to
getDetails

2)remove 110 ~128 line

3)修改line 511

channge
json_ash.sh
to
json_ash_his.sh

修改后如下:
url: '/cgi-bin/json_ash_his.sh?&get_details=1&beg_epoch='+beg_epoch+'&end_epoch='+end_epoch+'&vdb='+vdb+'&points='+loadpoints+'&type='+0,


4.1).由于当前版本的 的beg_epoch 和 end_epotch 都来自event 事件触发产生的脚本,所以我们需要在ash.html URL 页面添加这2个字段


->line 91 and line 92 add
var beg_epoch = "x";
var end_epotch = "x";

->line 100 and line 101 add

#beg_epoch=partsArray[2];
#end_epoch=partsArray[3];

beg_epoch=parseInt(partsArray[2]);
end_epoch=parseInt(partsArray[3]);

$("#debug").append(" ");
$("#debug").append(vdb);


5.)调试过程,大概思路 如下;

5.1 在正常的页面 截取一段事件,http://10.200.210.187/doc/html/ash.html?q=12.2.101.168:db

在最下面的debug 区,会短暂的出现5秒这些信息;我们可以知道timestampe事件

min=1591175911040.5176max=1591176385967.8303 z
/cgi-bin/json_ash.sh?&get_details=1&beg_epoch=1591175911040.5176&end_epoch=1591176385967.8303&vdb=12.2.101.168:db&points=60&type=0 after_top_sql complete

利用UTC 网站完成转换https://www.unixtimestamp.com/index.php
1591175911040.517/1000= 06/03/2020 @ 9:18am (UTC)
1591176385967.8303/1000 =06/03/2020 @ 9:26am (UTC)

-》网站调试
http://10.200.210.187/doc/html/ash_his.html?q=12.2.101.168:db=1591175911040.517=1591176385967.8303


6).charts 现在又出不来时间 VDBS:AAS 这个char 又出不来
events: { load: loadData ,

xAxis: { type: 'datetime', labels: {enabled:true}},


6.1).打开json_ash_his.sh line 30 ,调试,通过F12/network/js_name/preview 查看结果
#$kyle=1;

#打开line 216/217/218
#print "xx sql->{$sql_id,$wait_class}=$sql->{$sql_id,$wait_class}\n" ;
#print "xx sql->{$sql_id,$wait_class}=$sql->{$sql_id,$wait_class}\n" if defined($kyle);
#print "$end_epoch, $wait_class, $bar->{$end_epoch,$wait_class} \n" if defined($kyle);


##line 219 加入
#print "bar->{$cur_epoch,$wait_class}=$bar->{$cur_epoch,$wait_class}\n";


#打开line 250/247
#print "[$tm,";
#print "$val],";

##line 249 加入
# print "$val],";

#并关闭line 252,254
print "[$tm,$val],";
print "[$tm,$val],";

 


#修改json_ash_his.sh line 237

# if ( $get_details!=1 ) {
#修改为
if ( $get_details=1 ) {


#修改line 294
if ( $get_details!=1 ) {
修改为
if ( $get_details=1 ) {

 

6.2 在ash_hist.html line 122 行加入
/ two ways to output the arrays from perl cgi
chartvdbaas.series[0].setData(oth, false, true);
chartvdbaas.series[1].setData(que, false, true);
chartvdbaas.series[2].setData(net, false, true);
chartvdbaas.series[3].setData(adm, false, true);
chartvdbaas.series[4].setData(cnf, false, true);
chartvdbaas.series[5].setData(com, false, true);
chartvdbaas.series[6].setData(cnc, false, true);
chartvdbaas.series[7].setData(app, false, true);
chartvdbaas.series[8].setData(sio, false, true);
chartvdbaas.series[9].setData(uio, false, true);
chartvdbaas.series[10].setData(sch, false, true);
chartvdbaas.series[11].setData(cpu, false, true);

##问题如下:JS 调用返回
500 (Internal Server Error)

检查apatch 日志
[Wed Jun 03 16:45:21 2020] [error] [client 10.200.210.164] (8)Exec format error: exec of '/var/www/cgi-bin/json_ash_his.sh' failed, referer: http://10.200.210.187/doc/html/ash_his.html?q=12.2.101.168:db=1591175911040.517=1591176385967.8303
[Wed Jun 03 16:45:21 2020] [error] [client 10.200.210.164] Premature end of script headers: json_ash_his.sh, referer: http://10.200.210.187/doc/html/ash_his.html?q=12.2.101.168:db=1591175911040.517=1591176385967.8303


检查json_ash_his.sh

首行打错了@####

去掉即可

##6.2)对比正常的ash.html 返回的JSON 结果,发现返回值在120个

##比如如下:
##User_I/O
##:
##[[1591196880000, 0], [1591196939999, 0], [1591196940000, 0], [1591196999999, 0], [1591197000000, 0],…]
##[0 … 99]
###[100 … 119]

 

########20200604

1.感谢 一個頭像用四年 huzongnan/

JSON
JSON 轻量级的数据交换格式
JSON 用来表示对象和数组
// JSON 用来表示对象和数组
// 通过 JS 自带的 JSON.parse 可以把 JSON 格式的字符串,转化为对象

2).json 调试

感谢Nick_Spider

https://blog.csdn.net/weixin_39198406/article/details/84789515

效果就是下面这样子,开始还以为代码很复杂,实际上一句JSON.stringify(data, null, "\t")就解决了。


<body>
<textarea id="search_one_result" cols="50" rows="10" style="margin-top: 30px"></textarea>
</body>

$("#search_one_result").val(JSON.stringify(data, null, "\t"));

$("#search_one_result").val(JSON.stringify(data, null, 4));

 

2.1)ash_his.html

line 12 加入

<textarea id="search_one_result" cols="50" rows="10" style="margin-top: 30px"></textarea>

line 600 加入
$("#search_one_result").val(JSON.stringify(cpu, null, "\t"));

$("#search_one_result").val(JSON.stringify(cpu, null, 4));


line 650 加入
chartvdbaas.redraw(false);

 

#3)总算可以出来数据,但是有发现一个问题,返回的时间戳是现在的时间戳

#预期的时间是上午9点
#1591175911040.517
#1591176385967.8303


#返回的时间是下午当前5点的时间
#1591293120000


3)为了查看linux (最近7天)历史时间数据
再次
需要在hist.sh 图做一个转码,使得查看历史数据,可以进入对应的目录查询txt:详情请见如下:


date -d @Unix timestamp
date -d @1591175911
[root@yumserver 4]# date -d @1591175911
Wed Jun 3 17:18:31 CST 2020

计算方法:

实际时间2日 9点19分左右,需要做一个 减法处理 8*3600
expr 1591175911 - 8*3600

 


######20200605

1).
-》json_ash_his.sh

mark line 39 ~ 44 line

mark line 49


add line 83


$epoc = $beg_epoch/1000 - 8 * 60 * 60;
#print $epoc;
my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime($epoc);
$curr_date=$wday;
#print "curr_date=$curr_date\n";
chomp($curr_date);

$MON_DATA=$MON_HOME . "/" . $curr_date;

print "MON_DATA=$MON_DATA\n";
chdir("$MON_DATA") or die "Can't chdir to $MON_DATA $!";

 

 


2)经过测试 ,收集脚本 sh cash.sh 连接数据库进程,属于长连接,也就是说 在数据库服务器端kill session 后,这个收集进程就不会再连接数据库。
对数据库没有影响。
但是在10.200.210.187 端,脚本还是一直会记录日志,一直报ORA- 报错,
所以还是在收集端,kill -9 cash.sh 进程才可以

 

3).ash_his.html

line 118 ~ 135 如下行,

selection: function(event) {
if (event.xAxis) {
beg_epoch=event.xAxis[0].min;
end_epoch=event.xAxis[0].max;
//getDetails ;
setTimeout(getDetails, 1);
//$debug.html('min='+ beg_epoch);
//$debug.html('max='+ end_epoch);
//$debug.html('min: '+ event.xAxis[0].min +', max: '+ event.xAxis[0].max);
$debug.html(' ');
$("#debug").append('min='+ beg_epoch);
$("#debug").append('max='+ end_epoch);
} else {
beg_epoch=0;
end_epoch=0;
$debug.html ('Selection reset');
setTimeout(getDetails, 1);
}
}


3.3).完成历史数据(7天内,超过7天的就会被覆盖,防止历史文件太大)收集工作,并在前台展示工作,
使用方法如下:

http://10.200.210.187/doc/html/ash_his.html?q=12.2.101.168:db=1591175911040.517=1591176385967.8303
=12.2.101.168:db is DB info
=1591175911040.517 is begin epoch
=1591176385967.8303 is end epoch

具体epoch 对应的时间,因为上面的是微妙。所以要除以1000的值,在使用如下网站解析,所以只能使用UTC 时区 解析该网站,UTC 网站解析的结果https://www.unixtimestamp.com/index.php


4).监控一个小库一天4M左右的数据量,保留7天。

5).
[root@yumserver old]# ls -ltr /var/www/html/doc/cash.sh
-rw-r--r-- 1 root root 22210 Jun 30 2017 /var/www/html/doc/cash.sh
[root@yumserver old]# ls -tlr /tmp/dba/wash/wash-master/cash.sh
-rwxrwxrwx 1 oracle11g oinstall 22210 May 30 10:42 /tmp/dba/wash/wash-master/cash.sh

chmod 777 /var/www/html/doc/cash.sh


6),.修改2处(/tmp/和 /var/wwww 目录)cash.sh line 148 ~149 如下:


#CONNECT="$UN/$PW@(DESCRIPTION= (ADDRESS_LIST= (ADDRESS= (PROTOCOL=TCP) (HOST=$HOST) (PORT=$PORT))) (CONNECT_DATA= (SERVER=DEDICATED) (SID=$SID)))"
CONNECT="$UN/$PW@(DESCRIPTION= (ADDRESS_LIST= (ADDRESS= (PROTOCOL=TCP) (HOST=$HOST) (PORT=$PORT))) (CONNECT_DATA= (SERVER=DEDICATED) (SERVICE_NAME=$SID)))"


oracle 用户后台调用如下脚本开启 收集工作
sh cash.sh dbmgr db1234DBA 10.197.1.203 core 1528

前端收集
http://10.200.210.187/doc/html/ash.html?q=10.197.1.203:core


######


date -d @`expr 1591175911 - 28800`
date -d @`expr 1591175911 - 28800`
date +%w -d @`expr 1591175911 - 28800`
##感谢郭冬_DevOps。cuonglm,阿炯,Andomar
###http://www.freeoa.net/development/perl/perl-convert-unix-timestamp-to-datetime_2575.html
##感谢/www.w3cschool.cn

perl -le 'print scalar localtime 1591175911-28800;'


$epoc = time();
$epoc = $epoc - 24 * 60 * 60; # 一天前的时间秒数
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($epoc);
print "昨天时间和日期:";
printf("%d-%d-%d %d:%d:%d",$year+1990,$mon+1,$mday,$hour,$min,$sec,,$wday);

print "\n";

 

 

###感谢sily-boy https://www.cnblogs.com/sily-boy/p/1270927.html
Highcharts 基本曲线图


###感谢 官方文档, 在线实例:https://api.highcharts.com.cn/highcharts
在线实例: 更新数据列数据,更新饼图数据

highchart 知识太多,所以开启出一个新版本的文本,highchart.txt 来看

https://jshare.com.cn/highcharts/hhhhf0
https://jshare.com.cn/highcharts/hOPfGA


###感谢 runoob
https://www.runoob.com/perl/perl-operators.html

 

## perl 定义二维数组
定义数组:
$bar->{$cur_epoch,$wait_class}++;

print "$end_epoch, $wait_class, $bar->{$end_epoch,$wait_class} \n"

##感谢highcharts.com.cn/#

tooltip
数据提示框指的当鼠标悬停在某点上时,以框的形式提示该点的数据,比如该点的值,数据单位等。数据提示框内提示的信息完全可以通过格式化函数动态指定;通过设置 tooltip.enabled = false 即可不启用提示框。

 

##感谢
https://www.jb51.net/article/33967.htm
mymymymymy

如果字符串结尾有换行符,chomp 可以去掉它。这基本上就是它能完成的所有功能,如下例:
$text = “a line of text/n”; #也可以由<STDIN>输入
chomp($text); #去掉换行符(/n)。

 

##感谢me

$a = 20;
$sql_id = 'aaaa';
$total++;
$topsql{$sql_id}++;
$sql->{$sql_id}++;

print "$a\n";
print "$total\n";
print "$sql_id\n";
print "$sql->{$sql_id}\n";


$a 定义变量
$topsql{$sql_id}++ 定义一个整数型变量
$sql->{$sql_id}++; 定义一个整数型变量
####感谢xiehuahere

谁知道perl编程里的s/^\s+//; 这个语句是什么意思?

^ 匹配行首(字抄符串开始位置)
\s 匹配任意的袭空白符,包括空格,制表符(Tab)等
+ 表示重复bai前一个字符至少1次(1次或多次)
s/A/B/ 结构将du正则A匹配到的内容替换为B。
所以,这里的意思大zhi致就是:去dao除行首的所有空白符。


##感谢 陈明超
用Math.max和Math.min方法可以迅速得到结果。apply能让一个方法指定调用对象与传入参数,并且传入参数是以数组形式组织的。恰恰现在有一个方法叫Math.max,调用对象为Math,与多个参数

Array.max = function( array ){
return Math.max.apply( Math, array );
};
Array.min = function( array ){
return Math.min.apply( Math, array );
};

-》

 
 
##########sample 
 

How To Troubleshoot Your CGI Scripts – Internal Server Error 500

If you try to use a CGI script on your web page and you get an Internal Server Error 500, this means that the CGI script did not execute properly. There are several causes that can generate this error, so a few things will need to be checked. 

 

STEP 1: Check Permissions and Group Ownership

To start, you’ll want to check the /var/log/httpd/suexec_log. The log contains any errors that would result from not having correct permissions set on the file.

The file needs to be in a cgi-bin and must have the owner/group as the username who owns the site. If it’s owned be anyone else, it will not run. Also, the script must have execute permission.

The most common chmod permission is 755 (or rwxr-xr-x). You’ll need to go through all your directories from the public_html down to the directory the script is in, making sure that all permissions are set to 755 (*Note: public_html can be 750 *only* if it has a group of apache).

 

If Using a Hivelocity Server (Special Requirements)

If you’re one of our customers and you’re experiencing an Internal Server Error 500 on your CGI scripts, then it might be due to missing requirements specific to our servers. The Apache Server software that we run on our Hivelocity web servers has certain group ownership and permissions requirements for CGI scripts. Please check to see that your script meets the following requirements:

  • The directory the CGI script resides in must not be writable by other or by group users.
     
  • The CGI script itself must not be writable by other or by group users.
     
  • CGI script must not have the setuid bit set.
     
  • You must call SSI execs by their full pathname. For example, if you are running a UNIX command located on the web server it would look something like this:
     
    <!--#exec cmd="/usr/bin/date"-->

     

    If you are running a script that is in your pcgi-bin, it might look something like this for corp-web customers:
     
    <!--#exec cmd="/htdocs/youruserid/pcgi-bin/bar.pl"-->

    and like this for cheap-web and personal web customers:

    <!--#exec cmd="/htdocs/userdirs/youruserid/pcgi-bin/bar.pl"-->

  • The target userid may not be < 100 and the target gid may not be < 20. This rule only affects staffers’ CGI scripts. Staffers must chgrp their scripts to group users or some other group.
     
  • The minimum permissions for CGI scripts is mode 500. For CGI compiled programs, the minimum permissions is mode 100. You can of course grant more permissions if you wish. 
     
  • The minimum permissions for server-parsed-html (.shtml) files is mode 004 (readable by other), and exec files included therein must be at least mode 700 for scripts and mode 500 for binaries.

 

STEP 2: Troubleshooting your CGI Script

If you’ve checked the suexec_log and it only shows the script being run, then it might not be an issue with permissions. The cause of the error may be within the script code itself.

The easiest way to figure out script coding problems is to first run the script manually from an ssh prompt. You can do that using a variation of the following commands:

cd /home/username/domains/domain.com/public_html/cgi-bin

./script.cgi

One common error is the use of an incorrect interpreter. The two most common interpreters are:

#!/usr/bin/perl

and

#!/usr/local/bin/php

This code must appear on the first line of the script.

Sometimes, a file is uploaded in Windows format causing the trailing newline (return) character to form incorrectly. In this instance, the file would need to be re-uploaded in a different format.

Another error that could be generated when running the script manually from ssh would be missing perl modules. If you’re missing perl modules, you’ll need to install them manually. Using CPAN (The Comprehensive Perl Archive Network) is the easiest method to install new perl modules. This can be done with the following command:

eg: perl -e shell -MCPAN install Bundle::DBD::mysql

 

Need More Personalized Help?

If you have any further issues, questions, or would like some assistance checking on this or anything else, please reach out to us from your my.hivelocity.net account -> Support and provide your server credentials within the encrypted field for the best possible security and support.

If you are unable to reach your my.hivelocity.net account or if you are on the go, please reach out from your valid my.hivelocity.net account email to us here at: support@hivelocity.net. We are also available to you through our phone and live chat system 24/7/365.

 

Additional Links:

Looking for more information on Internal Server Error 500? Search our Knowledge Base!  

In need of more great content? Interested in cPanelPrivate Cloud, or Colocation? Check out our recent posts for more news, guides, and industry insights!

Share on Twitter
Share on Facebook
posted @ 2020-05-28 15:29  feiyun8616  阅读(655)  评论(0编辑  收藏  举报