成就梦想

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  21 随笔 :: 22 文章 :: 6 评论 :: 0 Trackbacks

2017年3月1日 #



1,nagios install 参考官方 

https://assets.nagios.com/downloads/nagioscore/docs/Installing_Nagios_Core_From_Source.pdf#_ga=1.136427443.2075387674.1488266439

上面只是参考,请自行安装最新版本的nagios,并自行忽略掉Apache的配置,我们来配置nginx支持nagios。

2,理解什么是cgi。fastcgi。写的非常棒。要多棒有多棒。

参考文章:http://www.cnblogs.com/skynet/p/4173450.html





3,上文理解了,就好办了。我们的目的就是让nginx支持执行我们nagios下的cgi。nginx基于安全性等考虑不让直接执行cgi,但支持fastcgi,所以我们要用到一个fastcig的warp来封装cgi

github上开源的项目 fcgiwarp https://github.com/gnosek/fcgiwrap


git clone https://github.com/gnosek/fcgiwrap.git

autoreconf -i
./configure
make
make instal
ps:
如果aotoreconf执行不了,请自行安装autoreconf。


然后就是怎么使用fcgiwarp ,作者提到了2种使用方法(针对这2种方法在nginx配置稍微不同):

usage

Most probably you will want fcgiwrap be launched by www-servers/spawn-fcgi. Or you could use the author's Perl launcher - see the homepage for that.



第1种是作者自己写的perl 的启动器:作者说在他的主页呢。。。。copy一下放在下面
#!/usr/bin/perl

use strict;
use warnings FATAL => qw( all );

use IO::Socket::UNIX;

my $bin_path = '/usr/local/bin/fcgiwrap';
my $socket_path = $ARGV[0] || '/tmp/cgi.sock';
my $num_children = $ARGV[1] || 1;

close STDIN;

unlink $socket_path;
my $socket = IO::Socket::UNIX->new(
    Local => $socket_path,
    Listen => 100,
);

die "Cannot create socket at $socket_path: $!\n" unless $socket;

for (1 .. $num_children) {
    my $pid = fork;
    die "Cannot fork: $!" unless defined $pid;
    next if $pid;

    exec $bin_path;
    die "Failed to exec $bin_path: $!\n";
}

我们把这个文件保存成 /etc/init.d/fcgiwrap 做成服务执行即可。


第二种方法是用fastcgi的进程管理器来启动。

还是GitHub上开源的牛逼项目
spawn-fcgi   https://github.com/lighttpd/spawn-fcgi

我们写一个启动脚本 

 

spawn-fcgi -f /usr/local/sbin/fcgiwrap -p 9009                       这个端口自己根据机器的端口使用情况自己来写



最后贴一个nginx简单的配置。

vim /etc/nginx/conf.d/nagios.conf  #根据自己的nginx启动位置自行调整


server {
        server_name nagios.tony.com;  #自己的域名
        access_log /var/log/nginx/nagios-access.log;
        error_log /var/log/nginx/nagios-error.log; #日志位置,发现nagios不能在浏览器展示,请看日志,看日志,

#       auth_basic "Private";
#
       auth_basic_user_file /etc/nagios/htpasswd.users;   #把认证先去掉。跑起来在说在。 要把 /usr/local/nagios/etc/cgi.cfg  中的use_ssl_authentication=0


        root /usr/local/nagios/share; #/usr/local/nagios   nagios安装目录
        index index.php index.html;

    #php 的配置,请自行去解决。
         location ~ \.php$ {  
            include /etc/nginx/fastcgi_params;
            fastcgi_pass  127.0.0.1:9000; #php-fpm 
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
                                    }
        location /nagios {
             alias /usr/local/nagios/share;
                                }

         location ~ \.cgi$ {
                root /usr/local/nagios/sbin;
                rewrite ^/nagios/cgi-bin/(.*)\.cgi /$1.cgi break;
                include /etc/nginx/fastcgi_params;

                fastcgi_param AUTH_USER $remote_user;
                fastcgi_param REMOTE_USER $remote_user;
                fastcgi_param SCRIPT_FILENAME /usr/local/nagios/sbin/$fastcgi_script_name;
                fastcgi_pass  unix:/tmp/cgi.sock; #这是上面第一种方式的配置。
                #fastcgi_pass  127.0.0.1:9009; #这是上面第二种方式的配置。
                                }
}
posted @ 2017-03-01 11:35 iamct 阅读(21) | 评论 (0)编辑 收藏

