一些linux shell的问题

1. root用户下以httpd用户的身份运行脚本/opt/case/www.km.com/testdb.php,用一条命令怎么实现?

sudo -u httpd  `which php` /opt/case/www.km.com/testdb.php

2. 添加crontab,在11月内,每天的早上6点到20点中,每隔2小时执行一次/opt/shell/rsync.sh?

0 6-20/2 * 11 * /opt/shell/rsync.sh

如果rsync.sh没有执行权
0 6-20/2 * 11 * /bin/bash /opt/shell/rsync.sh

3. 使用find命令查找/opt/case/目录下的内容,一条命令同时满足以下三个需求:
   a.大于10K以php结尾的文件;
   b.修改时间为24小时内的;
   c.移动到/opt/src/目录下。

find /opt/case/ -name "*php" -size +10k -mtime -1 -exec mv {} /opt/src/ \;

如果用两条命令实现可以用xargs命令
find /opt/case/ -name "*php" -size +10k -mtime -1 | xargs -i mv {} /opt/src/


4. 如何查看进程号为4044的进程打开了哪些文件?

lsof -p 4044

5. 通过nginx访问access.log纺计每个IP地址访问的次数,按访问量列出前10名.
日志格式样例如下:
172.16.0.11 -- [22/Nov/2016:14:00:00 +0800] "GET / HTTP/1.1" 200 231 "-" "-"

awk '{print $1}' access.log| sort |uniq -c | sort -rn | head -n10

6. 假设nginx产生的日志文件名为access_log,在nginx正在运行时,执行命令mv access_log access_log.bak,执行完后,请问新的nginx日志会出到哪里,为什么?

新的nginx日志会出到access_log.bak,因为nginx还持有旧文件的句柄,还是指向access_log.bak,只有重新加载nginx后才会生成新的access_log文件.

 
7. MySQL怎么授权及取消授权, 假如环境如下:

授权IP: 172.16.0.11
用户名: test
密码: 123456
数据库名称: monitor
权限: SELECT
grant select on monitor.* to 'test'@'172.16.0.11' identified by '123456'
revoke select on monitor.* from 'root'@'172.16.0.11'

REVOKE语句只能取消用户的权限,而不可以删除用户。即使取消了所有的权限,用户仍然可以连接到服务器。要想彻底的删除用户,必须使用DELETE语句将该用户的记录从MySQL数据库中的user表中删除。该语句的语法格式如下: 
Delete from user where user = "user_name" and host = "host_name" ;

8. 用for循环输出20以下的偶数

for ((i=0;i<20;i=i+2));do echo $i; done 或者

for i in {0..20..2}; do echo $i; done

9. 一个每天pv亿级的大型web网站,必要的架构有哪些,说出你理解


10. linux怎么查看用户登录日志

more /var/log/secure
who /var/log/wtmp 或者last

11. linux中utmp,wtmp,lastlog,message各文件的作用

/var/run/utmp文件,它记录当前登录进系统的各个用户

w命令查询utmp文件并显示当前系统中每个用户和它所运行的进程信息
who命令查询utmp文件并报告当前登录的每个用户

/var/log/wtmp 记录每个用户的登录次数和持续时间等信息。
who /var/log/wtmp 或者last查看

/var/log/lastlog文件记录系统中所有用户最近一次登录信息
可以使用lastlog命令输出lastlog文件的内容

/var/log/messages
messages 日志是核心系统日志文件。它包含了系统启动时的引导消息,以及系统运行时的其他状态消息。IO 错误、网络错误和其他系统错误都会记录到这个文件中。其他信息,比如某个人的身份切换为 root,也在这里列出。
此外,mail,cron,daemon,kern和auth等内容也记录在var/log/messages日志中。
如果服务正在运行,比如 DHCP 服务器,您可以在 messages 文件中观察它的活动。通常,/var/log/messages 是您在做故障诊断时首先要查看的文件。

12. 列举你熟悉的服务器性能查看命令
w;uptime; top; free -m;netstat;vmstat;sar;dmesg;pidstat;mpstat

13. linux服务器怎么实现无密码登陆.列举操作步骤

用 ssh-key-gen 在本地主机上创建公钥和密钥
ssh-keygen -t rsa
用 ssh-copy-id 把公钥复制到远程主机上
 ssh-copy-id -i ~/.ssh/id_rsa.pub  root@192.168.1.1
(也可以用scp id_rsa.pub 192.168.1.1:/root/.ssh/authorized_key 命令复制)

设置目录和文件权限
chmod 700 /root/.ssh
chmod 600 /root/.ssh/authorized_keys

直接登录远程主机
ssh 192.168.1.1

14. 使用tcpdump嗅探80端口的访问看看谁最高

tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F "." '{print $1"."$2"."$3"."$4}' | sort | uniq -c | sort -nr | head

15. 查看当前系统每个ip的连接数
netstat -np | awk '/tcp/ {print $5}' | awk -F: '{print $1}'| sort|uniq -c | sort -rn

统计80端口连接数
netstat -nat|grep -i "80"|wc -l

16. 请写出iptables语句      iptables [-t 表名] -命令 -匹配 -j 动作/目标   

1)本地80端口的请求转发到远端服务器10.0.3.188:8080端口,当前主机IP为192.168.2.1,并且保证服务正常使用  

2)允许本机对外连接80端口(本机能连外界服务器为80) 

3)开放本机的3306端口

4)禁止外界ping本服务器

解答:
1.iptables -t nat -A PREROUTING -p tcp -d 192.168.2.1 --dport 80 -j DNAT --to-destination 10.0.3.188:8080
2.iptables -A OUTPUT -p tcp –dport 80 -j ACCEPT
3.iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
4.iptables -A INPUT -p icmp -j DROP

19. 通过proc 文件系统怎么找到id 为235的进程文件在哪个位置,打开了哪些文件,启动参数是什么,他的父进程id 是多少,他的子进程id 有哪些?

通过访问这些文件和文件夹,我们可以实时查询到当前系统的运行信息:进程文件在/proc/235/目录中

看进程打开了哪些文件: ls -l /proc/235/fd/
启动参数: cat /proc/235/cmdline

cat status | grep  -E 'Tgid|Pid|PPid'

#pid 进程号, ppid 父进程号, tgid进程组号

20.有个文件file1如下:
http://a.domain.com/1.html
http://b.domain.com/1.html
http://c.domain.com/1.html
http://a.domain.com/2.html
http://b.domain.com/2.html
http://a.domain.com/3.html

请写出命令或脚本得出以下结果:
      3 a.domain.com
      2 b.domain.com
      1 c.domain.com

awk -F'/' '{print $3}' file1 |sort |uniq -c

