自定义函数
- 自定义函数
- 系统脚本
自定义函数
// 自定义函数
function fname() {
命令
}
// 函数的执行
fname
// 函数作用范围的变量
local 变量名
// 函数的参数
$1 $2 $3 ... $n
#!/bin/bash
function cdls() {
cd /var
ls
}
cdls
// 带参数
function cdls() {
cd $1
ls
}
cdls /tmp
// 只在函数内部生效的变量,可以使用local关键字
// checkpid 检查进程是否存活,存活的话会有proc/pid文件夹子存在
checkpid() { // function 可以省略
local i
for i in $* ; do // i是经常使用的变量,可能会被别人给替代掉,我们可以声明本地的变量local
[ -d "/proc/$i" ] && return 0 // 相当于if () return
done
return 1
}
source 14.sh // 要使用source执行,不能使用bash;如果使用bash,会进入子进程,不会显示父进程的状态
vim 14.sh
chomd u+x 14.sh
source 14.sh
checkpid 1
echo $?
checkpid 1 2
echo $?
checkpid 65533
echo $?
系统脚本
- 系统自建了函数库,可以在脚本中引用,位置在
/etc/init.d/functions
- 导入函数库,使用source函数脚本文件"导入"函数
vim /etc/init.d/functions
source /etc/init.d/functions // 导入函数库
echo_success
脚本控制
- 脚本优先级控制
- 捕获信号
脚本优先级控制
脚本优先级:脚本占用资源多少的分配。主要是对cpu,内存等资源的分配。对于cpu,可以使用nice,renice调整脚本优先级;
对于内存,一般会使用ctrlgroup来实现。
- 可以使用nice和renice调整脚本优先级
- 避免出现“不可控的”死循环
- 死循环导致cpu占用过高
- 死循环导致死机
: | :& // 进程炸弹,创建两个进程
su - user1
func() { func | func& } // fork炸弹,导致程序大量创建子进程,导致CPU不响应任何按键信息
func
.() {.|.& } ; . //fork炸弹
捕获信号
捕获信号脚本的编写
- kill 默认会发送15号信号给应用程序 (可以把15号命令捕获下来,捕获后执行相应的命令)
- ctrl + c 发送2号信号给应用程序
- 9号信号不可阻塞 (-9)
捕获信号的作用:比如脚本在对关键数据备份,备份的时候我们不希望它被ctrl+c
或者默认发送的q
信号中断,这样会导致备份是不完整的。
#!/bin/bash
# signal demo
# trap用来捕获信号
trap "echo sig 15" 15
# 显示当前进程号
echo $$
# 为了让捕获后程序不会马上结束,或者还没来的及捕获的时候,程序已经运行完了,我们加入一个死循环
# 判断是空指令,做的事情也是空指令 (不要在工作机上使用)
while :
do
:
done
vim 15.sh
chomd u+x 15.sh
# 捕获程序开始运行
[root@c7 ~] ./15.sh
10742
sig15 // 捕获到了15
# 新开一个窗口
kill -15 10742
# 可以用-9结束,-9是不可阻塞的
kill -9 10742