session

1\当第一次访问网站时,Seesion_start()函数就会创建一个唯一的Session ID,并自动通过HTTP的响应头,将这个Session ID保存到客户端Cookie中。

2\同时,也在服务器端创建一个以Session ID命名的文件,用于保存这个用户的会话信息。

3\当同一个用户再次访问这个网站时,也会自动通过HTTP的请求头将Cookie中保存的Seesion ID再携带过来,这时Session_start()函数就不会再去分配一个新的Session ID,而是在服务器的硬盘中去寻找和这个Session ID同名的Session文件,将这之前为这个用户保存的会话信息读出,在当前脚本中应用,达到跟踪这个用户的目的。

Session以数组的形式使用,如:$_SESSION[‘session名’]

第一方cookie,会话cookie,第三方cookie

所谓“第一方Cookies”,指的是来自当前正在访问的网站,储存了一定信息的Cookies;所谓“第三方Cookies”,指的是来自当前访问网站以外的站点,比如那些在被访问站点放置广告的第三方站点,这第三方站点可能正在使用Cookies;还有一种“会话Cookies”,就是当前浏览时存储的一些信息,在关闭IE的同时,这些Cookies也同时被删除,它一般没什么危害。

js的匿名函数总结文章

网上看到一句话,匿名函数的执行是具有全局性的,那怎么具有的全局性呢?

this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象

1.案例中,第一个say打出来的是Alan,而第二个则是window

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var name = 'window'
var person = {
name :'Alan',
sayOne:function () {
 console.log(this.name)
},
sayTwo:function () {
 return function () {
 console.log(this.name)
 }
}
}
person.sayOne()//Alan
person.sayTwo()() // window

2.原因

  1. 函数内部的this指向调用者
  2. sayOne调用者是person对象,所以this指向person;
  3. sayTwo的调用者虽然也是person对象,但是区别在于这次调用并没有打出this而是在全局返回了一个匿名函数
  4. 而这个匿名函数不是作为某个对象的方法来调用执行,是在全局执行

3.我们也可以更改this指向,这里应用JS高级编程的案例

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
var name = "global";
var foo = {
 name: "foo",
 getName : function(){
 console.log(this.name);
 }
}
var bar = {
 name: "bar",
 getName : function(){
 return (function(){
  console.log(this.name);
 })();
 }
}
foo.getName(); //foo
foo.getName.call(bar); //bar
foo.getName.call(this); //global
foo.getName.call(window); //global
(function(){
 console.log(this.name)
}.bind(bar))(); //bar
(function(){
 console.log(this.name)
}.bind())(); //global

 

 

 

function 改写为=> => 可以读成goesto

如果只有一个形参,那就可以省略形参小括号

如果不一个形参,0个或者多个形参,那就不能省略这个形参的小括号了

如果函数体只有一句话,那就可以省略函数体大括号

如果函数体只有一句话,并且这一句话是return 返回值 那return也要省略

如果函数不一句话,不能省略这个大括号

xargs 命令–Shell管道传递参数

xargs 命令–Shell管道传递参数

xargs是 Unix 系统的一个很有用的命令,但是常常被忽视,很多人不了解它的用法。
本文介绍如何使用这个命令。

一、标准输入与管道命令
Unix 命令都带有参数,有些命令可以接受”标准输入”(stdin)作为参数。
$ cat /etc/passwd | grep root
上面的代码使用了管道命令(|)。管道命令的作用,是将左侧命令(cat /etc/passwd)的标准输出转换为标准输入,提供给右侧命令(grep root)作为参数。
因为grep命令可以接受标准输入作为参数,所以上面的代码等同于下面的代码。
$ grep root /etc/passwd
但是,大多数命令都不接受标准输入作为参数,只能直接在命令行输入参数,这导致无法用管道命令传递参数。举例来说,echo命令就不接受管道传参。
$ echo “hello world” | echo
上面的代码不会有输出。因为管道右侧的echo不接受管道传来的标准输入作为参数。
二、xargs 命令的作用
xargs命令的作用,是将标准输入转为命令行参数。
$ echo “hello world” | xargs echo hello world
上面的代码将管道左侧的标准输入,转为命令行参数hello world,传给第二个echo命令。
xargs命令的格式如下。
$ xargs [-options] [command]
真正执行的命令,紧跟在xargs后面,接受xargs传来的参数。
xargs的作用在于,大多数命令(比如rmmkdirls)与管道一起使用时,都需要xargs将标准输入转为命令行参数。
$ echo “one two three” | xargs mkdir
上面的代码等同于mkdir one two three。如果不加xargs就会报错,提示mkdir缺少操作参数。
三、xargs 的单独使用
xargs后面的命令默认是echo
$ xargs # 等同于 $ xargs echo
大多数时候,xargs命令都是跟管道一起使用的。但是,它也可以单独使用。
输入xargs按下回车以后,命令行就会等待用户输入,作为标准输入。你可以输入任意内容,然后按下Ctrl d,表示输入结束,这时echo命令就会把前面的输入打印出来。
$ xargs hello (Ctrl + d) hello
再看一个例子。
$ xargs find -name “*.txt” ./foo.txt ./hello.txt
上面的例子输入xargs find -name以后,命令行会等待用户输入所要搜索的文件。用户输入"*.txt",表示搜索当前目录下的所有 TXT 文件,然后按下Ctrl d,表示输入结束。这时就相当执行find -name *.txt