2014年5月22日 #

     摘要: 世界邦超级自由行,广募天下英雄豪杰 如果你想找的不仅仅是一个工作机会,不仅仅是一份薪水,而是一个共同为之奋斗的事业,如果你偏偏对旅行又情有独钟,从内心地热爱旅行,并拥有创业的激情,那么世界邦会是你不二的最佳选择。   一、旅游产品销售 (电话销售)  职位职责: 1、通过电话与客户进行有效沟通了解客户需求, 寻找销售机会; 2、对...  阅读全文
posted @ 2014-05-22 11:02 iamct 阅读(161) | 评论 (0)编辑 收藏

2012年11月6日 #

高工资后面意味着高能力,高付出,高责任感,高压力,高考核,高绩效。高产出
posted @ 2012-11-06 13:19 iamct 阅读(217) | 评论 (0)编辑 收藏

2012年6月14日 #

     摘要:   阅读全文
posted @ 2012-06-14 17:20 iamct 阅读(164) | 评论 (0)编辑 收藏

     摘要: DMA(Direct Memory Access,直接内存存取) 在实现DMA传输时,是由DMA控制器直接掌管总线,因此,存在着一个总线控制权转移问题。即DMA传输前,CPU要把总线控制权交给DMA控制器,而在结束DMA传输后,DMA控制器应立即把总线控制权再交回给CPU。一个完整的DMA传输过程必须经过下面的4个步骤:1,DMA请求2,DMA响应3,DMA传输4,DMA结束DMA与cpu 使用内...  阅读全文
posted @ 2012-06-14 11:49 iamct 阅读(200) | 评论 (0)编辑 收藏

2012年5月26日 #

转自:http://article.yeeyan.org/view/58906/257928

许多人用shell脚本完成一些简单任务,而且变成了他们生命的一部分。不幸的是,shell脚本在运行异常时会受到非常大的影响。在写脚本时将这类问题最小化是十分必要的。本文中我将介绍一些让bash脚本变得健壮的技术。

使用set -u

你因为没有对变量初始化而使脚本崩溃过多少次?对于我来说,很多次。

chroot=$1 ... rm -rf $chroot/usr/share/doc
如果上面的代码你没有给参数就运行,你不会仅仅删除掉chroot中的文档,而是将系统的所有文档都删除。那你应该做些什么呢?好在bash提供了set -u,当你使用未初始化的变量时,让bash自动退出。你也可以使用可读性更强一点的set -o nounset

david% bash /tmp/shrink-chroot.sh

$chroot=

david% bash -u /tmp/shrink-chroot.sh

/tmp/shrink-chroot.sh: line 3: $1: unbound variable

david%

使用set -e

你写的每一个脚本的开始都应该包含set -e。这告诉bash一但有任何一个语句返回非真的值,则退出bash。使用-e的好处是避免错误滚雪球般的变成严重错误,能尽早的捕获错误。更加可读的版本:set -o errexit

使用-e把你从检查错误中解放出来。如果你忘记了检查,bash会替你做这件事。不过你也没有办法使用$?来获取命令执行状态了,因为bash无法获得任何非0的返回值。你可以使用另一种结构:

command

if [ "$?"-ne 0]; then echo "command failed"; exit 1; fi

可以替换成:

command || { echo "command failed"; exit 1; }

或者使用:

if ! command; then echo "command failed"; exit 1; fi

如果你必须使用返回非0值的命令,或者你对返回值并不感兴趣呢?你可以使用 command || true ,或者你有一段很长的代码,你可以暂时关闭错误检查功能,不过我建议你谨慎使用。

