@mrz1
2017-12-23T12:30:49.000000Z
字数 11221
阅读 1054
笔记
磁盘访问量: iotop
iostat
网卡利用率(吞吐量):dstat
(动态观察) ifconfig -s eth0
(动态 watch -n0.5 ifconfig -s eth0
)
同时运行多个进程,提高效率
方法1
vi all.sh
f1.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 tools
Loaded: 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 ago
Main PID: 947 (atd)
CGroup: /system.slice/atd.service //这个服务调用的是/usr/sbin/atd
└─947 /usr/sbin/atd -f
.........
同步服务器时间
ntpdate 127.0.0.1(ip地址)
同步硬件时间clock -w
包:at
at命令: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 17
17:20 tomorrow
HH:MM[am|pm] + number [minutes|hours|days|weeks]
在某个时间点再加几个时间后才进行该项任务
now + 5 minutes
02pm + 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/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=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 cron
tab
/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 -e
List at -l crontab -l
Details at -c jobnum N/A
Remove at -d jobnum crontab -r
Edit 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.txt
echo'Station1 is undergoing maintenance'
else
echo'Station1 is unexpectedly DOWN!'
exit1
fi
test 整数1 -eq 整数2 #整数相等
test 整数1 -ge 整数2 #整数1大于等于整数2
test 整数1 -gt 整数2 #整数1大于整数2
test 整数1 -le 整数2 #整数1小于等于整数2
test 整数1 -lt 整数2 #整数1小于整数2
test 整数1 -ne 整数2 #整数1不等于整数2
read -p "please input your age: " age
if [[ ! "$age" =~ ^[0-9]+$ ]];then
echo "请输入数字"
exit 2
elif [ "$age" -gt 18 ];then
echo "you are too old"
else
echo "you are very young"
fi
read -p "Please enter the score (score): " chengji
if [[ ! "$chengji" =~ ^[0-9]+$ ]];then
echo "please enter a number"
exit 2
elif [ "$chengji" -le 59 ];then
echo " good"
elif [ "$chengji" -le 80 ];then
echo "very good"
elif [ "$chengji" -le 100 ];then
echo "very very good"
else
echo "Input error "
fi
case 变量引用 in
PAT1)
分支1
;;
PAT2)
分支2
;;
...
*)
默认分支
;;
esac
read -p "please input a number(0-9): " num
case "$num" in
1|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): " ans
case "$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) ; do
type=`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"
;;
esac
done
2、添加10个用户user1-user10,密码为8位随机字符
for i in {1..10};do
username=name$i
useradd $username
password=`openssl rand -hex 4`
echo $password | passwd --stdin $username &> /app/null.txt
echo $username $password >> password.txt
done
echo "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` ; do
type=`echo $i | cut -c 1 `
#echo type
if [ "$type" == "S" ] ; then
echo "$i start"
elif [ "$type" == "K" ] ; then
echo "$i stop"
else
echo "$i unkown"
fi
done
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 ];then
let sum+=i
fi
done
echo $sum
6、编写脚本,提示请输入网络地址,如192.168.0.0,判断输入的网段中主机在线状态
>ip.log
read -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;then
echo $net.$i is up |tee -a ip.log
else
echo $net.$i is down
fi
}&
done
wait
7、打印九九乘法表
#!/bin/bash
for i in `seq 9`;do
for j in `seq $i`;do
echo -e "${j}x${i}=$[i*j]\t\c"
done
echo
done
bash -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=/testdir
if [ ! -d $dir ] ; then
mkdir -pv $dir &>/dev/null
fi
for i in `seq 1 10` ; do
tmp=`openssl rand -base64 100 |tr -dc "[:alpha:]"|head -c 8`
touch $dir/$i$tmp.html
done
9、打印等腰三角形
实例1:
line=5
for i in `seq 1 $line` ; do
len=$[2*line+1]
for j in `seq 1 $len` ; do
if [ $j -le $[line-i] -o $j -ge $[line+i] ] ; then
echo -n " "
else
echo -n "*"
fi
done
echo
done
*
***
*****
*******
*********
实例2:好理解
#!/bin/bash
read -p "请输入行数:" line
for i in `seq $line`;do
space=`echo $[line-i]`
for j in `seq $space`;do
echo -n " "
done
for k in `seq $[i*2-1]`;do
echo -n "*"
done
echo
done
实例3:空心三角形
#!/bin/bash
read -p "Please input the triangle side" n
for i in `seq $n`;do
for j in `seq $[n-i]`;do
echo -e " \c"
done
if [[ "$i" -ne 1 ]]; then
echo -e "*\c"
fi
if [[ "$i" -ne 1 && "$i" -ne "$n" ]]; then
{
for k in `seq $[2*(i-1) -1]`
do
echo -e " \c"
done
}
fi
if [[ "$i" -eq "$n" ]]; then
{
k=0
for k in `seq $[2*i-3]`
do
echo -e "*\c"
done
}
fi
echo -e "*"
done
*
* *
* *
* *
* *
***********
10、打印国际象棋
实例:1
line=8
line2=$[line*2]
for i in `seq 1 8 ` ; do
for j in `seq 1 $line2 ` ; do
if [ $[i%2] -eq 1 ] ; then
if [ $[j%4] -eq 1 -o $[j%4] -eq 2 ] ; then
echo -ne "\033[41m \033[0m"
else
echo -ne "\033[42m \033[0m"
fi
else
if [ $[j%4] -eq 1 -o $[j%4] -eq 2 ] ; then
echo -ne "\033[42m \033[0m"
else
echo -ne "\033[41m \033[0m"
fi
fi
done
echo
done
实例2:
#!/bin/bash
read -p "输入每个方格的大小(2space=1):" weight
for i in `seq 8`;do
for j in `seq $weight`;do
if [ "$[i%2]" = 1 ];then
colour1=41
colour2=42
else
colour1=42
colour2=41
fi
for k in `seq 4`;do
for n in `seq $weight`;do
echo -ne "\033[${colour1}m \033[0m"
done
for m in `seq $weight`;do
echo -ne "\033[${colour2}m \033[0m"
done
done
echo
done
done
实例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" ];then
echo -en "\033[${color1}m \033[0m\c"
echo -en "\033[${color2}m \033[0m\c"
else
echo -en "\033[${color2}m \033[0m\c"
echo -en "\033[${color1}m \033[0m\c"
fi
}
for i in `seq 4`;do
for j in `seq 4`;do
for a in `seq 4`;do
redyel -r
done
echo
done
for k in `seq 4`;do
for b in `seq 4`;do
redyel
done
echo
done
done