重要——jjger备注的!!!!,其他内容没有细看
四、-d 参数与分隔符
默认情况下,xargs将换行符和空格作为分隔符,把标准输入分解成一个个命令行参数。
$ echo “one two three” | xargs mkdir
上面代码中,mkdir会新建三个子目录,因为xargsone two three分解成三个命令行参数,执行mkdir one two three
-d参数可以更改分隔符。
$ echo -e “a\tb\tc” | xargs -d “\t” echo a b c
上面的命令指定制表符\t作为分隔符,所以a\tb\tc就转换成了三个命令行参数。echo命令的-e参数表示解释转义字符。
五、-p 参数,-t 参数
使用xargs命令以后,由于存在转换参数过程,有时需要确认一下到底执行的是什么命令。
-p参数打印出要执行的命令,询问用户是否要执行。
$ echo ‘one two three’ | xargs -p touch touch one two three ?…
上面的命令执行以后,会打印出最终要执行的命令,让用户确认。用户输入y以后(大小写皆可),才会真正执行。
-t参数则是打印出最终要执行的命令,然后直接执行,不需要用户确认。
$ echo ‘one two three’ | xargs -t rm rm one two three
六、-0 参数与 find 命令
由于xargs默认将空格作为分隔符,所以不太适合处理文件名,因为文件名可能包含空格。
find命令有一个特别的参数-print0,指定输出的文件列表以null分隔。然后,xargs命令的-0参数表示用null当作分隔符。
$ find /path -type f -print0 | xargs -0 rm
上面命令删除/path路径下的所有文件。由于分隔符是null,所以处理包含空格的文件名,也不会报错。
还有一个原因,使得xargs特别适合find命令。有些命令(比如rm)一旦参数过多会报错”参数列表过长”,而无法执行,改用xargs就没有这个问题,因为它对每个参数执行一次命令。
$ find . -name “*.txt” | xargs grep “abc”
上面命令找出所有 TXT 文件以后,对每个文件搜索一次是否包含字符串abc
七、-L 参数
如果标准输入包含多行,-L参数指定多少行作为一个命令行参数。
$ xargs find -name “*.txt” “*.md” find: paths must precede expression: `*.md’
上面命令同时将"*.txt"*.md两行作为命令行参数,传给find命令导致报错。
使用-L参数,指定每行作为一个命令行参数,就不会报错。
$ xargs -L 1 find -name “*.txt” ./foo.txt ./hello.txt “*.md” ./README.md
上面命令指定了每一行(-L 1)作为命令行参数,分别运行一次命令(find -name)。
下面是另一个例子。
$ echo -e “a\nb\nc” | xargs -L 1 echo a b c
上面代码指定每行运行一次echo命令,所以echo命令执行了三次,输出了三行。
八、-n 参数
-L参数虽然解决了多行的问题,但是有时用户会在同一行输入多项。
$ xargs find -name “*.txt” “*.md” find: paths must precede expression: `*.md’
上面的命令将同一行的两项作为命令行参数,导致报错。
-n参数指定每次将多少项,作为命令行参数。
$ xargs -n 1 find -name
上面命令指定将每一项(-n 1)标准输入作为命令行参数,分别执行一次命令(find -name)。
下面是另一个例子。
$ echo {0..9} | xargs -n 2 echo 0 1 2 3 4 5 6 7 8 9
上面命令指定,每两个参数运行一次echo命令。所以,10个阿拉伯数字运行了五次echo命令,输出了五行。
九、-I 参数
如果xargs要将命令行参数传给多个命令,可以使用-I参数。
-I指定每一项命令行参数的替代字符串。
$ cat foo.txt one two three $ cat foo.txt | xargs -I file sh -c ‘echo file; mkdir file’ one two three $ ls one two three
上面代码中,foo.txt是一个三行的文本文件。我们希望对每一项命令行参数,执行两个命令(echomkdir),使用-I file表示file是命令行参数的替代字符串。执行命令时,具体的参数会替代掉echo file; mkdir file里面的两个file
十、–max-procs 参数
xargs默认只用一个进程执行命令。如果命令要执行多次,必须等上一次执行完,才能执行下一次。
--max-procs参数指定同时用多少个进程并行执行命令。--max-procs 2表示同时最多使用两个进程,--max-procs 0表示不限制进程数。
$ docker ps -q | xargs -n 1 –max-procs 0 docker kill
上面命令表示,同时关闭尽可能多的 Docker 容器,这样运行速度会快很多。