21.在linux系统中,我们通常使用终端shell脚本处理一些数据,十分高效现在有以下两个文件:
file1:
user passwd
aa   1234
bb    4567
cc   9999

file2:
id user
001 cfoqe
002 werwe
003 cc
004 jggq

22. 写一段shell脚本,输出同时存在于file1和file2中用户名的密码
awk 'NR==FNR{a[$1]=$2;next}{print a[$2]}' file1 file2|sed '/^$/d'
注:sed用于删除空行,可不用

23. 写一个脚本后台监控php-fpm进程,当检测到进程停止后,能自动启动php-fpm

#!/bin/bash
#变量初始化
process="php-fpm" #进程名
startCmd="/etc/init.d/php-fpm start" #启动命令
down=0
while true
do
    #取得http状态码
    code=$(curl -H "Host:www.jb51.net" -m 5 -L -s -w %{http_code} http://127.0.0.1 -o /dev/null)
    #当状态码返回000或者大于等于500时,计数故障到down变量
    if [ $code -eq 000 -o $code -ge 500 ];then
        ((down++))
    else
break
    fi
    #稍等5s
    sleep 5
    #判断是否连续检测三次都为故障.
    if [ $down -ge 3 ];then
if [ "$(find /tmp/${process}_restart -mmin -3)" == "" ];then
                #取得进程名对应的所有pid
pids=$(ps aux | grep ${process} | grep -v "grep" | awk '{print $2}')
                #依次对所有pid执行kill命令
for i in $pids;do
kill -9 $i
kill -9 $i
done
                #kill完pid后,启动服务
$startCmd
echo "$(date) Return code $code,${process} had been restarted" >> /tmp/${process}_restart
else
echo "$(date) ${process} not yet recovery.As it had been restarted in 2 minutes.so this time ignore." >> /tmp/${process}_not_restart
fi
break
    fi
done


24. 写一个脚本,实现判断10.10.1.0/24网络里,当前在线的IP有哪些,能ping通认为在线

#!/bin/bash
    for ip in {1..255}
    do
    {
        ping -c 1 10.10.1.$ip > /dev/null 2>&1
        if [ $? -eq 0 ]; then
            echo 10.10.1.$ip UP
        else
            echo 10.10.1.$ip DOWN
        fi
    }&
    done
    wait

不使用脚本,用一行命令实现:
nmap -sP 10.10.1.0/24

25. 写一个脚本,如果有错误,则提醒用户键入Q或者q无视错误并退出。其他任何输入都可以通过vim打开这个指定的脚本

#!/bin/bash
read -p "请输入指定脚本文件:" file
if [ -f $file ]; then
    bash -n $file > /dev/null 2>&1
    if [ $? -ne 0 ];then
        read -p "脚本文件$file语法错误,按Q或q退出,其它键打开vim:" answer
        case $answer in
        q | Q)
        exit 0
        ;;
        *)
        vim $file
        exit 0
        ;;
        esac
    else
        echo  "脚本文件$file语法正确."
    fi
else
    echo "脚本文$file不存在"
    exit 1
fi


26. 从第1000行开始,显示2000行。即显示1000~2999行
cat input_file | tail -n +1000 | head -n 2000


显示 1000行到3000行
cat input_file | head -n 3000 | tail -n +1000


显示最后1000行
tail -n 1000

从1000行开始显示,显示1000行以后的
tail -n +1000

显示前面1000行
head -n 1000 input_file
或者
sed '1000q' input_file

查看文件的第5行到第10行
sed -n '5,10p' input_file

显示前10行
sed '10q' input_file

用awk处理,显示2-11行
awk 'NR==2, NR==11{print}'  input_file
或者
awk 'NR>=2 && NR<=11 {print $0}' input_file

 

27. 有一日志文件(假设文件名为 demo.log ),只查看它的第1000至2000 行(方法不限)
tail -n +1000 demo.log | head -n 10001 或者
sed -n '1000,2000p' demo.log

28. Nginx二进制源码包在搜狐镜像的URL是http://mirrors.sohu.com/nginx/,如何通过管道来获取nginx的最新版本号?
curl -s http://mirrors.sohu.com/nginx/|sed -n 's/<a href=.*\(nginx-.*.tar.gz\)<\/a> .*/\1/p'|sort -t. -nr -k2.2 -k3.2|head -1

29. Nginx服务器报 "Too Many Open Files" 一般是什么状况引起的,该如何处理?

1)应用级别:修改nginx的配置文件  添加work_rlimit_nofile=65535


2)系统级别:修改etc/security/limits.conf中软限制和硬限制数。


* soft nofile 10240

* hard nofile 15360

其中第一行soft表示所有用户打开文件的数量限制为10240,如果超过这个数字则提示警告信息,但是依然可以打开文件。

第二行hard表示最大的打开文件数量不能超过15360,如果超过这个数字,则无法打开文件。


这里也可以针对具体的用户或者用户组进行相应的设定。例如针对nginx这个用户进行设定:


nginx soft nofile 10240

nginx hard nofile 15360

3)内核级别:首先查看内核级别允许打开文件的上限,cat /proc/sys/fs/file-max 或者sysctl -n  fs.file-max 这个值默认其实是蛮大的,可以无需调节。


如果需要调整,可以编辑/etc/sysctl.conf这个文件。

$ vi /etc/sysctl.conf

加上fs.file-max设置


fs.file-max = 100000

然后重新载入核心配置

$ sysctl -p

30. 如果让你管理数量 100+ 服务器,你会如何去管理?
1)首先将100+台服务器都录入到资产管理系统中,并且使用zabbix添加监控、设置邮件报警。
2)将100+台机器按照业务分组,比如数据库、测试等。
3)使用自动化管理工具ansible进行批量管理。

31. 用shell模拟从一幅扑克牌中随机抽取1张牌(Tips: 有个内置函数 RANDOM,可根据指定的数据范围随机生成数据)