set +e

command1

command2

set -e

相关文档指出,bash默认返回管道中最后一个命令的值,也许是你不想要的那个。比如执行 false | true 将会被认为命令成功执行。如果你想让这样的命令被认为是执行失败,可以使用 set -o pipefail

程序防御 - 考虑意料之外的事

你的脚本也许会被放到“意外”的账户下运行,像缺少文件或者目录没有被创建等情况。你可以做一些预防这些错误事情。比如,当你创建一个目录后,如果父目录不存在,mkdir 命令会返回一个错误。如果你创建目录时给mkdir命令加上-p选项,它会在创建需要的目录前,把需要的父目录创建出来。另一个例子是 rm 命令。如果你要删除一个不存在的文件,它会“吐槽”并且你的脚本会停止工作。(因为你使用了-e选项,对吧?)你可以使用-f选项来解决这个问题,在文件不存在的时候让脚本继续工作。

准备好处理文件名中的空格

有些人从在文件名或者命令行参数中使用空格,你需要在编写脚本时时刻记得这件事。你需要时刻记得用引号包围变量。

if [ $filename = "foo" ];

$filename变量包含空格时就会挂掉。可以这样解决:

if [ "$filename" = "foo" ];

使用$@变量时,你也需要使用引号,因为空格隔开的两个参数会被解释成两个独立的部分。

david% foo() { for i in $@; do echo $i; done }; foo bar "baz quux"

bar

baz

quux

david% foo() { for i in "$@"; do echo $i; done }; foo bar "baz quux"

bar

baz quux

我没有想到任何不能使用"$@"的时候,所以当你有疑问的时候,使用引号就没有错误。

如果你同时使用find和xargs,你应该使用 -print0 来让字符分割文件名,而不是换行符分割。

david% touch "foo bar"

david% find | xargs ls

ls: ./foo: No such file or directory

ls: bar: No such file or directory

david% find -print0 | xargs -0 ls

./foo bar

设置的陷阱

当你编写的脚本挂掉后,文件系统处于未知状态。比如锁文件状态、临时文件状态或者更新了一个文件后在更新下一个文件前挂掉。如果你能解决这些问题,无论是 删除锁文件,又或者在脚本遇到问题时回滚到已知状态,你都是非常棒的。幸运的是,bash提供了一种方法,当bash接收到一个UNIX信号时,运行一个 命令或者一个函数。可以使用trap命令。

trap command signal [signal ...]

你可以链接多个信号(列表可以使用kill -l获得),但是为了清理残局,我们只使用其中的三个:INTTERMEXIT。你可以使用-as来让traps恢复到初始状态。

信号描述

INT

Interrupt - 当有人使用Ctrl-C终止脚本时被触发

TERM

Terminate - 当有人使用kill杀死脚本进程时被触发

EXIT

Exit - 这是一个伪信号,当脚本正常退出或者set -e后因为出错而退出时被触发





当你使用锁文件时,可以这样写:

if [ ! -e $lockfile ]; then

touch $lockfile

critical-section

rm $lockfile

else

echo "critical-section is already running"

fi

当最重要的部分(critical-section)正在运行时,如果杀死了脚本进程,会发生什么呢?锁文件会被扔在那,而且你的脚本在它被删除以前再也不会运行了。解决方法:

if [ ! -e $lockfile ]; then

trap " rm -f $lockfile; exit" INT TERM EXIT

touch $lockfile

critical-section

rm $lockfile

trap - INT TERM EXIT

else

echo "critical-section is already running"

fi

现在当你杀死进程时,锁文件一同被删除。注意在trap命令中明确地退出了脚本,否则脚本会继续执行trap后面的命令。

竟态条件 (wikipedia)

在上面锁文件的例子中,有一个竟态条件是不得不指出的,它存在于判断锁文件和创建锁文件之间。一个可行的解决方法是使用IO重定向和bash的noclobber(wikipedia)模式,重定向到不存在的文件。我们可以这么做:

