函数
自定义函数
// function 可以省略 ; fname 为函数的名称
function fname(){
命令
}
函数的执行 :fname
定义一个名为 12.sh 的函数脚本
#!/bin/bash
# function
# local 定义的对象只能在函数类起作用(局部变量)
checkid(){
local t
for t in $*
do
[ -d "/proc/$t" ] && return 0
done
return 1
}
执行上面的sh函数脚本
## 赋予当前用户 12.sh的执行权限
$ chmod u+x 12.sh
## 定义12.sh在当前进程下运行 (或者使用 ./12.sh )
$ source 12.sh
## 运行checkid 函数 判断线程 1 是否存在
$ checkid 1
$ echo $?
# 结果:0
系统脚本
系统自建了函数库,可以在脚本中引用 位置在:/etc/init.d/functions
自建函数库:使用source函数脚本文件“导入”函数
脚本控制
脚本优先级控制
可以使用nice和renice 调整脚本优先级
避免出现“不可控的”死循环
死循环导致cpu占用过高
死循环导致死机
Linux ulimit命令用于控制shell程序的资源。
ulimit为shell内建指令,可用来控制shell执行程序的资源。
fork炸弹(大量创建子进程): .(){.I.&};. 或者 func() { func | func& };func
其中 func 是一个函数名称(随意起的)
## 设置单一用户程序上限
$ ulimit -u 500
## 显示系统资源的设置
$ ulimit -a
捕获信号
kill默认会发送15号信号给应用程序
ctrl+c发送2号信号给应用程序
9号信号不可阻塞
创建 1.sh :
#!/bin/bash
# single demo
trap " echo sig 15 " 15
trap " echo sig 2 " 2
echo $$
while :
do
:
done
##
$ sh 1.sh
## ctrl + c (在此不能结束 脚本的执行 ,因为1.sh中捕获了 2 号命令)
# 结果:
# 32563 运行的进程号(pid)
# sig 15 (kill -15 32563 结果)
# sig 2 (ctrl + c 结果)
# Killed (kill -9 32563 结果)
$ kill -15 32563
$ kill -9 32563
计划任务
一次性计划任务at
参考:LINUX之一次性(at)计划任务及周期性(crontab)计划任务
在指定的日期、时间点自动的执行预先设置的一些命令操作,属于一次性计划任务
系统服务的名称:/etc/init.d/atd
设置格式:at [HH:MM] [yyyy-mm-dd]
atq命令:查询当前设置的at任务列表 同 at -l
atrm命令:删除指定任务编号的at任务 atrm 编号 同 at -d
at -c 任务号 查看计划任务的具体内容(和at计划任务文件/var/spool/at/以a开头的文件内容相同)
at 命令常用格式:
at [HH:MM]
at [HH:MM] [yyyy-mm-dd]
at now +数字 [minutes|hours|days|weeks]
at 时间 -f 文件 使用文件中的命令作为计划任务
at now +5 minutes -f /root/test.sh
## 创建计划任务
[root@rhel3 ~]# at 02:35
at> ls /tmp
at> <EOT>
job 4 at 2019-03-29 02:35
## 查看计划任务
[root@rhel3 ~]# at -l
4 2019-03-29 02:35 a root
周期性计划任务
按照预先设置的时间周期(分钟、小时、天…)重复执行用户执行的命令操作,这属于周期计划人任务
服务名称:/etc/init.d/crond
主要设置文件:用户定义的设置,位于文件/etc/spool/cron/用户名
cron服务配置文件:/etc/crontab(包含三部分:注释、环境变量、cron命令)
注意:crond计划任务里的命令有时可能不被执行,因为cron的环境变量PATH 跟系统的PATH 不太一样,它的PATH 路径默认值为:PATH=/sbin:/bin:/usr/sbin:/usr/bin,所以这就造成很多命令不能使用,解决办法:1、自己设置cron的PATH环境变量 2、用命令的绝对路径,如ls我们可以使用: /bin/ls
cron服务日志文件:/var/log/cron
管理cron计划任务:
编辑计划任务:crontab -e [-u 用户名]
查看计划任务:crontab -l [-u 用户名]
删除计划任务:crontab -r [-u 用户名 ]
##
$ crontab -e
$ * * * * * /usr/bin/date >> /tmp/date.txt
## cron的执行日志在 /var/log 目录下 ,文件为cron
$ cd /var/log | tail -n 100 cron
脚本加锁 flock
参考:linux文件锁flock
anacontab延时计划任务
flock 锁文件
用linux flock 文件锁实现任务锁定,解决冲突
-s, --shared: 获得一个共享锁
-x, --exclusive: 获得一个独占锁
-u, --unlock: 移除一个锁,通常是不需要的,脚本执行完会自动丢弃锁
-n, --nonblock: 如果没有立即获得锁,直接失败而不是等待
-w, --timeout: 如果没有立即获得锁,等待指定时间
-o, --close: 在运行命令前关闭文件的描述符号。用于如果命令产生子进程时会不受锁的管控
-c, --command: 在shell中运行一个单独的命令
-h, --help 显示帮助
-V, --version: 显示版本
正则表达式与文本搜索
元字符
扩展元字符
文件的查找命令find
文本内容的过滤(查找)grep
字符串 Do one thing at a time,and do well.
匹配字符 an
元字符:
. 匹配除换行符外的任意单个字符
- 匹配任意一个跟在它前面的字符
[] 匹配方括号中的字符类中的任意一个
^ 匹配开头
$ 匹配结尾
\ 转义后面的特殊字符
##
$ grep password /root/anaconda-ks.cfg
## .... 表示4个任意字符
$ grep pass.... /root/anaconda-ks.cfg
## pass.... 长度为7,以pass开头后面4个结束
$ grep pass....$ /root/anaconda-ks.cfg
## pass开头的任意字符。。。
$ grep pass.* /root/anaconda-ks.cfg
$ grep [pP]ass.* /root/anaconda-ks.cfg
$ grep ^# /root/anaconda-ks.cfg
## 匹配 . 号
$ grep "/." /root/anaconda-ks.cfg
扩展元字符:
+匹配前面的正则表达式至少出现一次
?匹配前面的正则表达式出现零次或一次
|匹配它前面或后面的正则表达式
$ find /etc -name pass*
$ find /etc -regex .*wd