suites=(Clubs Dianonds Hearts Spades Joker)
deno=(2 3 4 5 6 7 8 9 10 Jack Queen King Ace)
var=(red black)
num_suites=${#suites[@]}
num_deno=${#deno[@]}
num_var=${#var[@]}
var1=$((RANDOM%$num_suites))
if [ "${suites[$var1]}" == "Joker" ];then
    echo " Joker of "
    echo ${var[$((RANDOM%$num_var))]}
else
    echo "${deno[$((RANDOM%$num_deno))]} of "
    echo ${suites[$var1]}
fi

32. 用什么命令查询指定ip地址的服务器端口
比如扫描192.168.1.1的目标机是否开启80web服务、21ftp服务,23telnet服务,则可以执行:
nmap -p80,21,23 192.168.1.1
nc -nv 192.168.1.1 80
nc -nv -z -w2 192.168.1.1 80-90 (扫描多个端口,w2表示超时时间为2秒)


33. -exec和xargs的区别
find -exec 命令会对每个匹配的文件执行一个单独的rm操作,但是使用这种方式,如果有100个文件匹配了,那么就需要启100个进程,一个进程处理一个rm命令。一般来说,其越多进程,意味着越耗性能。

xargs 一次将参数传给命令,可以使用-n控制参数个数,xargs不能操作文件名有空格的文件

34. /var/www/html/是网站的发布目录,如何每天凌晨0点30对其进行自动备份?
a、crontab-e进入编辑模式
b、添加以下内容
30 0 * * * /bin/tar -czf /backup/web_bak_$(date+\%Y\%m\%d).tar.gz /var/www/html>/dev/null2>&1
c、启动服务service crontab start;chkconfig crontab on

35. Yum命令与rpm命令的区别?如何使用rpm安装一个有依赖的包?

rpm一般用于安装本地的包,yum一般用于在线安装(也可以本地光盘建立yum源)
最大的区别在于yum可以自动安装所依赖的包(不包含环境)

36. 简述raid0raid1raid5三种工作模式的工作原理及特点。

raid0数量>=2磁盘利用率100%hot-spare无优点读写性能高缺点没有容错能力

    数据分散写入不同磁盘,不提供冗余,不能扩容,任何一个盘坏掉,数据全部丢失。适用于对性能要求高,但对数据的安全不太在乎的领域。

    raid1数量>=2磁盘利用率50%Hot-spare有优点提供数据冗余,安全性高缺点浪费磁盘空间

    适用于对数据安全性高的场所,一般为2块盘,空间为最小的盘的空间,如果有4块盘,其中3块空间都是浪费(做镜像冗余)只要有一块盘存在,数据就不会丢失.

    raid5数量>=3磁盘利用率(n-1)/nhot-spare有优点有容错,可冗余,读取性能高缺点写性能低

    raid5相当于raid0和raid1的折中方案

    应用服务器(像apache)做raid1两块硬盘

    数据服务器(像Mysql)做raid10四块硬盘

37. 如何查看占用端口8080的进程。

   netstat-anlp|grep8080

    lsof-i:8080

38. 写一个脚本将数据库备份并打包至远程服务器192.168.1.1 /backup目录下。
mount 192.168.1.1:/backup /mnt
cd /mnt
/usr/local/mysql/bin/mysqldump -hlocalhost -uroot test >test.sql
tar czf test.sql.tar.gz test.sql
rm -f test.sql

39.写一个防火墙配置脚本,只允许远程主机访问本机的80端口。
iptables -F
iptables -X
iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
iptables -P INPUT DROP

38.写出下列命令的含义
 (1)MaxKeepAliveRequests    100  连接的最大请求数
 (2)Options FollowSymLinks  允许192.168.1.1可以列目录
               Order Deny Allow
                Deny from all
         Allow from 192.168.1.1

40. 替换文件中的目录
sed 's:/user/local:/tmp:g'  filename

41. 把test.txt文件23行test改成tset
sed '23s/test/tset/g' test.txt


42. 简要描述Linux的启动过程?
1.加载BIOS 2.读取MBR 3.Boot Loader 4.加载内核 5.用户层init依据inittab文件来设定系统运行等级 6.init进程执行rc.syninit
7.启动内核模块 8.执行不同级别运行的脚本程序 9.执行/etc/rc.d/rc.local 10.执行/bin/login程序,进入登录状态.


43. 简要叙述下列端口所运行的服务
21、 22、 23、 25、 110、 143、 873、 3306

ftp、ssh、telnet、 smtp、pop3、IMAP、rsync、mysql

44. TCP断头最小长度是? 64字节

45. 让某普通用户能进行cp /dir1/file1 /dir2的命令时,请说明dir1 file1 dir2最小具有什么权限?
dir1 :至少需要有 x 权限;
file1:至少需要有 r 权限;
dir2 :至少需要有 w, x 权限。

46. 简述TCP三次握手的过程?
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;

第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

47. 使用tcpdump监听主机IP为192.168.1.1,tcp端口为80的数据,同时将结果保存输出到tcpdump.log
tcpdump -nn host 192.168.1.1 and tcp port 80 -s0 -t -w tcpdump.log

参数说明
(1)tcp: ip icmp arp rarp 和 tcp、udp、icmp这些选项等都要放到第一个参数的位置,用来过滤数据报的类型
(2)-i eth1 : 只抓经过接口eth1的包
(3)-t : 不显示时间戳
(4)-s 0 : 抓取数据包时默认抓取长度为68字节。加上-S 0 后可以抓到完整的数据包
(5)-c 100 : 只抓取100个数据包
(6)dst port ! 22 : 不抓取目标端口是22的数据包
(7)src net 192.168.1.0/24 : 数据包的源网络地址为192.168.1.0/24
(8)-w ./target.cap : 保存成cap文件,方便用ethereal(即wireshark)分析

48. linux如何挂载windows下的共享目录

mount -t cifs -o username="共享用户",password="密码" //ip/共享目录 /mnt

49. 在linux主机只允许远程主机访问80端口,通过iptables实现
iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
iptables -A INPUT -p icmp -j DROP

iptables -F 清空规则
iptables -X 删除用户自定义的链
iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
iptables -P INPUT DROP 设置默认策略的

50. 6块300G硬盘做raid 5,请问实际在操作系统中可用磁盘多大?
磁盘空间x(n-1) =300Gx(6-1) =1800G

51. 通过nestat命令找出apache运行的pid
netstat -tlnp |grep httpd

52.说明linux命令中-exec和xargs的区别
exec命令的格式为: exec command {} \;
有些系统对传递给exec的命令长度有限制,会出现溢出错误。
execexec命令将为每一个参数单独执行一条命令,效率低
而xargs是将所有的参数传递给命令,只有一个进程。 
参数中不能有空格

53. 统计目录A中所有.svn文件夹合计占用磁盘大小
find a -name ".svn" |xargs du -h -c .svn

54.将文件夹A中1个小时内产生的后缀为.php的文件删除
find a -name "*.php" -mmin -60 | xargs -i rm {}


55. 统计access.log某个时间点产生的总流量
cat access.log |awk '{if (match($4,"07/Mar/2017:05:24:49")) ;sum+=$10} END {print sum}'
07/Mar/2017:05:24:49

56. crontab误删了,如何恢复
/var/log/cron

0 0 * * * * /usr/bin/crontab -l>/backup/crontab`date '+%Y%m%d'`.bak

mysql题

1.mysql主从延迟原因以及解决方案 

原因:当主库的TPS并发较高时,产生的DDL数量超过slave一个sql线程所能承受的范围,那么延时就产生了,当然还有就是可能与slave的大型query语句产生了锁等待。

解决方案:
在架构上做优化,尽量让主库的DDL快速执行。


主库是写,对数据安全性较高,比如sync_binlog=1,innodb_flush_log_at_trx_commit = 1 之类的设置,而slave则不需要这么高的数据安全,完全可以讲sync_binlog设置为0或者关闭binlog,innodb_flushlog也可以设置为0来提高sql的执行效率。

选择支持多线程的mysql版本来进行主从复制,避免并发高峰时可能的延迟,mysql-5.6.3已经支持了多线程的主从复制。


使用比主库更好的硬件设备作为slave。


MySQL数据库主从同步延迟产生的因素。 
1. 网络延迟 
2. master负载 
3. slave负载 
 一般的做法是,使用多台slave来分摊读请求,再从这些slave中取一台专用的服务器,只作为备份用,不进行其他任何操作,就能相对最大限度地达到’实时’的要求了


2.简述存储引擎Myisam和Innodb的区别与应用场景

MyISAM
  它不支持事务,也不支持外键,尤其是访问速度快,对事务完整性没有要求或者以SELECT、INSERT为主的应用基本都可以使用这个引擎来创建表

InnoDB存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。但是对比MyISAM的存储引擎,InnoDB写的处理效率差一些并且会占用更多的磁盘空间以保留数据和索引。


两种存储引擎的大致区别表现在:
1)InnoDB支持事务,MyISAM不支持,这一点是非常之重要。事务是一种高级的处理方式,如在一些列增删改中只要哪个出错还可以回滚还原,而MyISAM就不可以了。
2)MyISAM适合查询以及插入为主的应用,InnoDB适合频繁修改以及涉及到安全性较高的应用
3)InnoDB支持外键,MyISAM不支持
4)从MySQL5.5.5以后,InnoDB是默认引擎
5)InnoDB不支持FULLTEXT类型的索引
6)InnoDB中不保存表的行数,如select count(*) from table时,InnoDB需要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count(*)语句包含where条件时MyISAM也需要扫描整个表
7)对于自增长的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中可以和其他字段一起建立联合索引
8)清空整个表时,InnoDB是一行一行的删除,效率非常慢。MyISAM则会重建表
9)InnoDB支持行锁(某些情况下还是锁整表,如 update table set a=1 where user like '%lee%'

关于MyISAM与InnoDB选择使用:
MYISAM和INNODB是Mysql数据库提供的两种存储引擎。两者的优劣可谓是各有千秋。INNODB会支持一些关系数据库的高级功能,如事务功能和行级锁,MYISAM不支持。MYISAM的性能更优,占用的存储空间少。所以,选择何种存储引擎,视具体应用而定:

1)如果你的应用程序一定要使用事务,毫无疑问你要选择INNODB引擎。但要注意,INNODB的行级锁是有条件的。在where条件没有使用主键时,照样会锁全表。比如DELETE FROM mytable这样的删除语句。