补充

之所以能用到xargs这个命令,关键是由于很多命令不支持 | 管道来传递参数,而日常工作中有有这个必要,所以就有了xargs命令,例如:

#这个命令是错误的
find /sbin -perm +700 |ls -l
#这样才是正确的
find /sbin -perm +700 |xargs ls -l

xargs 可以读入 stdin 的资料,并且以空白字元或断行字元作为分辨,将 stdin 的资料分隔成为 arguments 。 因为是以空白字元作为分隔,所以,如果有一些档名或者是其他意义的名词内含有空白字元的时候, xargs 可能就会误判了,如果需要处理特殊字符,需要使用-0参数进行处理。

选项解释
-0 :当sdtin含有特殊字元时候,将其当成一般字符,想/’空格等

$ echo “/ / “|xargs echo
/ /
$ echo “/ / “|xargs -0 echo
/ /

-a file 从文件中读入作为sdtin

$ cat 1.txt
aaa bbb ccc ddd
a b
$ xargs -a 1.txt echo
aaa bbb ccc ddd a b

-e flag ,注意有的时候可能会是-E,flag必须是一个以空格分隔的标志,当xargs分析到含有flag这个标志的时候就停止。

$ xargs -E ‘ddd’ -a 1.txt echo
aaa bbb ccc
$ cat 1.txt |xargs -E ‘ddd’ echo
aaa bbb ccc

-n num 后面加次数,表示命令在执行的时候一次用的argument的个数,默认是用所有的。

$ cat 1.txt |xargs -n 2 echo
aaa bbb
ccc ddd
a b

-p 操作具有可交互性,每次执行comand都交互式提示用户选择,当每次执行一个argument的时候询问一次用户

$ cat 1.txt |xargs -p echo
echo aaa bbb ccc ddd a b ?…y
aaa bbb ccc ddd a b
$ cat 1.txt |xargs -p echo
echo aaa bbb ccc ddd a b ?…n

-t 表示先打印命令,然后再执行。

$ cat 1.txt |xargs -t echo
echo aaa bbb ccc ddd a b
aaa bbb ccc ddd a b

-i 或者是-I,这得看linux支持了,将xargs的每项名称,一般是一行一行赋值给{},可以用{}代替。

$ ls
1.txt 2.txt 3.txt log.xml
$ ls *.txt |xargs -t -i mv {} {}.bak
mv 1.txt 1.txt.bak
mv 2.txt 2.txt.bak
mv 3.txt 3.txt.bak
$ ls
1.txt.bak 2.txt.bak 3.txt.bak log.xml

注意,-I 必须指定替换字符 -i 是否指定替换字符-可选
find . | xargs -I {} cp {} $D_PATH

find . | xargs -i cp {} $D_PATH

注意:cshell和tcshell中,需要将{}用单引号、双引号或反斜杠,否则不认识。bash可以不用。
find /shell -maxdepth 2 -name a -print | xargs -t -i sed -i ‘1 i\111’ ‘{}‘
-r no-run-if-empty 如果没有要处理的参数传递给xargsxargs 默认是带 空参数运行一次,如果你希望无参数时,停止 xargs,直接退出,使用 -r 选项即可,其可以防止xargs 后面命令带空参数运行报错。

