注释:如下此类脚本运行两种方式:
可以写到cron里面,每分钟分钟执行一次; crontab -e min hour day mouth week
也可以写成死循环(while : do done)的方式,然后通过nohup 6.sh & 丢到后台运行,或者通过 screen 虚拟终端运行;
1、写一个脚本,判断本机的80端口是否开启(假如是nginx),如果开启则什么也不做,如果端口不存在,则重启nginx服务,并发邮件通知自己,脚本写好后,一分钟检测一次,也可以写成一个死循环,每30s检测一次;
[root@localhost_002 shell100]# service nginx stop Stopping nginx (via systemctl): [ 确定 ] [root@localhost_002 shell100]# ps aux |grep nginx root 3682 0.0 0.0 112720 964 pts/0 R+ 18:33 0:00 grep --color=auto nginx [root@localhost_002 shell100]# cat 6.sh #!/bin/bash mail=yuanhh104@163.com if netstat -lnpt|grep -q "80 " #注意此处有空格,避免匹配到8080端口; then exit fi /usr/local/nginx/sbin/nginx >/dev/null 2&>1 python mail.py @mail "80 is down" "The is 80 down" while : do n=`pgrep -l nginx|wc -l` if [ $n -eq 0 ] then /usr/local/nginx/sbin/nginx 2> /tmp/nginx_start.err fi if [ -s /tmp/nginx_start.err ] then python mail.py yuanhh@126.com "service is down" "cat /tmp/nginx_start.err" fi sleep 10 done [root@localhost_002 shell100]# ps aux |grep nginx root 3692 0.0 0.1 46392 1264 ? Ss 18:33 0:00 nginx: master process /usr/local/nginx/sbin/nginx nobody 3693 0.0 0.3 48132 3880 ? S 18:33 0:00 nginx: worker process nobody 3694 0.0 0.3 48132 3880 ? S 18:33 0:00 nginx: worker process root 3696 0.0 0.0 112720 968 pts/0 R+ 18:33 0:00 grep --color=auto nginx
2、涉及一个shell脚本备份数据库,在本地服务器上保存一份数据,远程拷贝保存一份,本地保存一周,远程保存一个月;
假设信息如下:
mysql 的用户名 密码分别为 root nihao123!
要备份的库是discuz 库;
本地备份的目录是/mysql/backup;
远程服务器IP 为 192.168.149.130 并提供rsync 服务,写完脚本后需要加入到cron中,每天凌晨三点执行;
核心: 备份数据库的命令 mysqldump rsync 命令 本地一周: date +%w 远程一个月: date +%d
#!/bin/bash /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/mysql/bin:/root/bin d1=`date +%w` d2=`date +%d` local_dir=/mysql/backup remote=bakdir=192.168.149.130::backup exec 1> tmp/mysqlbak.log 2>/tmp/mysqlbak.err echo "mysql bakckup begin at `date`" mysql -uroot -pnihao123! discuz > $local_dir/dicuz.sql.#d1 rsync -az $local_bakdir/dicuz.sql.$d1 $remote_bakdir/discur.sql.$d2 echo "mysql backup end at `date`"
注释:设定PATH是因为后面的mysqldump没在环境变量里;
exec 1> tmp/mysqlbak.log 2>/tmp/mysqlbak.err 这条命令表示接下来所有的命令正确的会写入到/tmp/mysqlbak.log 错误的在/tmp/mysqlbak.err
3、假如服务器上跑着nginx服务,近期出现502错误,由于502错误时暂时的,需要重启一下php-fpm服务,不然一直持续502,需要些一个监控脚本,一旦出现502错误,则重启php-fpm服务;
日记目录: /logs/access.log
假设每10秒检测一次,每10秒的日记总是为300条左右;所以需要把10秒内出现502错误的次数过滤出来,如果502的错误个数超过10已经很严重,可以设定10 为阀值;
[root@localhost_002 shell100]# cat 27.sh #!/bin/bash mail=yuanhh104@163.com N=10 log=/log/access.log while : do n_502=`tail -n300 $log|grep -c ' 502" '` #这里有双引号及空格,是为了更精确的匹配; if [ -z $n_502 ] then exit fi if [$n_502 -ge 10 ] then /etc/init.d/php-fpm >/dev/null 2>/tmp/fpm_err fpm_n=`pgrep -l php-fpm|wc -l` if [ $fpm_n -eq 0 ] then python mail.py $mail "check php-fpm" "head -l /tmp/fpm_err" fi fi sleep 60 done
4、把一个文本文档中前五行中包含字母的行删除掉,同时把6到10行中的全部字母删除掉;
分三部分处理:
首先处理1 到 5 行; 5 到 10 行, 及后面剩余处理;
sed '1,5p' 111.txt|sed '/[a-zA-Z]/d' 删除 1 到 5 行包含字母的行;
sed '6,10p' 1.txt|sed ‘s#[a-zA-Z]##g’ 删除掉 6 到 10 行的全部字母;
案例:
[root@localhost_002 shell100]# cat 111.txt 1111111111111111111 121212aaasdasdf asdfasdfasdfasdfasdf 12121212aklsdfjaklsdfkjk *****#)#((@#*@)1121212 root@gitlba-aming shell100 12aaasdas23asdfasdf asdf;lkjas;lkdjfkl;ajsdf asl;dkfjalskdjflkj2elkjwlkej23kijlkjasdf laksjdflkjslkdjfslkdjflksjdf 21l3k2l3k2l3kjl2k3jl2k3j askdjfklasjdflklkajlksdjfkl12323232323 asdklfjalksdf asldkfjalksdjfalksdjfklasjdf2323 aslkdjflk2k3j2lk3jl2k3j asdklfjalksjdflkj132 asdfkjalksdjf121adfavasdfads asldkfjalksdjf lkjlkjlwkerlk2j3lk21j3lkjflkasjdlkj23lkj klaj d [root@localhost_002 shell100]# sed -n '1,5'p 111.txt |sed '/[a-zA-Z]/d' 1111111111111111111 *****#)#((@#*@)1121212 [root@localhost_002 shell100]# sed -n '6,10'p 111.txt |sed 's#[a-zA-Z]##g' @- 100 1223 ;;; ;223
5、打印出" Bash also interprets a number of multi-character options." 这句话中字母小于6的单词;
[root@localhost_002 shell100]# cat 8.sh #!/bin/bash for i in Bash also interprets a number of multi-character options. do n=`echo $i|wc -c` #此处也可以用wc -m 来写,同 -c 的用法相同; if [ $n -lt 7 ] #因为这里有个结束符,所以要写成是7才可以; then echo $i fi done [root@localhost_002 shell100]# sh 8.sh Bash also a of
当然,也可用用awk也可以;echo Bash also interprets a number of multi-character options.|awk -F '[+-. ]' '{print NF}'
10
awk -F '[ +-.]' 表示分隔符可以是 + - . 注意加号前面有个空格,表示由一个或多个空格来作为分隔符都可以;
注释:如下图例: for ((i=i;i<$n;i++)) 表示i=1,每次循环前加 1,判断是否小于n,如果判断为真,则执行下面代码,如果判断为假,则退出;
awk -v j=$i 表示在awk中使用shell的变量, 使用 -v 向awk程序中传递shell的参数;
[root@localhost_002 shell100]# cat 8_1.sh #!/bin/bash c="Bash also interprets a number of multi-character options." n=`echo $c|awk -F '[ +-.]' '{print NF}'` for ((i=1;i<$n;i++)) do l=`echo $c|awk -F '[ +-.]' -v j=$i '{print $j}'|wc -L` if [ $l -lt 6 ] then echo $c|awk -F '[ +-.]' -v j=$i '{print $j}' fi done [root@localhost_002 shell100]# sh 8_1.sh Bash also a of multi
如上两种方法都是可以的,不过第二种方法更准确些,第一个方法不准备,不如用" - " 为分隔符则过滤不出来;