2)如果你的应用程序对查询性能要求较高,就要使用MYISAM了。MYISAM索引和数据是分开的,而且其索引是压缩的,可以更好地利用内存。所以它的查询性能明显优于INNODB。压缩后的索引也能节约一些磁盘空间。MYISAM拥有全文索引的功能,这可以极大地优化LIKE查询的效率。

3.mysql高可用方案有哪些?mysql备份方案有哪些?有什么优缺点
Keepalived+MySQL Replication
MySQL架构为主从形式,当master故障时,会自动切换到slave上.
Keepalived的作用是检测MySQL服务器状态,如果有一台MySQL服务器出现故障后将其剔除,当故障恢复后,自动将服务器加入集群中。

Heartbeat+DRBD+MySQL
Heartbeat可实现心跳监测和资源接管
DRBD是一个用软件实现的、无共享的、服务器之间镜像块设备内容的存储复制解决方案。
当master出现故障,VIP就会漂移到slave上,DRBD分区会自动挂载。

MMM(Master-Master Replication Manager for MySQL)主主复制管理器,是一套提供了MySQL主主复制配置的监控、故障迁移和管理的可伸缩的脚本程序。在MMM高可用解决方案中,可以配置双主多从架构,通过MySQL Replication技术可以实现两台MySQL服务器互为主从,并且在任何时候只有一个节点可以写入,避免多节点写入的数据冲突,同时,当可写节点故障时,MMM套件可以立即监控到,然后将服务自动切换到另一个主节点继续提供服务,从而实现MySQL的高可用。
简而言之,通过MMM可以实现监控和管理MySQL主主复制和服务状态,同时也可以监控多个Slave节点的复制和运行状态,并且可以做到任意节点发生故障时实现自动切换的功能。MMM也为MySQL提供了读、写分离架构的良好平台。


逻辑备份:mysqldump

优点:

1、恢复简单,可以使用管道将他们输入到MySQL

2、与存储引擎无关,因为是从MySQL服务器中提取数据而生成的,所以消除了底层数据存储的不同

3、有助于避免数据损坏。若磁盘驱动器有故障而要复制原始文件时,此时将得到一个损坏的备份

缺点:

1、  必须有数据库服务器完成逻辑工作,需要更多地cpu周期

2、  逻辑备份还原速度慢:需要MySQL加载和解释语句、转化存储格式、重建引擎

物理备份:xtrabackup

优点:

1、  基于文件的物理备份

2、  容易跨平台、跨操作系统和MySQL版本

3、  恢复起来会更快(不需要执行任何的mysql语句,不需要构建索引,innoDB表无需完全缓存到内存)

缺点:

1、  文件大

2、  不总是可以跨平台、操作系统和MySQL版本

binlog备份

应用场景
对于一些由于错误操作等造成数据丢失错误的,需要按照时间点进行还原的情况下。

备份时间及地点
备份服务器实时将主库上binlog同步到远程服务器上

 

1、Linux 系统的开机启动顺序,以及内核Linux 裁剪的意义。

https://blog.csdn.net/qq_33932782/article/details/82258999
2、解释下BGP 的含义

BGP是自治系统间的路由协议,BGP交换的网络可达性信息提供了足够的信息来检测路由回路并根据性能优先和策略约束对路由进行决策
3、简述BGP 的优点

BGP机房就是服务器租用商通过技术的手段,实际不同运营商能共同访问一个IP,并且不同运营商之间都能达到最快的接入速度的相关网络技术

https://baike.baidu.com/item/BGP%E8%B7%AF%E7%94%B1%E5%8D%8F%E8%AE%AE/7640427?fr=aladdin
4、??网络专线就是??网络服务提供商给?用户提供专?用的信道,让?用户的数据传输变得可靠可信,专线的
优点就是安全性好, QoS 可以得到保证。不过,专线租?用价格也相对?比较?高,?而且管理也需要专业
?人员。
简述专线主要有两种信道,主要是(物理专用信道 )信道和(虚拟专用信道 )信道,如果现在要搭建北京公司到??广
东分公司的??网络专线,请在不考虑成本的情况下,做出?一套专?用??网络的?方案。要求?至少包含实现的
思路和简单拓扑结构。
5、简述VXLAN 的原理

