linux 函数和脚本

函数

自定义函数

// 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值