@mrz1
2017-12-23T12:30:49.000000Z
字数 11221
阅读 1153
笔记
磁盘访问量: iotop iostat
网卡利用率(吞吐量):dstat(动态观察) ifconfig -s eth0(动态 watch -n0.5 ifconfig -s eth0)
同时运行多个进程,提高效率
方法1vi all.shf1.sh&f2.sh&f3.sh&方法2(f1.sh&);(f2.sh&);(f3.sh&) //开三个子shell 后台执行方法3{ f1.sh& f2.sh& f3.sh& }
centos6
/etc/rc.d/init.d/atd//at服务进程为例
[root@centos6 ~]#chkconfig --list atd //查看是否开机启动atd 0:off 1:off 2:off 3:on 4:on 5:on 6:off[root@centos6 ~]#runlevel //现在运行的模式是5模式是启动呢N 5[root@centos6 ~]#chkconfig atd on //设置开机启动[root@centos6 ~]#service atd status //现在是否启动atd (pid 2123) is running...
centos7
/usr/lib/systemd/system/atd.service//at服务进程为例
[root@centos7 ~]#systemctl is-enabled atd //开启服务.service 可以省略enabled //表示开机启动systemctl status atd //现在是否启动(与contos6 不一样)好处可以执行多个命令
[root@centos7 ~]#systemctl status atd● atd.service - Job spooling toolsLoaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled)Active: active (running) since Mon 2017-12-18 19:31:01 CST; 1h 18min agoMain PID: 947 (atd)CGroup: /system.slice/atd.service //这个服务调用的是/usr/sbin/atd└─947 /usr/sbin/atd -f.........
同步服务器时间
ntpdate 127.0.0.1(ip地址)同步硬件时间clock -w
包:atat命令:at [option] TIME常用选项:-V 显示版本信息:-l: 列出指定队列中等待运行的作业;相当于atq-d: 删除指定的作业;相当于atrm-c: 查看具体作业任务-f /path/from/somefile:从指定的文件中读取任务-m:当任务被完成之后,将给用户发送邮件,即使没有标准输出注意:作业执行命令的结果中的标准输出和错误以邮件通知给相关用户建议:如果放到计划任务中的脚本,涉及到没有必要的标准输出;建议扔到垃圾箱`/dev/null`否则产生大量垃圾邮件TIME:定义出什么时候进行at 这项任务的时间HH:MM [YYYY-mm-dd]noon 中午,midnight 午夜, teatime(4pm)下午茶时间(下午4时)tomorrow 明天now+#{minutes(分),hours(时),days(日), OR weeks(星期)}
HH:MM 02:00在今日的HH:MM 进行,若该时刻已过,则明天此时执行任务HH:MM YYYY-MM-DD 02:00 2016-09-20规定在某年某月的某一天的特殊时刻进行该项任务HH:MM[am|pm] [Month] [Date]04pm March 1717:20 tomorrowHH:MM[am|pm] + number [minutes|hours|days|weeks]在某个时间点再加几个时间后才进行该项任务now + 5 minutes02pm + 3 days
/etc/at.allow默认不存在,只有该文件中的用户才能执行at命令/etc/at.deny默认存在,拒绝该文件中用户执行at命令,而没有在at.deny文件中的使用者则可执行注意:如果建立白名单则只有白名单人员生效,黑名单失效 ;白名单没人;则只有root可以执行
周期性任务计划:cron
相关的程序包:
1. cronie: 主程序包,提供crond守护进程及相关辅助工具
2. cronie-anacron:cronie的补充程序,用于监控cronie任务执行状况,如cronie中的任务在过去该运行的时间点未能正常运行,则anacron会随后启动一次此任务
3. crontabs:包含CentOS提供系统维护任务;例:run-parts /app/执行app下所有脚本
确保crond守护处于运行状态:
CentOS 7:systemctl status crond
CentOS 6:service crond status
计划周期性执行的任务提交给crond,到指定时间会自动运行系统cron任务:
系统维护作业:/etc/crontab
用户cron任务:crontab命令
日志:/var/log/cron //看看计划任务执行了没有 假如误删除脚步 可以在/var/log/cron里面根据时间和执行过的命令来恢复脚本
系统cron任务:/etc/crontab
注释行以:# 开头
详情参见:man 5 crontab
[root@centos7 ~]#cat /etc/crontabSHELL=/bin/bashPATH=/sbin:/bin:/usr/sbin:/usr/binMAILTO=root# For details see man 4 crontabs# Example of job definition:# .---------------- minute (0 - 59) 分钟# | .------------- hour (0 - 23) 小时# | | .---------- day of month (1 - 31) 日# | | | .------- month (1 - 12) OR jan,feb,mar,apr ... 月# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR 星期 sun,mon,tue,wed,thu,fri,sat# | | | | |# * * * * * user-name command to be executed分 时 日 月 星期 用户名 运行什么命令例如:晚上9点10分运行echo命令10 21 * * * centos /bin/echo "Howdy!"注意:命令执行的日期可以在下面两个中指定字段——“月日”和“周”。如果两个域都受到限制(例如,不包含“*”字符),命令将在两个字段中运行匹配当前时间。例如,30 4 1,15 * 5 将导致命令在1号和15号凌晨4:30运行每个月,加上每周五。
[root@centos7 ~]#weekday=`date +%w`;[ "$weekday" = "0" -o "$weekday" = "6" ] && echo "0,6" //查看是否为周六日
时间表示法:
(1) 特定值:给定时间点有效取值范围内的值
(2) *:给定时间点上有效取值范围内的所有值 表示“每...”
(3) 离散取值:#,#,#
(4) 连续取值:#-#
(5) 在指定时间范围上,定义步长:/#: #即为步长
seq 1 10| sed -n "1~2p" //取奇数seq 1 10| sed -n "2~2p" //取偶数
@rebootRun once after reboot. //重启之后执行一次@yearly 0 0 1 1 * //一月一号零点零分执行@annually 0 0 1 1 * //一月一号零点零分执行@monthly 0 0 1 * * //每月一号零点零分执行@weekly 0 0 * * 0 //每月周日零点零分执行@daily 0 0 * * * //每天零点零分执行@hourly 0 * * * * //每小时执行* * * * * //每分钟执行示例1:每3小时echo和wall命令0 */3 * * * centos /bin/echo "howdy";/usr/bin/wall "welcome to Magedu!"示例2:每天一点把前天/etc/sysconfig/打包并压缩0 1 * * * root tar -zcvf /app/syscongfig`date +\%F -d "-1 day"`.tar.gz /etc/sysconfig/
系统的计划任务:/etc/crontab
配置文件:/etc/cron.d/ //放到这个目录下方便管理
小时脚本:/etc/cron.hourly/ 中 /usr/bin/on_ac_power >/dev/null//查看是否是电池供$?=1 就是电池供电
每日脚本:/etc/cron.daily/
每周脚本:/etc/cron.weekly/
明天脚本:/etc/cron.monthly/
/etc/cron.daily/tmpwatch定时清除临时文件systemd-tmpfiles-setup服务实现;例:systemctl status systemd-tmpfiles-setup //查看现在是否启动备注源文件中\ 是转译* 不转译会是斜线
crontab命令:crontab[-u user] [-l | -r | -e] [-i]-l: 列出所有任务;-e: 编辑任务;-r: 移除所有任务;-i:同-r一同使用,以交互式模式移除指定任务-u user: 仅root可运行,指定用户管理cron任务控制用户执行计划任务:/etc/cron.{allow,deny}
注意:/var/spool/cron/里面文件谁改所属组所有者就是谁 ;有特殊权限
[root@centos7 ~]#which crontab/usr/bin/crontab[root@centos7 ~]#ll /usr/bin/crontab-rwsr-xr-x. 1 root root 57576 Aug 3 23:33 /usr/bin/crontab
一次性作业使用at
重复性作业使用crontab
Create at time crontab -eList at -l crontab -lDetails at -c jobnum N/ARemove at -d jobnum crontab -rEdit N/A crontab -e
没有被重定向的输出会被邮寄给用户
根用户能够修改其它用户的作业
注意:运行结果的标准输出和错误以邮件通知给相关用户
(1) COMMAND > /dev/null
(2) COMMAND &> /dev/null
对于cron任务来讲,%有特殊用途;如果在命令中要使用%,则需要转义,将%放置于单引号中,则可不用转义
(1) 如何在秒级别运行任务?* * * * * for min in 0 1 2; do echo "hi"; sleep 10;done* * * * * /bin/f1.sh sleep 10 //每秒执行(2) 如何实现每7分钟运行一次任务?sleep命令:sleep NUMBER[SUFFIX]...SUFFIX:s: 秒, 默认m: 分h: 小时d: 天
1、每天的2点和12点整,将/etc备份至/testdir/backup目录中,保存的文件名称格式为“etcbak-yyyy-mm-dd-HH.tar.xz”
0 2,12 * * * root tar -zcvf /testdir/backup/etcbak-`date +\%w -d "-1 day"`.tar.xz /etc/
2、每周2, 4, 7备份/var/log/messages文件至/logs目录中,文件名形如“messages-yyyymmdd”
* * * * 2,4,7,0 root cp /var/log/messages /logs/messages`date +\%`
3、每两小时取出当前系统/proc/meminfo文件中以S或M开头的信息追加至/tmp/meminfo.txt文件中
4、工作日时间,每10分钟执行一次磁盘空间检查,一旦发现任何分区利用率高于80%,就执行wall警报
过程式编程语言:顺序执行 选择执行 循环执行
选择执行:
注意:if语句可嵌套
单分支:
if 判断条件;then条件为真的分支代码fi
双分支:
if 判断条件; then条件为真的分支代码else条件为假的分支代码fi
多分支
if 判断条件1; then条件为真的分支代码elif 判断条件2; then条件为真的分支代码elif 判断条件3; then条件为真的分支代码else以上条件都为假的分支代码fi
逐条件进行判断,第一次遇为“真”条件时,执行其分支,而后结束整个if语句
根据命令的退出状态来执行命令
if ping -c1 -W2 station1 &> /dev/null;then //-c 一次 -W2超时2秒echo'Station1isUP'elif grep "station1" ~/maintenance.txt &> /dev/null then //维护列表 maintenance.txtecho'Station1 is undergoing maintenance'elseecho'Station1 is unexpectedly DOWN!'exit1fi
test 整数1 -eq 整数2 #整数相等test 整数1 -ge 整数2 #整数1大于等于整数2test 整数1 -gt 整数2 #整数1大于整数2test 整数1 -le 整数2 #整数1小于等于整数2test 整数1 -lt 整数2 #整数1小于整数2test 整数1 -ne 整数2 #整数1不等于整数2
read -p "please input your age: " ageif [[ ! "$age" =~ ^[0-9]+$ ]];thenecho "请输入数字"exit 2elif [ "$age" -gt 18 ];thenecho "you are too old"elseecho "you are very young"fi
read -p "Please enter the score (score): " chengjiif [[ ! "$chengji" =~ ^[0-9]+$ ]];thenecho "please enter a number"exit 2elif [ "$chengji" -le 59 ];thenecho " good"elif [ "$chengji" -le 80 ];thenecho "very good"elif [ "$chengji" -le 100 ];thenecho "very very good"elseecho "Input error "fi
case 变量引用 inPAT1)分支1;;PAT2)分支2;;...*)默认分支;;esac
read -p "please input a number(0-9): " numcase "$num" in1|2|3)echo 1,2,3;;4|5|6)echo 4,5,6;;7|8|9)echo 7,8,9;;*)echo other;;esac
1、编写脚本/root/bin/createuser.sh,实现如下功能:使用一个用户名做为参数,如果指定参数的用户存在,就显示其存在,否则添加之;显示添加的用户的id号等信息
2、编写脚本/root/bin/yesorno.sh,提示用户输入yes或no,并判断用户输入的是yes还是no,或是其它信息
read -p "Do you agree? (yes or no): " anscase "$ans" in[Yy]|[Yy][Ee][Ss])echo yes;;[Nn]|[Nn][Oo])echo no;;*)echo other;;esac
3、编写脚本/root/bin/filetype.sh,判断用户输入文件路径,显示其文件类型(普通,目录,链接,其它文件类型)
4、编写脚本/root/bin/checkint.sh,判断用户输入的参数是否为正整数
循环执行将某代码段重复运行多次重复运行多少次:循环次数事先已知循环次数事先未知有进入条件和退出条件for, while, until
for 变量名 in 列表;do循环体done
执行机制:依次将列表中的元素赋值给“变量名”; 每次赋值后即执行一次循环体; 直到列表中的元素耗尽,循环结束
(1) 直接给出列表(2) 整数列表:(a) {start..end}(b) $(seq[start [step]] end)(3) 返回列表的命令$(COMMAND)(4) 使用glob,如:*.sh(5) 变量引用;$@, $*
[root@centos7 ~]# nmap -v -A 47.93.96.95 扫描器;扫描这个ip
yum install play //播放音乐
1、判断/var/目录下所有文件的类型
dir="/var"for i in $(ls -1 $dir) ; dotype=`ls -ld $file |cut -c 1`echo -n "$dir/$i===============>"case $type in-)echo "general file";;d)echo "dir";;l)echo "link";;s)echo "socket";;b)echo "block";;c)echo "character";;*)echo "other";;esacdone
2、添加10个用户user1-user10,密码为8位随机字符
for i in {1..10};dousername=name$iuseradd $usernamepassword=`openssl rand -hex 4`echo $password | passwd --stdin $username &> /app/null.txtecho $username $password >> password.txtdoneecho "finish"
3、/etc/rc.d/rc3.d目录下分别有多个以K开头和以S开头的文件;分别读取每个文件,以K开头的输出为文件加stop,以S开头的输出为文件名加start,如K34filename stop S66filename start
for i in `ls -1 /etc/rc.d/rc3.d` ; dotype=`echo $i | cut -c 1 `#echo typeif [ "$type" == "S" ] ; thenecho "$i start"elif [ "$type" == "K" ] ; thenecho "$i stop"elseecho "$i unkown"fidone
4、编写脚本,提示输入正整数n的值,计算1+2+...+n的总和
sum=0;for i in {1..n};do let sum=sum+$i;done ;echo $sum
5、计算100以内所有能被3整除的整数之和
sum=0;for i in `seq 1 100`;do <----> for i in {1..100};do //都可以yu=$[i%3]if [ "$yu" -ne 0 ];thenlet sum+=ifidoneecho $sum
6、编写脚本,提示请输入网络地址,如192.168.0.0,判断输入的网段中主机在线状态
>ip.logread -p "please input your network(eg:192.168.1.0): " network[[ "$network" =~ ^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$ ]] || { echo -e "\033[31mplease input a leaal IP\033[0m"; exit 1; }net=`echo $network | cut -d. -f1-3`for i in {1..254};do{if ping -c1 -W1 $net.$i &> /dev/null;thenecho $net.$i is up |tee -a ip.logelseecho $net.$i is downfi}&donewait
7、打印九九乘法表
#!/bin/bashfor i in `seq 9`;dofor j in `seq $i`;doecho -e "${j}x${i}=$[i*j]\t\c"doneechodonebash -x 调试跟踪
8、在/testdir目录下创建10个html文件,文件名格式为数字N(从1到10)加随机8个字母,如:1AbCdeFgH.html
cat /dev/urandom | head -n 10 | base64 |tr -d [[:punct:]][[:digit:]]|head -c8 //随机八个字母openssl rand -base64 100 | tr -dc [[:alpha:]] |head -c8 //随机八个字母openssl rand -base64 100 | sed -r 's/[^[:alpha:]]//g'|head -c8 //随机八个字母openssl rand -base64 100 | grep -o [[:alpha:]]|tr -d '\n'|head -c8 //随机八个字母------------------------------------------------------dir=/testdirif [ ! -d $dir ] ; thenmkdir -pv $dir &>/dev/nullfifor i in `seq 1 10` ; dotmp=`openssl rand -base64 100 |tr -dc "[:alpha:]"|head -c 8`touch $dir/$i$tmp.htmldone
9、打印等腰三角形
实例1:
line=5for i in `seq 1 $line` ; dolen=$[2*line+1]for j in `seq 1 $len` ; doif [ $j -le $[line-i] -o $j -ge $[line+i] ] ; thenecho -n " "elseecho -n "*"fidoneechodone*************************
实例2:好理解
#!/bin/bashread -p "请输入行数:" linefor i in `seq $line`;dospace=`echo $[line-i]`for j in `seq $space`;doecho -n " "donefor k in `seq $[i*2-1]`;doecho -n "*"doneechodone
实例3:空心三角形
#!/bin/bashread -p "Please input the triangle side" nfor i in `seq $n`;dofor j in `seq $[n-i]`;doecho -e " \c"doneif [[ "$i" -ne 1 ]]; thenecho -e "*\c"fiif [[ "$i" -ne 1 && "$i" -ne "$n" ]]; then{for k in `seq $[2*(i-1) -1]`doecho -e " \c"done}fiif [[ "$i" -eq "$n" ]]; then{k=0for k in `seq $[2*i-3]`doecho -e "*\c"done}fiecho -e "*"done** ** ** ** ************
10、打印国际象棋
实例:1
line=8line2=$[line*2]for i in `seq 1 8 ` ; dofor j in `seq 1 $line2 ` ; doif [ $[i%2] -eq 1 ] ; thenif [ $[j%4] -eq 1 -o $[j%4] -eq 2 ] ; thenecho -ne "\033[41m \033[0m"elseecho -ne "\033[42m \033[0m"fielseif [ $[j%4] -eq 1 -o $[j%4] -eq 2 ] ; thenecho -ne "\033[42m \033[0m"elseecho -ne "\033[41m \033[0m"fifidoneechodone
实例2:
#!/bin/bashread -p "输入每个方格的大小(2space=1):" weightfor i in `seq 8`;dofor j in `seq $weight`;doif [ "$[i%2]" = 1 ];thencolour1=41colour2=42elsecolour1=42colour2=41fifor k in `seq 4`;dofor n in `seq $weight`;doecho -ne "\033[${colour1}m \033[0m"donefor m in `seq $weight`;doecho -ne "\033[${colour2}m \033[0m"donedoneechodonedone
实例3:完美
color1=`seq 40 47 |sed -n "1~2p"|sort -R|head -1`color2=`seq 40 47 |sed -n "2~2p"|sort -R|head -1`redyel () {if [ "$1" = "-r" ];thenecho -en "\033[${color1}m \033[0m\c"echo -en "\033[${color2}m \033[0m\c"elseecho -en "\033[${color2}m \033[0m\c"echo -en "\033[${color1}m \033[0m\c"fi}for i in `seq 4`;dofor j in `seq 4`;dofor a in `seq 4`;doredyel -rdoneechodonefor k in `seq 4`;dofor b in `seq 4`;doredyeldoneechodonedone