VXLAN 全称是 Virtual eXtensible Local Area Network,虚拟可扩展的局域网。它是一种 overlay 技术,通过三层的网络来搭建虚拟的二层网络
6、软件定义 ??网络S(oftware Defined Network, SDN ),是由美国斯坦福 ?大cle学an slate 研究
组提出的?一种新型??网络创新架构,其核?心技术OpenFlow 通过将??网络设备控制?面与数据?面分离开
来,从?而实现了??网络流量的灵活控制,为核?心??网络及应?用的创新提供了良好的平台。
?xml version="1.0" encoding="UTF-8" standalone="no"?
请简述你了解的SDN 技术是什么,为了解决什么问题?

是由Emulex提出的一种新型网络创新架构,其核心技术OpenFlow通过将网络设备控制面与数据面分离开来,从而实现了网络流量的灵活控制,为核心网络及应用的创新提供了良好的平台
7、通过proc ?文件系统怎么找到id 为235的进程?文件在那个位置,打开了哪些?文件,启动
参数是什么,他的?父进程id 是多少,他的?子进程id 有哪些?

我们先了解/proc文件系统中的内容
/proc文件系统下的多种文件提供的系统信息不是针对某个特定进程的,而是能够在整个系统范围的上下文中使用。可以使用的文件随系统配置的变化而变化。命令procinfo能够显示基于其中某些文件的多种系统信息。以下详细描述/proc下的文件。
--------------------------------------------------------------------------------
/proc/cmdline文件
这个文件给出了内核启动的命令行。它和用于进程的cmdline项非常相似。
--------------------------------------------------------------------------------
/proc/cpuinfo文件
这 个文件提供了有关系统CPU的多种信息。这些信息是从内核里对CPU的测试代码中得到的。文件列出了CPU的普通型号(386,486,586,686 等),以及能得到的更多特定信息(制造商,型号和版本)。文件还包含了以bogomips表示的处理器速度,而且如果检测到CPU的多种特性或者bug, 文件还会包含相应的标志。这个文件的格式为:文件由多行构成,每行包括一个域名称,一个冒号和一个值。
--------------------------------------------------------------------------------
/proc/devices文件
这个文件列出字符和块设备的主设备号,以及分配到这些设备号的设备名称。
--------------------------------------------------------------------------------
/proc/dma文件
这个文件列出由驱动程序保留的DMA通道和保留它们的驱动程序名称。casade项供用于把次DMA控制器从主控制器分出的DMA行所使用;这一行不能用于其它用途。
--------------------------------------------------------------------------------
/proc/filesystems文件
这个文件列出可供使用的文件系统类型,一种类型一行。虽然它们通常是编入内核的文件系统类型,但该文件还可以包含可加载的内核模块加入的其它文件系统类型。
--------------------------------------------------------------------------------
/proc/interrupts文件
这 个文件的每一行都有一个保留的中断。每行中的域有:中断号,本行中断的发生次数,可能带有一个加号的域(SA_INTERRUPT标志设置),以及登记这 个中断的驱动程序的名字。可以在安装新硬件前,像查看/proc/dma和/proc/ioports一样用cat命令手工查看手头的这个文件。这几个文 件列出了当前投入使用的资源(但是不包括那些没有加载驱动程序的硬件所使用的资源)。
--------------------------------------------------------------------------------
/proc/ioports文件
这个文件列出了诸如磁盘驱动器,以太网卡和声卡设备等多种设备驱动程序登记的许多I/O端口范围。
--------------------------------------------------------------------------------
/proc/kcore文件
这个文件是系统的物理内存以core文件格式保存的文件。例如,GDB能用它考察内核的数据结构。它不是纯文本,而是/proc目录下为数不多的几个二进制格式的项之一。
-------------------------------------------------------------------------------
/proc/kmsg文件
这个文件用于检索用printk生成的内核消息。任何时刻只能有一个具有超级用户权限的进程可以读取这个文件。也可以用系统调用syslog检索这些消息。通常使用工具dmesg或守护进程klogd检索这些消息。
--------------------------------------------------------------------------------
/proc/ksyms文件
这个文件列出了已经登记的内核符号;这些符号给出了变量或函数的地址。每行给出一个符号的地址,符号名称以及登记这个符号的模块。程序ksyms,insmod和kmod使用这个文件。它还列出了正在运行的任务数,总任务数和最后分配的PID。
--------------------------------------------------------------------------------
/proc/loadavg文件
这个文件给出以几个不同的时间间隔计算的系统平均负载,这就如同uptime命令显示的结果那样。前三个数字是平均负载。这是通过计算过去1分钟,5分钟,15分钟里运行队列中的平均任务数得到的。随后是正在运行的任务数和总任务数。最后是上次使用的进程号。
--------------------------------------------------------------------------------
/proc/locks文件
这个文件包含在打开的文件上的加锁信息。文件中的每一行描述了特定文件和文档上的加锁信息以及对文件施加的锁的类型。内核也可以需要时对文件施加强制性锁。
--------------------------------------------------------------------------------
/proc/mdstat文件
这个文件包含了由md设备驱动程序控制的RAID设备信息。
--------------------------------------------------------------------------------
/proc/meminfo文件
这个文件给出了内存状态的信息。它显示出系统中空闲内存,已用物理内存和交换内存的总量。它还显示出内核使用的共享内存和缓冲区总量。这些信息的格式和free命令显示的结果类似。
--------------------------------------------------------------------------------
/proc/misc文件
这个文件报告用内核函数misc_register登记的设备驱动程序。
--------------------------------------------------------------------------------
/proc/modules文件
这个文件给出可加载内核模块的信息。lsmod程序用这些信息显示有关模块的名称,大小,使用数目方面的信息。
--------------------------------------------------------------------------------
/proc/mounts文件
这个文件以/etc/mtab文件的格式给出当前系统所安装的文件系统信息。这个文件也能反映出任何手工安装从而在/etc/mtab文件中没有包含的文件系统。
--------------------------------------------------------------------------------
/proc/pci文件
这个文件给出PCI设备的信息。用它可以方便地诊断PCI问题。你可以从这个文件中检索到的信息包括诸如IDE接口或USB控制器这样的设备,总线,设备和功能编号,设备延迟以及IRQ编号。
--------------------------------------------------------------------------------
/proc/stat文件
这个文件包含的信息有CPU利用率,磁盘,内存页,内存对换,全部中断,接触开关以及赏赐自举时间(自1970年1月1日起的秒数)。
--------------------------------------------------------------------------------
/proc/uptime文件
这个文件给出自从上次系统自举以来的秒数,以及其中有多少秒处于空闲。这主要供uptime程序使用。比较这两个数字能够告诉你长期来看CPU周期浪费的比例。
--------------------------------------------------------------------------------
/proc/version文件
这个文件只有一行内容,说明正在运行的内核版本。可以用标准的编程方法进行分析获得所需的系统信息。
--------------------------------------------------------------------------------
/proc/net子目录
此目录下的文件描述或修改了联网代码的行为。可以通过使用arp,netstat,route和ipfwadm命令设置或查询这些特殊文件中的许多文件。
位置:

[root@myfuture 1]# pwd
/proc/1
打开的文件:

[root@myfuture 1]# lsof -p 1
COMMAND PID USER   FD   TYPE             DEVICE SIZE/OFF   NODE NAME
init      1 root  cwd    DIR              253,0     4096      2 /
init      1 root  rtd    DIR              253,0     4096      2 /
init      1 root  txt    REG              253,0   150352 261703 /sbin/init
init      1 root  mem    REG              253,0    65928 392482 /lib64/libnss_files-2.12.so
扩展一下:显示某个目录所有打开的文件:
lsof +目录

启动参数:

 

[root@myfuture 1]# cat cmdline
/sbin/init[root@myfuture 1]# 
 

他的父进程id 是多少,他的子进程id

 

[root@myfuture proc]#  cat /proc/1/status | grep -E *id

#pid 进程号, ppid 父进程号, tgid进程组号


8、请写出iptables 语句 iptables [-t 表名] - 命令-匹配-j 动作/ ??目标
1)本地80端?口的请求转发到远端服务器10.0.3.188:8080 端?口,当前主机IP为
192.168.2. ,并且保证服务正常使?用
2)允许本机对外连接80端?口(本机能连外界服务器为80)
3)开放本机的3306端?口
4)禁?止外界ping 本服务器

1.[root@myfuture ~]# iptables -t nat -A PREROUTING -p tcp -d 192.168.2.1 --dport 80 -j DNAT --to-destination 10.0.3.188:8080
2.iptables -A OUTPUT -p tcp –dport 80 -j ACCEPT
3.iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
4.iptables -A INPUT -p icmp -j DROP

9、在时间维度上控制多个myget 下载进程的总下载速度,其中myget 是一个下载命令, 由
sourceforge 上软件myget 提供,它的常用选项如下:
◆-d [目录]:指定下载到的?文件在本地存放的位置,默认当前??目录。
◆-f [ 文件]:指定下载?文件名称。
◆-h:帮助选项。
◆-n [线程数]:下载线程数量,默认为4个。
程序说明: (1) 语言不限, 但要简洁, 思路清晰
(2) 尽量使用语言的高级语法
(3)展现编程的技巧与艺术,有想象力,例如”第二列的速率可以为0”, 怎么理解这
句话这不是题意不清,而是考查实力与想象力.
(4) 因为程序需长时间执行, 所以尽量以demon 形式实现(不是必须)
(5) 限速方法不限, 例如tc
程序需有三个可配置的?文件:
(1)d.conf: 主配置?文件,对于max_, mini_ 的解释, 请看第三个配置?文件的解释;
max_1=1g # 对应dlimit.conf 中的$1上限值
mini_1=100m # 对应dlimit.conf 中的$1 下限值
max_2=1000m
mini_2=100m
max_3=500k
mini_3=100k
threads=199 # 下载的线程数, myget 此参数配置里面的线程数; myget 参数之一
dir=/dev/null # 下载 文件存放的 目; m录yget 参数之 一
proc=10 # 同时下载的进程数,如dlist.conf 有100 个文件地,编号为1-100; 如果
配置为10, 则保证有10个myget 下载编号为1-10 的?文件,如果下载完了,则去下载11,12,
以此类推; 要保证同时有10个myget 同时在运行.
(2)dlist.conf: 指定下载列表, 每行是文件的url
http://ip1/?le1
http://ip1/?le2
http://ip2/?le1
(3) dlimit.conf: 单位的规则由编程者自己制定
00:00 200k
00:05 0m
00:10 $1
00:15 $1
⋯⋯
23:50 100k
23:55 95m
解释一下此配置?文件:
(1)一天有24*60/5 个”五分钟”, 这个文件里有24*60/5 行, “ 00:00 200k
“是指00:00 到00:05 内, 所有myget 相关进程总下载速度应该被限制在200k/s 之下;
(2) 第二列的速率可以为0;
(3)注意这?里面还有”$1”, 用户可以在d.conf 里指定任意个min_n,max_n 对,
对应于一个随机数$n的上限和下限, 例如“00:10 $1 “,
查看d.conf 中max_1=1g, mini_1=100m, 那么在00:10 到00:15 内限速到100m 到1g之间
的一个随机值, 可能是200m, 700m 等;
(4)多个同样的$n, 需要独立计算随机数, 例如
00:10 $1
00:15 $1
00:10-00:15 和00:15-00:20 需要独?立计算;
注意:
1.myget 是个 shell命令 , 所以可能需要在您采 用的语 言里执shell行命令 ; 但如果 
C或C++ 实现,不排除直接包含myget 的源代码;
2.假如myget 难以安装在您的操作系统里,可以直接编写, 虽无法测试程序, 但更能
体现对语言的掌握程度.(myget-0.1.2-4.el6.x86_64.rpm 可以在RHEL 6.2 x86_64
上安装成功)
10、有下面几条路由,把他们汇总合并下:
58.16.0.0/12 via 58.63.246.89 dev em1
58.32.0.0/12 via 116.213.249.19 dev em1
58.48.0.0/12 via 116.213.249.19 dev em1
58.64.0.0/12 via 116.213.249.19 dev em1
58.80.0.0/12 via 58.63.246.89 dev em1
58.96.0.0/12 via 58.63.246.89 dev em1
58.112.0.0/12 via 58.63.246.89 dev em1
11、在 一台做nat的linux 网关服务器上,怎样从系统中查看 一个ip为源2.3.4.5 且目的端 口
为34512 的链接, 经过nat 转换后的具体ip地址。
12、在windows 的cmd 下ping 83421345 显示的点分十进制ip是多少并用自己熟悉的语
言,写出ip转换算法功能函数代码。

#!/bin/bash

function int_to_ip()
{
        a=$(($1/256/256/256))
        b=$(($1/256/256 -$a*256))
        c=$(($1/256 -$a*256*256-$b*256))
        d=$(($1-$a*256*256*256-$b*256*256-$c*256))
        echo $a"."$b"."$c"."$d
}

ip=83421345
count=10
i=1
while [ $i -lt $count ]
do
        nip=`int_to_ip $ip`
        echo $nip
        i=$(($i+1))
        ip=$(($ip+1))