$ echo “”|xargs -t mv
mv
mv: missing file operand
Try `mv –help’ for more information.
$ echo “”|xargs -t -r mv #直接退出

-s num xargs后面那个命令的最大命令行字符数(含空格)

$ cat 1.txt.bak |xargs -s 9 echo
aaa
bbb
ccc
ddd
a b
$ cat 1.txt.bak |xargs -s 4 echo
xargs: can not fit single argument within argument list size limit #length(echo)=4
$ cat 1.txt.bak |xargs -s 8 echo
xargs: argument line too long #length(echo)=4,length(aaa)=3,length(null)=1,total_length=8

-L 从标准输入一次读取num行送给Command命令 ,-l和-L功能一样

$ cat 1.txt.bak
aaa bbb ccc ddd
a b
ccc
dsds
$ cat 1.txt.bak |xargs -L 4 echo
aaa bbb ccc ddd a b ccc dsds
$ cat 1.txt.bak |xargs -L 1 echo
aaa bbb ccc ddd
a b
ccc
dsds

-d delim 分隔符,默认的xargs分隔符是回车,argument的分隔符是空格,这里修改的是xargs的分隔符

$ cat 1.txt.bak
aaa@ bbb ccc@ ddd
a b
$ cat 1.txt.bak |xargs -d ‘@’ echo
aaa bbb ccc ddd
a b

-x exit的意思,如果有任何 Command 行大于 -s Size 标志指定的字节数,停止运行 xargs 命令,-L -I -n 默认打开-x参数,主要是配合-s使用
-P 修改最大的进程数,默认是1,为0时候为as many as it can 。

js中的正则提取

提取img标签
arr=[<a href=’/Uploads/file/20220106/61d6b285308a5.jpg’ target=_blank><img src=’/Uploads/file/20220106/61d6b285308a5.jpg’ width=’30’ height=’30’ /></a>
<a href=’/Uploads/file/20220106/61d6b2853d880.jpg’ target=_blank><img src=’/Uploads/file/20220106/61d6b2853d880.jpg’ width=’30’ height=’30’ /></a>
<a href=’/Uploads/file/20220106/61d6b2862ece9.jpg’ target=_blank><img src=’/Uploads/file/20220106/61d6b2862ece9.jpg’ width=’30’ height=’30’ /></a>]

获取img src=.*

$("#pic{$key}").html(/<img src=.*>/.exec(arr[0]))

ffmpeg 压缩视频,两个报错

把分辨率缩小一倍,其它不变,由130M压缩到16M,效果还可以.
影响压缩的参数,码率=文件大小(KB)*8/播放长度s.

第一个报错
./ffmpeg.exe -i qhkj2.mp4 scale=1639:819 v1.mp4
报错:
[NULL @ 00000259c852ed40] Unable to find a suitable output format for ‘scale=1639:819’
scale=1639:819: Invalid argument

原因:You need to enter -vf before scale to tell FFmpeg that you want to use a video filter. Also, it should be specified after the filename of the image as it’s an output option, not an input option. You can put it just before the output name:
大概的意思是说,你需要在scale参数前面输入-vf参数,用来告知ffmpeg,需要使用video的过滤器,-vf应该放到视频文件名后面,-vf是一个输出视频的选项,不是导入视频的选项,把-vf放到输出视频的名字前面,例如v1.mp4前面,如下
解决办法:
./ffmpeg.exe -i qhkj2.mp4 -vf scale=1639:819 v1.mp4

第二个报错
./ffmpeg.exe -i qhkj2.mp4 -vf scale=1639:819 v1.mp4
报错:
[libx264 @ 0000027ff8717a00] width not divisible by 2 (1639×819)
Error initializing output stream 0:0 — Error while opening encoder for output stream #0:0 – maybe incorrect parameters
such as bit_rate, rate, width or height
[aac @ 0000027ff8521180] Qavg: 139.243
[aac @ 0000027ff8521180] 2 frames left in the queue on closing

原因:
出现该错误的原因是在于:视频的宽度必须是32的倍数,高度必须是2的倍数
解决方法:
if (screen_width % 32 != 0)
{
screen_width = screen_width / 32 * 32;
}
if (screen_height % 2 != 0)
{
screen_height = screen_height / 2 * 2;
}
最终命令:./ffmpeg.exe -i qhkj2.mp4 -vf scale=1632:820 v1.mp4
成功.

inotify,独立使用

2022.01.09,更新此脚本
添加了excludePath为数组,可以添加任意多的排除目录,不用每个都做判断,批量判断

#/bin/bash
#配置系统参数
echo 16384 > /proc/sys/fs/inotify/max_queued_events
echo 128 > /proc/sys/fs/inotify/max_user_instances
echo 9999999 > /proc/sys/fs/inotify/max_user_watches

excludePath=(‘/data/web/db/data/tempstatic’ ‘/data/web//data/tempstatic’ ‘/data/web/123/runtime’ ‘/data/web/123_db/runtime’)
#excludePath数组长度为num
num=${#excludePath[@]}
stat=0

inotifywait -mrq –timefmt ‘%Y%m%d%H%M%S’ –format ‘%T %w%f %e’ –event delete,modify,create,attrib,move,moved_to,moved_from /data/web | while read date file event
do
case $event in
MODIFY|CREATE|MOVE|MODIFY,ISDIR|CREATE,ISDIR|MODIFY,ISDIR)
if [ “${file##*.}”x = “php”x ]||[ “${file##*.}”x = “js”x ]||[ “${file##*.}”x = “html”x ];then
for filepath in ${excludePath[@]}
do
realFilePath=`dirname $file`
res=`echo $realFilePath|grep $filepath`

if [ -z $res ];then
stat=`expr $stat + 1`
fi
done
#上面for循环,如果找到,则stat一定是3
if [ $stat -eq $num ];then
echo $event’ – ‘$file’ – ‘$date >> /var/log/web_watch.log
stat=0
else
stat=0
fi
fi
;;

MOVED_TO|MOVED_FROM|DELETE|DELETE,ISDIR)
if [ “${file##*.}”x = “php”x ]||[ “${file##*.}”x = “js”x ]||[ “${file##*.}”x = “html”x ];then
for filepath in ${excludePath[@]}
do
realFilePath=`dirname $file`
res=`echo $realFilePath|grep “$filepath”`

if [ -z $res ];then
stat=`expr $stat + 1`
fi
done
#上面for循环,如果找到,则stat一定是3
if [ $stat -eq $num ];then
echo $event’ – ‘$file’ – ‘$date >> /var/log/web_watch.log
stat=0
else
stat=0
fi
fi
;;
esac
done

结束

 

 

 


#/bin/bash

    inotifywait -mrq --timefmt '%Y%m%d%H%M%S' --format '%T %w%f %e' --event delete,modify,create,attrib,move,moved_to,moved_from /data/web | while read date file event
    do
        case $event in
           MODIFY|CREATE|MOVE|MODIFY,ISDIR|CREATE,ISDIR|MODIFY,ISDIR)
                if [ "${file##*.}"x = "php"x ]||[ "${file##*.}"x = "js"x ]||[ "${file##*.}"x = "html"x ];then
                    echo $event' - '$file' - '$date >> /var/log/web_watch.log
                fi
                ;;

        MOVED_TO|MOVED_FROM|DELETE|DELETE,ISDIR)
            if [ "${file##*.}"x = "php"x ]||[ "${file##*.}"x = "js"x ]||[ "${file##*.}"x = "html"x ];then
            echo $event' - '$file' - '$date >> /var/log/web_watch.log
            fi
            ;;
       esac
done

 

2022.01.03改写后的shell脚本

#/bin/bash
#配置系统参数
echo 16384 > /proc/sys/fs/inotify/max_queued_events
echo 128 > /proc/sys/fs/inotify/max_user_instances
echo 9999999 > /proc/sys/fs/inotify/max_user_watches
#排除bbb和aaa目录的文件变动

excludePath="/data/web/bbb/data/tempstatic"
excludePath2="/data/web/aaa/data/tempstatic"

inotifywait -mrq --timefmt '%Y%m%d%H%M%S' --format '%T %w%f %e' --event delete,modify,create,attrib,move,moved_to,moved_from /data/web | while read date file event
do
    case $event in
       MODIFY|CREATE|MOVE|MODIFY,ISDIR|CREATE,ISDIR|MODIFY,ISDIR)
           if [ "${file##*.}"x = "php"x ]||[ "${file##*.}"x = "js"x ]||[ "${file##*.}"x = "html"x ];then
               realFilePath=`dirname $file`
               res=`echo $realFilePath|grep $excludePath`
               res2=`echo $realFilePath|grep $excludePath2`

           if [ -z $res ] && [ -z $res2 ];then
                echo $event' - '$file' - '$date >> /var/log/web_watch.log
            fi

         fi
      ;;

       MOVED_TO|MOVED_FROM|DELETE|DELETE,ISDIR)
            if [ "${file##*.}"x = "php"x ]||[ "${file##*.}"x = "js"x ]||[ "${file##*.}"x = "html"x ];then
                  realFilePath=`dirname $file`
                   res=`echo $realFilePath|grep "$excludePath"`
                   res2=`echo $realFilePath|grep $excludePath2`

             if [ -z $res ] && [ -z $res2 ];then
                  echo $event' - '$file' - '$date >> /var/log/web_watch.log
                  #echo $event' - '$file' - '$date >> /data/web/zx123/analyseLogs/monitorChangeLog/web_watch.log
             fi
         fi
       ;;
       esac
done

 

通过使用nohup /home/sh/inotify_web.sh &
让程序在后台运行

nagios的远程nrpe运行指定脚本,重启服务,event_handler指令

网上看了,大部分都是远程处理故障,也就是远程执行命令,需要无密码登录,配置ssh的key,既然有了check_nrpe,为何还需要远程执行,那不就是脱裤子放屁吗。

例子环境如下:

监控服务器上安装了nagios和check_nrpe,ip为192.168.0.100
被监控服务器安装nrpe的客户端,ip为192.168.0.200

客户端操作,也就是192.168.0.200操作
1、建立监控脚本,我们来监控php进程是否关掉,如果挂掉,在报警前我们重启apache,脚本名为handle_php,路径为/usr/local/nagios/libexec 如下:

#!/bin/bash
case "$1" in

    OK)
        echo 'ok' >> /usr/local/nagios/var/tmp.txt
        ;;
    WARNING)
        echo 'WARNING' >> /usr/local/nagios/var/tmp.txt
        ;;
    UNKNOWN)
        echo 'unknown' >> /usr/local/nagios/var/tmp.txt
        ;;
    CRITICAL)
        case "$2" in
            SOFT)
                case "$3" in
                    3)
                        echo 'sudo /etc/rc.d/init.d/httpd restart3' >>  /usr/local/nginx/var/tmp.txt
                        ;;
                    2)
                        echo 'sudo /etc/rc.d/init.d/httpd restart2' >> /usr/local/nagios/var/tmp.txt
                        ;;
                    1)
                        echo 'sudo /etc/rc.d/init.d/httpd restart1' >> /usr/local/nagios/var/tmp.txt
                        ;;
                    *)
                        echo 'critical*' >> /usr/local/nagios/var/tmp.txt
                esac
                ;;
            HARD)
                #这里的sudo 以及重启的命令,仅仅打印,只是为了说明可以执行,方便测试
                echo 'sudo /etc/rc.d/init.d/httpd restart' >> /usr/local/nagios/var/tmp.txt
               ;;
            *)
            echo 'aaaaaa' >> /usr/local/nagios/var/tmp.txt
            ;;
        esac
        ;;
    *)
        #打印参数,用于测试
        echo $1,$2,$3 >> /usr/local/nagios/var/tmp.txt
       ;;
    esac
exit 0

2、测试,看看脚本是否能执行
#/usr/local/nagios/libexec/handle_php CRITICAL soft 3
运行完毕后,在/usr/local/nagios/var/tmp.txt 中出现critical*,说明脚本运行没问题

3、编辑/usr/local/nagios/etc/nrpe.cfg文件,添加内容如下:
command[handle_php]=sudo /usr/local/nagios/libexec/handle_php $ARG1$ $ARG2$ $ARG3$
解释一下,$ARG1$ $ARG2$ $ARG3$三个参数,用空格分开
配置文件中   dont_blame_nrpe=1 ,默认为0,大概的意思是“

这个选项决定了NRPE守护进程是否允许客户端指定执行命令的参数。 这个选项需要在安装nrpe的时候开启——enable-command-args参数,否则不能用,***启用此选项存在安全风险! *** 
上面红字重要,否则,客户端脚本执行不了
重启nrpe,
killall nrpe
/usr/local/nagios/bin/nrpe -c /usr/local/nagios/etc/nrpe.cfg -d

测试,通过在服务器上运行
/home/system/nagios/libexec/check_nrpe -H 192.168.0.200 -c handle_php -a CRITICAL SOFT 3
客户端查看/usr/local/nginx/var/tmp.txt的内容,有打印信息,客户端配置成功。

4、配置服务器端,配置主机监控文件,如下:
define service{
      use                                   hosta-service                                   ; Name of service template to use
      host_name                     a-192.168.0.200
      service_description      HTTP
      check_command          check_nrpe!check_http
      event_handler              check_nrpe!handle_php -a $SERVICESTATE$ $SERVICESTATETYPE$ $SERVICEATTEMPT$
}

5、配置完毕,测试
重启systemctl restart nagios

经过以上配置,当触发错误信息三次的时候,发报警信息前,可以远程执行恢复命令
欢迎留言!