(1)监控80端口
写一个脚本,判断本机的80端口是否开启着,如果开启着什么都不做,如果发现端口不存在,那么重启一下httpd服务,并发邮件通知你自己。脚本写好后,可以每一分钟执行一次,也可以写一个死循环的脚本,30s检测一次。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
#! /bin/bash
mail=123@123.com
if
netstat
-lnp |
grep
':80'
|
grep
-q
'LISTEN'
;
then
exit
else
/usr/local/apache2/bin/apachectl
restart >
/dev/null
2>
/dev/null
python mail.py $mail
"check_80"
"The 80 port is down."
n=`
ps
aux |
grep
httpd|
grep
-cv
grep
`
if
[ $n -
eq
0 ];
then
/usr/local/apache2/bin/apachectl
start 2>
/tmp/apache_start
.err
fi
if
[ -s
/tmp/apache_start
.err ];
then
python mail.py $mail
'apache_start_error'
`
cat
/tmp/apache_start
.err`
fi
fi
|
(2) 域名代理
内网有一台机器不能连外网,所以没有办法使用yum,考虑过使用iptables nat 转发上网,但因为一些原因,放弃使用。所以想到nginx代理,原理很简单。 A 不能访问 1网站, B可以访问,A和B可以内网通信,所以可以让B作为A的代理。 并且可以限定访问的来源IP,配置文件如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
server {
listen 80;
server_name aaa.com bbb.com ccc.com ddd.com eee.com;
location / {
resolver 119.29.29.29;
proxy_pass http://$host;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
allow 192.168.5.0/24;
deny all;
}
}
说明:这里的119.29.29.29 为一个DNS的ip,用resolver来指定。
假如B机器内网ip为 192.168.5.11,只需要在A上加一条hosts192.168.5.11 aaa.com bbb.com ccc.com ddd.com eee.com
|
(3)备份数据库
设计一个shell脚本来备份数据库,首先在本地服务器上保存一份数据,然后再远程拷贝一份,本地保存一周的数据,远程保存一个月。
假定,我们知道mysql root账号的密码,要备份的库为discuz,本地备份目录为/bak/mysql, 远程服务器ip为192.168.123.30,远程提供了一个rsync服务,备份的地址是 192.168.123.30::backup . 写完脚本后,需要加入到cron中,每天凌晨3点执行。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
#! /bin/bash
### backup mysql data
### Writen by Aming.
PATH=
/usr/local/sbin
:
/usr/local/bin
:
/sbin
:
/bin
:
/usr/sbin
:
/usr/bin
:
/usr/local/mysql/bin
d1=`
date
+%w`
d2=`
date
+%d`
pass=
"your_mysql_password"
bakdir=
/bak/mysql
r_bakdir=192.168.123.30::backup
exec
1>
/var/log/mysqlbak
.log 2>
/var/log/mysqlbak
.log
echo
"mysql backup begin at `date +"
%F %T
"`."
mysqldump -uroot -p$pass --default-character-
set
=gbk discuz >$bakdir/$d1.sql
rsync
-az $bakdir/$d1.sql $r_bakdir/$d2.sql
echo
"mysql backup end at `date +"
%F %T
"`."
然后加入
cron
0 3 * * *
/bin/bash
/usr/local/sbin/mysqlbak
.sh
|
(4)自动重启nginx服务
服务器上跑的是LNMP环境,近期总是有502现象。502为网站访问的状态码,200正常,502错误是nginx最为普通的错误状态码。由于502只是暂时的,并且只要一重启php-fpm服务则502消失,但不重启的话,则会一直持续很长时间。所以有必要写一个监控脚本,监控访问日志的状态码,一旦发生502,则自动重启一下php-fpm。
我们设定:
-
access_log /data/log/access.log
-
脚本死循环,每10s检测一次(假设每10s钟的日志条数为300左右)
-
重启php-fpm的方法是 /etc/init.d/php-fpm restart
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#! /bin/bash
log=
/data/log/access
.log
N=10
while
:;
do
##因为10秒钟大概产生300条日志
tail
-n 300 $log >
/tmp/log
n_502=`
grep
-c
' 502"'
/tmp/log
`
if
[ $n_502 -
ge
$N ];
then
##记录系统的状态
top
-bn1 >
/tmp/
`
date
+%H%M%S`-
top
.log
vmstat 1 5 >
/tmp/
`
date
+%H%M%S`-vm.log
/etc/init
.d
/php-fpm
restart 2>
/dev/null
##重启php-fpm服务后,应先暂缓1分钟,而后继续每隔10s检测一次
sleep
60
fi
sleep
10
done
|
(10)删除文本中的字母
要求: 把一个文本文档的前5行中包含字母的行删除掉,同时把6到10行中的全部字母删除掉。
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
|
假设文本名字叫做1.txt,并且文本行数大于10,脚本如下
#!/bin/bash
##先获取该文本的行数
nu=`
wc
-l 1.txt |
awk
'{print $1}'
`
##对前5行进程处理
for
i
in
`
seq
1 5`
do
##使用sed把每一行的内容赋值给变量
l=`
sed
-n
"$i"
p 1.txt`
##用grep 判定是否匹配字母,-v取反,-q不输出内容
if
echo
$l |
grep
-vq
'[a-zA-Z]'
then
echo
$l
fi
done
##对6-10行做删除字母处理
for
i
in
`
seq
6 10`
do
l=`
sed
-n
"$i"
p 1.txt`
echo
$l|
sed
's/[a-zA-Z]//g'
done
##剩余的直接输出
for
i
in
`
seq
11 $nu`
do
sed
-n
"$i"
p 1.txt
done
##若想把更改内容写入到1.txt,还需要把以上内容重定向到一个文本中,然后删除1.txt,再把刚刚重定向的文件更名为1.txt
|