done




#!/bin/sh
 
if [ $# -ne 2 ]
then
    echo "$0 -[i|n] [ip|num]"
    exit 1
fi
 
function num2ip()
{
    num=$1
    a=$((num>>24))
    b=$((num>>16&0xff))
    c=$((num>>8&0xff))
    d=$((num&0xff))
 
    echo "$d.$c.$b.$a"
}
 
function ip2num()
{
    ip=$1
    a=`echo $ip | awk -F'.' '{print $1}'`
    b=`echo $ip | awk -F'.' '{print $2}'`
    c=`echo $ip | awk -F'.' '{print $3}'`
    d=`echo $ip | awk -F'.' '{print $4}'`
 
    echo "$(((d<<24)+(c<<16)+(b<<8)+a))"
}
 
if [ "$1" = "-i" ]
then
    ip2num $2
elif [ "$1" = "-n" ]
then
    num2ip $2
else
    echo "$0 -[i|n] [ip|num]"
    exit 1
fi

13、在linux 系统和其他厂家网络设备,静态路由,直连路由优先级顺序是什么

1)开头加解释器:#!/bin/bash

 

2)语法缩进,使用四个空格;多加注释说明。

 

3)命名建议规则:变量名大写、局部变量小写,函数名小写,名字体现出实际作用。

 

4)默认变量是全局的,在函数中变量local指定为局部变量,避免污染其他作用域。

 

5)有两个命令能帮助我调试脚本:set -e 遇到执行非0时退出脚本,set-x 打印执行过程。

 

6)写脚本一定先测试再到生产上。

 

1 获取随机字符串或数字

 

获取随机8位字符串:

 

方法1:
# echo $RANDOM |md5sum |cut -c 1-8
471b94f2
方法2:
# openssl rand -base64 4
vg3BEg==
方法3:
# cat /proc/sys/kernel/random/uuid |cut -c 1-8
ed9e032c

 

获取随机8位数字:

 

方法1:
# echo $RANDOM |cksum |cut -c 1-8
23648321
方法2:
# openssl rand -base64 4 |cksum |cut -c 1-8
38571131
方法3:
# date +%N |cut -c 1-8
69024815

 

cksum:打印CRC效验和统计字节

 

2 定义一个颜色输出字符串函数

 

方法1:
function echo_color() {
    if [ $1 == "green" ]; then
        echo -e "\033[32;40m$2\033[0m"
    elif [ $1 == "red" ]; then
        echo -e "\033[31;40m$2\033[0m"
    fi
}
方法2:
function echo_color() {
    case $1 in
        green)
            echo -e "\033[32;40m$2\033[0m"
            ;;
        red)
            echo -e "\033[31;40m$2\033[0m" 
            ;;
        *) 
            echo "Example: echo_color red string"
    esac
}
使用方法:echo_color green "test"

 

function关键字定义一个函数,可加或不加。

 

3 批量创建用户

 

#!/bin/bash
DATE=$(date +%F_%T)
USER_FILE=user.txt
echo_color(){
    if [ $1 == "green" ]; then
        echo -e "\033[32;40m$2\033[0m"
    elif [ $1 == "red" ]; then
        echo -e "\033[31;40m$2\033[0m"
    fi
}
# 如果用户文件存在并且大小大于0就备份
if [ -s $USER_FILE ]; then
    mv $USER_FILE ${USER_FILE}-${DATE}.bak
    echo_color green "$USER_FILE exist, rename ${USER_FILE}-${DATE}.bak"
fi
echo -e "User\tPassword" >> $USER_FILE
echo "----------------" >> $USER_FILE
for USER in user{1..10}; do
    if ! id $USER &>/dev/null; then
        PASS=$(echo $RANDOM |md5sum |cut -c 1-8)
        useradd $USER
        echo $PASS |passwd --stdin $USER &>/dev/null
        echo -e "$USER\t$PASS" >> $USER_FILE
        echo "$USER User create successful."
    else
        echo_color red "$USER User already exists!"
    fi
done

 

4 检查软件包是否安装

 

#!/bin/bash
if rpm -q sysstat &>/dev/null; then
    echo "sysstat is already installed."
else
    echo "sysstat is not installed!"
fi

 

5 检查服务状态

 

#!/bin/bash
PORT_C=$(ss -anu |grep -c 123)
PS_C=$(ps -ef |grep ntpd |grep -vc grep)
if [ $PORT_C -eq 0 -o $PS_C -eq 0 ]; then
    echo "内容" | mail -s "主题" dst@example.com
fi

 

6 检查主机存活状态

 

方法1:将错误IP放到数组里面判断是否ping失败三次

 

#!/bin/bash  
IP_LIST="192.168.18.1 192.168.1.1 192.168.18.2"
for IP in $IP_LIST; do
    NUM=1
    while [ $NUM -le 3 ]; do
        if ping -c 1 $IP > /dev/null; then
            echo "$IP Ping is successful."
            break
        else
            # echo "$IP Ping is failure $NUM"
            FAIL_COUNT[$NUM]=$IP
            let NUM++
        fi
    done
    if [ ${#FAIL_COUNT[*]} -eq 3 ];then
        echo "${FAIL_COUNT[1]} Ping is failure!"
        unset FAIL_COUNT[*]
    fi
done

 

方法2:将错误次数放到FAIL_COUNT变量里面判断是否ping失败三次

 

#!/bin/bash  
IP_LIST="192.168.18.1 192.168.1.1 192.168.18.2"
for IP in $IP_LIST; do
    FAIL_COUNT=0
    for ((i=1;i<=3;i++)); do
        if ping -c 1 $IP >/dev/null; then
            echo "$IP Ping is successful."
            break
        else
            # echo "$IP Ping is failure $i"
            let FAIL_COUNT++
        fi
    done
    if [ $FAIL_COUNT -eq 3 ]; then
        echo "$IP Ping is failure!"
    fi
done

 

方法3:利用for循环将ping通就跳出循环继续,如果不跳出就会走到打印ping失败

 

#!/bin/bash
ping_success_status() {
    if ping -c 1 $IP >/dev/null; then
        echo "$IP Ping is successful."
        continue
    fi
}
IP_LIST="192.168.18.1 192.168.1.1 192.168.18.2"
for IP in $IP_LIST; do
    ping_success_status
    ping_success_status
    ping_success_status
    echo "$IP Ping is failure!"
done

 

7 监控CPU、内存和硬盘利用率

 

1)CPU

 

借助vmstat工具来分析CPU统计信息。

 

#!/bin/bash
DATE=$(date +%F" "%H:%M)
IP=$(ifconfig eth0 |awk -F '[ :]+' '/inet addr/{print $4}')  # 只支持CentOS6
MAIL="example@mail.com"
if ! which vmstat &>/dev/null; then
    echo "vmstat command no found, Please install procps package." 
    exit 1
fi
US=$(vmstat |awk 'NR==3{print $13}')
SY=$(vmstat |awk 'NR==3{print $14}')
IDLE=$(vmstat |awk 'NR==3{print $15}')
WAIT=$(vmstat |awk 'NR==3{print $16}')
USE=$(($US+$SY))
if [ $USE -ge 50 ]; then
    echo "
    Date: $DATE
    Host: $IP
    Problem: CPU utilization $USE
    " | mail -s "CPU Monitor" $MAIL
fi

 

2)内存

 