if ( set -o noclobber; echo "$$" > "$lockfile") 2> /dev/null;

then

trap 'rm -f "$lockfile"; exit $?' INT TERM EXIT

critical-section

rm -f "$lockfile"

trap - INT TERM EXIT

else

echo "Failed to acquire lockfile: $lockfile"

echo "held by $(cat $lockfile)"

fi

更复杂一点儿的问题是你要更新一大堆文件,当它们更新过程中出现问题时,你是否能让脚本挂得更加优雅一些。你想确认那些正确更新了,哪些根本没有变化。比如你需要一个添加用户的脚本。

add_to_passwd $user

cp -a /etc/skel /home/$user

chown $user /home/$user -R

当磁盘空间不足或者进程中途被杀死,这个脚本就会出现问题。在这种情况下,你也许希望用户账户不存在,而且他的文件也应该被删除。

rollback() {

del_from_passwd $user

if [ -e /home/$user ]; then

rm -rf /home/$user

fi

exit

}


trap rollback INT TERM EXIT

add_to_passwd $user


cp -a /etc/skel /home/$user

chown $user /home/$user -R

trap - INT TERM EXIT

在脚本最后需要使用trap关闭rollback调用,否则当脚本正常退出的时候rollback将会被调用,那么脚本等于什么都没做。

保持原子化

又是你需要一次更新目录中的一大堆文件,比如你需要将URL重写到另一个网站的域名。你也许会写:

for file in $(find /var/www -type f -name "*.html"); do

perl -pi -e 's/www.example.net/www.example.com/' $file

done

如果修改到一半是脚本出现问题,一部分使用www.example.com,而另一部分使用www.example.net。你可以使用备份和trap解决,但在升级过程中你的网站URL是不一致的。

解决方法是将这个改变做成一个原子操作。先对数据做一个副本,在副本中更新URL,再用副本替换掉现在工作的版本。你需要确认副本和工作版本目录在同一个磁盘分区上,这样你就可以利用Linux系统的优势,它移动目录仅仅是更新目录指向的inode节点。

cp -a /var/www /var/www-tmp

for file in $(find /var/www-tmp -type -f -name "*.html"); do

perl -pi -e 's/www.example.net/www.example.com/' $file

done

mv /var/www /var/www-old

mv /var/www-tmp /var/www

这意味着如果更新过程出问题,线上系统不会受影响。线上系统受影响的时间降低为两次mv操作的时间,这个时间非常短,因为文件系统仅更新inode而不用真正的复制所有的数据。

这种技术的缺点是你需要两倍的磁盘空间,而且那些长时间打开文件的进程需要比较长的时间才能升级到新文件版本,建议更新完成后重新启动这些进程。对于 apache服务器来说这不是问题,因为它每次都重新打开文件。你可以使用lsof命令查看当前正打开的文件。优势是你有了一个先前的备份,当你需要还原 时,它就派上用场了。

posted @ 2012-05-26 09:37 iamct 阅读(163) | 评论 (0)编辑 收藏

2012年4月26日 #

时间久了,会忘记命令。工具,备忘用。
将一个jar包安装成maven的pom样式,使用。

mvn install:install-file -DgroupId=com.bea.xml -DartifactId=jsr173-ri -Dversion=1.0 -Dpackaging=jar -Dfile=[path to file]
posted @ 2012-04-26 17:16 iamct 阅读(1660) | 评论 (0)编辑 收藏

2012年4月25日 #

Windows下调用程序

Process proc =Runtime.getRuntime().exec("exefile");

Linux下调用程序就要改成下面的格式

Process proc =Runtime.getRuntime().exec("./exefile");

Windows下调用系统命令

String [] cmd={"cmd","/C","dir"};
Process proc =Runtime.getRuntime().exec(cmd);

Linux下调用系统命令就要改成下面的格式

String [] cmd={"/bin/sh","-c","ln -s exe1 exe2"};
Process proc =Runtime.getRuntime().exec(cmd);

Windows下调用系统命令并弹出命令行窗口

