一个自动检测服务器网络状态的脚本

最近服务器总是莫明奇妙的网络不通。我在上一篇文章里写了一个自动检测网卡状态的脚本:http://blog.haohtml.com/archives/11827.但发现服务器仍然出现此问题.但服务器内部运行正常.这里基本可以确认是与外网不通的原因.就写了一个脚本,用来检测网络状态,在不通的情况就重启服务器了.此解决办法相当的变态.最好不要使用.

1.创建新文件 /data/check_net_status.sh,内容如下

#!/bin/bash
if [ $# -ne 1 ]
then
echo 'ip address not defined!'
exit
fi

ip=$1
log_file="$(date +%Y%m%d).log"

ret=`ping -c 10 $ip | grep ttl  | wc -l`
if [ $ret -lt 2 ]; then
echo "$(date +%H:%M:%S) ===== reboot" >> $log_file
shutdown -r now
fi

添加执行权限

chmod +x /data/check_net_status.sh

2.创建定时检测shell脚本,实现5分钟自动检查是否与网关的连接状态,如果不通,则自动重启本服务器.

编辑/etc/crontab文件在现有行 */2 * * * * root /data/check_net.sh > /dev/null 后面新添加一行

*/5 * * * * root /data/check_net_status.sh 61.158.162.1 > /dev/null 2>&1

 

使用sed处理php-fpm.conf和nginx.conf文本里的注释信息

默认系统环境安装教程:http://blog.haohtml.com/archives/6051

php-fpm.conf:

想自己搞一个自动修改php-fpm.conf的shell脚本.刚安装的php,默认的是nobody用户运行的,这里修改为了www,并去掉了两边的注释符

sed ‘63,66s/<!–|–>//g’ php-fpm.conf | sed ‘s/nobody/www/g’

上面将”<!–“和”–>“两个字符串全部删除了.多个之间用”|“符号隔开

s前面的63,66为处理的行号,如果为一行的话,直接指定一个行号就可以了.这里使用了从63行到66行中间的数据,包括这两行.

nginx.conf

下面的命令是用来配置nginx.conf文件的

sed '2s/nobody/www/' /usr/local/nginx/conf/nginx.conf.default | sed '2s/#//g'| sed '64,71s/#//g' | sed '64,71s/scripts/usr/local/nginx/html/' > /usr/local/nginx/conf/nginx.conf

这里先将第二行的nobdy用www替换掉,再将前面的#删除,再将支持php配置的第64行和71前面的#删除,并将默认的php脚本路径改为/usr/local/nginx/html位置.

对于sek的使用方法见:http://blog.haohtml.com/tag/sed

 

这里没有使用awk命令,对于此命令的介绍见:http://blog.haohtml.com/tag/awk

用shell和php脚本实现定时检测服务器情况

实现原理,利用 cron来定时执行一个shell脚本,如果发现服务器不通或者上次故障后恢复正常,则发送邮件.否则不用发送邮件. 目前此Shell在FreeBSD和Linux下均可以正常运行.

ping.sh

#!/bin/bash
if [ $# -ne 1 ]
then
echo 'must have one param,must be ip address format!'
exit
fi

ip=$1
tmpfile=/tmp/$ip.txt
if [ -f $tmpfile ]; then
lastmsg=`cat $tmpfile`
else
lastmsg='YES'
fi

ret=`ping -c 3 $ip | grep ttl  | wc -l`
if [ $ret -lt 2 ]; then
echo 'NO' > $tmpfile
/usr/local/bin/php /data/haohtml.com/www/ping.php $ip 0 > /dev/null 2>&1
elif [ $lastmsg = 'NO' ]; then
echo 'YES' > $tmpfile
/usr/local/bin/php /data/haohtml.com/www/ping.php $ip 1 > /dev/null 2>&1
fi

Continue reading

一个简单的ping检测服务器状态的shell脚本

这个脚本特别的简单的,一次只能检测一个ip地址,可以放在crontab里定时检测.可以用来检测服务器状态情况.特别的实用的,如果有多个ip地址的话,可能必定一下,循环一下就可以了.

只有当不通或者宕机后恢复正常的时候才发送指定消息.

#!/bin/bash
if [ $# -ne 1 ]
then
echo 'must have one params ip address format!'
exit
fi

ip=$1
tmpfile=$ip.txt
if [ -f $tmpfile ]; then
lastmsg=`cat $tmpfile`
else
lastmsg='YES'
fi

ret=`ping -c 3 $ip | grep ttl  | wc -l`
if [ $ret -lt 2 ]; then
echo 'NO' > $tmpfile
echo 'send waring message!'
//这里可以执行php脚本,用来 发送邮件信息
elif [ $lastmsg = 'NO' ]; then
echo 'YES' > $tmpfile
echo 'send ok message!'
//发送邮件信息
fi

linux中的shell重定向

下面的shell 可不可以详细解释一下呀?
(ls you no 2>&1;ls yes 2>&1) 2>&1|egrep * >file
(ls you no 2>&1;ls yes 2>&1)|egrep * >file
(ls you no;ls yes) 2>&1|egrep * >file

2>&1又是什么意思呀??
在 shell中 >代表输出重定向

0表示标准输入
1表示标准输出(默认值)
2表示标准错误输出
2>&1意思是:把 标准错误输出 重定向到 标准输出.

ls xxx >out.txt 2>&1, 实际上可换成 ls xxx 1>out.txt 2>&1;重定向符号>默认是1,错误和输出都传到out.txt了。

|:是管道,例子:
cmd1 | cmd2 意思是:命令cmd1的标准输出座位cmd2的标准输入.

详细解释第三个命令行,(ls you no;ls yes) 2>&1|egrep * >file:
2>&1意思是:把 标准错误输出 重定向到 标准输出.
|意思是:管道;
egrep * :搜索所有的字符串.
>file: 把标准输出导入文件file(如果file存在则清空file,不存在则创建.);

Freebsd下安装bash

FreeBSD下默认的shell为CSH,可以通过命令

echo $SHELL

来查看系统默认的shell是哪一个的。

想知道FreeBSD都支持哪些shell,可以用下面的命令进行查看的

#cat /etc/shells

默认只支持

/bin/sh
/bin/csh
/bin/tcsh

这三种shell的,平时我们经常用bash 来写shell脚本,特别是对于那些从linux转过来的用户来说,bash可能说无所不在的.但freebsd默认情况下并不支持bash的,我们可以手动安装一下bash的,命令如下: Continue reading

shell中的test表达式

摘自:UNIX Shell编程24学时编程

10.1.2 使用test

更常见的情况是,提供给if语句的清单是一个或更多个test命令,它们通过调用test命令而被激活,语法如下:

test expression

这里,expression为test命令构造的表达式,该表达式的构造使用了特殊选项之一.在计算完表达式的值后,test命令或者返回0(真)或者返回1(假).

可用”[“命令对test命令进行缩写:

[ expression ]

这里expression是test命令可以理解的任何有效表达式,该简化格式将是读者可能会踫见的最常用格式.

test可理解的表达式类型分为三类:

文件测试.
字符串比较.
数字比较.

读者将逐步学业习这三类,另外,还会学习到复合表达式. Continue reading

Shell中变量基础

shell中的只读变量:使用readonly关键字,后面加上变量名即可,如
#name=’sxf’
#readonly name
即可.如果后面修改name的值,如
#name=’tom’
会提示
"-bash: name: readonly variable"
错误信息.
在shell中删除变量只要用
unset variable
即可.但不能删除只读变量. Continue reading

shell test操作运算符

4.4 控制结构

在shell脚本中,使用控制结构就可以控制Linux命令的执行。使用控制结构,可以重复执行命令,或者选择特定的命令。控制结构包含两个主要的组件:测试操作(test)和命令。如果测试操作成功,则命令就会执行。这样的话,就可以使用控制结构来决定是否执行选定的命令。

存在两种不同类型的控制结构:循环和条件。循环结构会重复执行命令,而条件结构会在特定条件满足时执行命令。

BASH Shell有三种循环控制结构:while、for和for-in,两种条件控制结构:if和case。控制结构把Linux命令执行结果作为测试。

所有的Linux命令在执行结束后都会返回一个退出状态。如果某命令成功执行,退出状态将是0。如果因为某种原因该命令执行失败,则退出状态是表示失败类型的一个正值。控制结构会检查Linux命令的退出状态是0,还是其他值。对于if和while控制结构,如果退出状态是0,则说明该命令被成功执行,控制结构会继续。

Continue reading

FreeBSD 修改默认SHELL

FreeBSD下默认的shell为CSH,可以通过命令 echo $SHELL来查看系统默认的shell是哪一个的。

显示自己所使用的SHEEL命令:
ps或echo $SHELL
修改默认SHELL为csh
name:是指你登陆的名称

pw usermod -n name -s csh

查看所有支持的shell

freebsd# cat /etc/shells
/bin/sh
/bin/csh
/bin/tcsh

到于bash的安装请参考:http://blog.haohtml.com/archives/6921