#!/bin/bash
DATE=$(date +%F" "%H:%M)
IP=$(ifconfig eth0 |awk -F '[ :]+' '/inet addr/{print $4}')  
MAIL="example@mail.com"
TOTAL=$(free -m |awk '/Mem/{print $2}')
USE=$(free -m |awk '/Mem/{print $3-$6-$7}')
FREE=$(($TOTAL-$USE))
# 内存小于1G发送报警邮件
if [ $FREE -lt 1024 ]; then
    echo "
    Date: $DATE
    Host: $IP
    Problem: Total=$TOTAL,Use=$USE,Free=$FREE
    " | mail -s "Memory Monitor" $MAIL
fi

 

3)硬盘

 

#!/bin/bash
DATE=$(date +%F" "%H:%M)
IP=$(ifconfig eth0 |awk -F '[ :]+' '/inet addr/{print $4}')  
MAIL="example@mail.com"
TOTAL=$(fdisk -l |awk -F'[: ]+' 'BEGIN{OFS="="}/^Disk \/dev/{printf "%s=%sG,",$2,$3}')
PART_USE=$(df -h |awk 'BEGIN{OFS="="}/^\/dev/{print $1,int($5),$6}')
for i in $PART_USE; do
    PART=$(echo $i |cut -d"=" -f1)
    USE=$(echo $i |cut -d"=" -f2)
    MOUNT=$(echo $i |cut -d"=" -f3)
    if [ $USE -gt 80 ]; then
        echo "
        Date: $DATE
        Host: $IP
        Total: $TOTAL
        Problem: $PART=$USE($MOUNT)
        " | mail -s "Disk Monitor" $MAIL
    fi
done

 

8 批量主机磁盘利用率监控

 

前提监控端和被监控端SSH免交互登录或者密钥登录。

 

写一个配置文件保存被监控主机SSH连接信息,文件内容格式:IP User Port

 

#!/bin/bash
HOST_INFO=host.info
for IP in $(awk '/^[^#]/{print $1}' $HOST_INFO); do
    USER=$(awk -v ip=$IP 'ip==$1{print $2}' $HOST_INFO)
    PORT=$(awk -v ip=$IP 'ip==$1{print $3}' $HOST_INFO)
    TMP_FILE=/tmp/disk.tmp
    ssh -p $PORT $USER@$IP 'df -h' > $TMP_FILE
    USE_RATE_LIST=$(awk 'BEGIN{OFS="="}/^\/dev/{print $1,int($5)}' $TMP_FILE)
    for USE_RATE in $USE_RATE_LIST; do
        PART_NAME=${USE_RATE%=*}
        USE_RATE=${USE_RATE#*=}
        if [ $USE_RATE -ge 80 ]; then
            echo "Warning: $PART_NAME Partition usage $USE_RATE%!"
        fi
    done
done

 

9 检查网站可用性

 

1)检查URL可用性

 

方法1:
check_url() {
    HTTP_CODE=$(curl -o /dev/null --connect-timeout 3 -s -w "%{http_code}" $1)
    if [ $HTTP_CODE -ne 200 ]; then
        echo "Warning: $1 Access failure!"
    fi
}
方法2:
check_url() {
if ! wget -T 10 --tries=1 --spider $1 >/dev/null 2>&1; then  
#-T超时时间,--tries尝试1次,--spider爬虫模式
        echo "Warning: $1 Access failure!"
    fi
}

 

使用方法:check_url www.baidu.com

 

2)判断三次URL可用性

 

思路与上面检查主机存活状态一样。

 

方法1:利用循环技巧,如果成功就跳出当前循环,否则执行到最后一行
#!/bin/bash  
check_url() {
    HTTP_CODE=$(curl -o /dev/null --connect-timeout 3 -s -w "%{http_code}" $1)
    if [ $HTTP_CODE -eq 200 ]; then
        continue
    fi
}
URL_LIST="www.baidu.com www.agasgf.com"
for URL in $URL_LIST; do
    check_url $URL
    check_url $URL
    check_url $URL
    echo "Warning: $URL Access failure!"
done

方法2:错误次数保存到变量
#!/bin/bash  
URL_LIST="www.baidu.com www.agasgf.com"
for URL in $URL_LIST; do
    FAIL_COUNT=0
    for ((i=1;i<=3;i++)); do
        HTTP_CODE=$(curl -o /dev/null --connect-timeout 3 -s -w "%{http_code}" $URL)
        if [ $HTTP_CODE -ne 200 ]; then
            let FAIL_COUNT++
        else
            break
        fi
    done
    if [ $FAIL_COUNT -eq 3 ]; then
        echo "Warning: $URL Access failure!"
    fi
done

方法3:错误次数保存到数组
#!/bin/bash  
URL_LIST="www.baidu.com www.agasgf.com"
for URL in $URL_LIST; do
    NUM=1
    while [ $NUM -le 3 ]; do
        HTTP_CODE=$(curl -o /dev/null --connect-timeout 3 -s -w "%{http_code}" $URL)
        if [ $HTTP_CODE -ne 200 ]; then
            FAIL_COUNT[$NUM]=$IP  #创建数组,以$NUM下标,$IP元素
            let NUM++
        else
            break
        fi
    done
    if [ ${#FAIL_COUNT[*]} -eq 3 ]; then
        echo "Warning: $URL Access failure!"
        unset FAIL_COUNT[*]    #清空数组
    fi
done

 

10 检查MySQL主从同步状态

 

#!/bin/bash  
USER=bak
PASSWD=123456
IO_SQL_STATUS=$(mysql -u$USER -p$PASSWD -e 'show slave status\G' |awk -F: '/Slave_.*_Running/{gsub(": ",":");print $0}')  #gsub去除冒号后面的空格
for i in $IO_SQL_STATUS; do
    THREAD_STATUS_NAME=${i%:*}
    THREAD_STATUS=${i#*:}
    if [ "$THREAD_STATUS" != "Yes" ]; then
        echo "Error: MySQL Master-Slave $THREAD_STATUS_NAME status is $THREAD_STATUS!"
    fi
done
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值