String [] cmd={"cmd","/C","start copy exe1 exe2"};
Process proc =Runtime.getRuntime().exec(cmd);

Linux下调用系统命令并弹出终端窗口就要改成下面的格式

String [] cmd={"/bin/sh","-c","xterm -e ln -s exe1 exe2"};
Process proc =Runtime.getRuntime().exec(cmd);

还有要设置调用程序的工作目录就要

Process proc =Runtime.getRuntime().exec("exeflie",null, new File("workpath"))ProcessBuilder ;


同理:
ProcessBuilder也可以这么使用管道 ,使用 |
    ProcessBuilder builder = new ProcessBuilder("/bin/sh","-c","ps aux |grep java");

posted @ 2012-04-25 13:40 iamct 阅读(2807) | 评论 (0)编辑 收藏

2012年4月21日 #

        web应用集成测试的时候,各位还需要启动web容器,然后打开浏览器,输入ulr,然后看到浏览器的输出吗?

下面我们用maven做到自动化!


 

我们利用maven的生命周期和jetty插件来实现。

 

下面描述下做的自动化web集成测试实现的原理。

1,在生命周期pre-integration-test启动jetty容器

2,在生命周期integration-test中测试我们写的***IT.java类

3,在post-integration-test shutdow jetty容器。

在pom.xml中加入代码如下:

<profiles>
        
<profile>
            
<id>ittest</id>
            
<build>
                
<plugins>
                    
<plugin>
                        
<groupId>org.apache.maven.plugins</groupId>
                        
<artifactId>maven-surefire-plugin</artifactId>
                        
<executions>
                            
<execution>
                                
<id>run-integration-test</id>
                                
<phase>integration-test</phase>
                                
<goals>
                                    
<goal>test</goal>
                                
</goals>
                                
<configuration>
                                    
<includes>
                                        
<include>**/*IT.java</include>
                                    </includes>
                                </configuration>
                            </execution>
                        </executions>
                    </plugin>
                    <plugin>
                        <groupId>org.mortbay.jetty</groupId>
                        <artifactId>maven-jetty-plugin</artifactId>
                        <version>6.1.26</version>
                        <configuration>
                            <contextPath>/</contextPath>
                            <stopPort>9966</stopPort>
                            <stopKey>stop-jetty-for-it</stopKey>
                            <connectors>
                                <connector implementation="org.mortbay.jetty.nio.SelectChannelConnector">
                                    <port>6211</port>
                                </connector>
                            </connectors>
                        </configuration>

                        <executions>
                            <execution>
                                <id>start-it-jetty</id>
                                <phase>pre-integration-test</phase>
                                <goals>
                                    <goal>run</goal>
                                </goals>
                                <configuration>
                                    <daemon>true</daemon>
                                </configuration>
                            </execution>
                            <execution>
                                <id>stop-it-jetty</id>
                                <phase>post-integration-test</phase>
                                <goals>
                                    <goal>stop</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </build>
        </profile>
    </profiles>

 

然后就可以编写测试用例了

 

 步骤如下:

1,定义一个以此命名的****IT的测试类(integration test缩写), 在里面华丽的写好你的测试逻辑。

再此不举例了,主要一个思路可以用httpclint来实现里面的测试代码。

2,然后 执行 mvn clean post-integration-test -Pittest

好了 就可以看到我们测试用例是否通过。

建议:以上的代码可以加入到父类的pom中,以后继承此父pom后,只需要按以上2步,就可以做到web应用测试自动化了。

 



posted @ 2012-04-21 11:57 iamct 阅读(2832) | 评论 (0)编辑 收藏

2012年4月18日 #

     摘要: 在linux服务器上,因为gui显示的问题。我们直接jconsole时。就会报Exception in thread "AWT-EventQueue-0" java.awt.HeadlessException: No X11 DISPLAY variable was set, but this program performed an operation which requires it.&nb...  阅读全文
posted @ 2012-04-18 13:30 iamct 阅读(6308) | 评论 (3)编辑 收藏

仅列出标题  下一页