• Shell 是命令解释器,用于解释用户对操作系统的操作
• Shell 有很多
B shell;C shell;k shell;z shell
• cat /etc/shells
• CentOS 7 默认使用的 Shell 是 bash
Shell脚本
● 基本组成元素:命令
● 一条命令只做一件事情
demo:cd /var ; ls ; pwd ; du –sh * ; du –sh
● bash脚本文件.sh
● 脚本文件需要执行权限 x
● bash a.sh
● #!/bin/bash
Shell脚本组成
● #!/bin/bash
● 一系列命令
● 注释 #
● chmod u+x a.sh 给予用户执行权限
● 执行脚本命令
● bash ./a.sh
● ./a.sh
● source ./a.sh
● . a.sh
Demo: 2.sh cd /tmp ; pwd
内建命令和外部命令的区别
• 内建命令不需要创建子进程
• 内建命令对当前 Shell 生效
• type
管道和重定向
管道
重定向
• 管道与管道符 |
• 子进程与子shell
• 重定向符号
管道和管道符
• 管道和信号一样,也是进程通信的方式之一
• 匿名管道(管道符)是 Shell 编程经常用到的通信工具
• 管道符是“|”,将前一个命令执行的结果传递给后面的命令
• ls –l | more
• cat | ps -ef
• 分号和管道符 连接命令
子进程与子 Shell
• 子进程是 Shell 程序,称作子 Shell
重定向
• 一个进程默认会打开标准输入、标准输出、错误输出三个文件描述符(数字表示的文件)
***打开一个进程所有的配置文件都会再proc这个文件下
0代表标准输入 当前终端,1代表标准输出 当前终端,2代表错误输出 当前终端
pts代表这当前终端,当前屏幕
• 输入重定向符号 “<”
read var < /path/file
• 输出重定向符号 “>” “>>” “2>” “&>””2>>” “&>>”
2> 错误重定向 &> 正确和错误的都进行重定向
echo 123 > /path/file
demo: wc –l 等待输入的行数 ctrl+d结束
wc –l < file
echo 123
echo的输出是正确输出也就是标准输出,默认输出到1号文件描述符里,1号文件描述符默认指向
当前终端/当前屏幕
所以 echo 123 在屏幕上显示出来 123
echo 123 > 1.txt 相当于 echo 123 1> 1.txt
将1号文件描述符进行了重定向,指向了1.txt 所以输出的结果不显示在屏幕上了
而是,覆盖写入到1.txt文件里了。
echo 123 2> 2.txt
echo的输出是正确输出也就是标准输出,是输出到1号文件描述符里的,1号文件描述符默认指向
当前屏幕/当前终端,
此时,将2号文件描述符进行了重定向,所以不影响1号文件描述符的指向。
• << 分界符 读入数据,直到遇到分界符停止
cat > /path/file << EOF
…
EOF
变量
• 变量的定义
• 变量的赋值
• 变量的引用
• 变量的作用范围
• 系统环境变量
• 环境变量配置文件
变量的定义
• 变量名的命名规则
• 字母、数字、下划线
• 不以数字开头
• 有意义的单词
变量的赋值 赋值不能支持运算 赋值前后不能加空格
• 为变量赋值的过程,称为变量替换
• 变量名=变量值
• a=123
• 使用 let 能对变量进行运算四则运算支持 不要使用shell 去计算浮点型
• let a=10+20
• 将命令赋给变量
• l=ls
• 将命令的结果赋给变量,$()或者``
• a=$(ls /ect)
• a=`ls /etc`
• 变量值有空格等特殊字符要包含在””或’’中
• string1=hello abc --- 错误 空格天然的分隔符
string1="hello abc"---正确
变量的引用
对于将命令赋给一个变量,复杂的命令会有问题
解决方式就是 将命令的结果赋给变量
• ${变量名} 称作对变量的引用
• echo ${变量名} 查看变量的值
• ${变量名} 与 $变量名 差不多一样
当时想要再加东西的话${a}daxue 可以成立 没有{}就不行了
变量的作用范围
• 变量的默认作用范围
• 当前shell生效;子shell、平行shell或者shell的父进程都不生效
• demo:a=1
bash
• demo: var1=“hello abc”
四种执行脚本方式查看var1
• 变量的导出
• export --- 子shell可以使用父shell的变量
将变量变成全局的了
• 变量的删除
• unset
系统环境变量
• 环境变量:每个 Shell 打开都可以获得到的变量
• set 和 env 命令
• $PATH
命令搜索路径
• $? 脚本或者命令的返回结果 结果如果是0,说明执行成功。结 果如果是非0,说明执行出错。
在shell脚本中: 0表示真,非0表示假
• $$ 运行脚本的PID 进程id
$0 运行脚本的名称
demo: 运行脚本
• $PS1
• 位置变量
• $1 脚本的第一个入参
$2…$n 脚本的第二个到第n个入参
demo: pos2=${2-_} 2选一 如果有数则输出,如果没有的话输出_
环境变量配置文件
• 配置文件
• /etc/profile
• /etc/bashrc
上面两个是共性 大家所拥有的共同的属性
• /etc/profile.d/
• ~/.bashrc 加个. 代表隐藏文件
上面两个叫做个性 大家有一些与其他人不一样的个性 往自己家目录里面弄
• ~/.bash_profile
一:
• 对于/etc下的配置文件,所有用户都通用
• 对于家目录下的配置文件,是区分用户的,用户所特有的配置
家目录,对于不同的用户而言 是不一样的
~: 对于root用户,~就是/root
对于普通用户,~就是/home/用户名
su -c2
/etc是大家的共性,大家都能加载
~下的配置文件是个性,每个用户单独加载自己的
所以切换到c2用户,加载的家目录下的配置文件是c2用户的家目录下的
二:
• login shell:命令就是,su – 用户名
所有的配置文件都会被执行
• nologin shell:命令就是,su 用户名
~/.bashrc和/etc/bashrc被执行,配置文件加载不完全
Demo:配置文件的加载
• 添加的环境变量,不会立即生效
• 如何立即生效
source /et?c/bashrc
数组
• 定义数组
• hosts=( storage-1 storage-2 storage-3 )
• 显示所有元素
• echo ${hosts[@]}
• 显示数组元素个数
• echo ${#hosts[@]}
• 显示数组的第一个元素
• echo ${hosts[0]}
转义与引用
• 特殊字符
• 转义
• 引用
转义与引用 – 特殊字符
• 特殊字符:
• # 注释
• ; 分号
• \ 转义符号
• “和’ 引号
转义与引用 – 转义符号
• 单个字符前的转义符号
• \n \r \t 单个字母的转义
echo -e "123\r456"
\r 回车
• \$ \” \\ 单个非字母的转义 --- 转义成普通符号
• demo: $a abc”x”def
转义与引用 – 引用
• 常用的引用符号
• “ 双引号 部分引用
• ‘ 单引号 完全引用
• ` 反引号 获取命令行的结果 $()
Demo: “$var1” ‘$var1’
运算符
• 赋值运算符
• 算数运算符
• 数字常量
• 双圆括号
赋值运算符
• = 赋值运算符,用于算数赋值和字符串赋值
• 使用 unset 取消为变量的赋值
• = 除了作为赋值运算符还可以作为测试操作符
算数运算符
• 使用 expr 进行运算
• expr 3 + 4 必须加空格
expr不支持浮点数
• 基本运算符
• + - * / ** %
注意: 对于*需要转义 \*
数字常量
• 数字常量的使用方法
• let “变量名 = 变量值” 不需要加空格
• 变量值使用 0 开头为八进制
• 变量值使用 0x 开头为十六进制
双圆括号
• 双圆括号是 let 命令的简化
• (( a = 10 ))
• (( a++ ))
• echo $((10+20))
Demo: expr
(( a=4+5 ))
(( a++ ))
(( a-- ))
测试与判断
• 退出与退出状态
• 测试命令 test
• 使用 if-then 语句
• 使用 if-then-else 语句
• 嵌套 if 的使用
退出与退出状态
• 退出程序命令
• exit --- shell脚本的退出命令,返回其上方命令的运行结果编码
• exit 10 返回10给 Shell,返回值非 0 位不正常退出
• $? 判断当前 Shell 下前一个进程是否正常退出
Demo: 脚本 exit
测试命令 test
• test 命令用于检查文件或者比较直
• test 可以做以下测试:
• 文件测试
• 整数比较测试
• 字符串测试
• test测试语句可以简化为 [ ] 符号
• [ ] 符号还有扩展写法 [[ ]] 支持 && || < >
• demo:man test
• 字符串测试:
• STRING1 = STRING2
• STRING1 != STRING2
• -z STRING
• demo:man test
• 整数比较测试:
• INTEGER1 -eq INTEGER2 相等
• INTEGER1 -ge INTEGER2 大于等于
• INTEGER1 -gt INTEGER2 大于
• INTEGER1 -le INTEGER2 小于等于
• INTEGER1 -lt INTEGER2 小于
• INTEGER1 -ne INTEGER2 不等于
注意 [] 单方括号进行比较的时候,不能使用 < >
• demo:man test
• 文件测试:
• -e FILE
• -d FILE 目录
• -f FILE
Demo 举例:
使用 if-then语句
• test 测试语句可以简化为 [ ] 符号
• if-then 语句的基本用法
if [ 测试条件成立 ] 或命令返回值为0
then 执⾏行行相应命令
fi 结束
Demo:1 判断用户 [ $UID = 0 ] [ $USER = root ]
2 if 后跟命令 pwd 以及 abc
使用 if-then-else 语句
• if-then-else 语句可以在条件不成立时也运行相应的命令
if [ 测试条件成立 ]
then 执行相应命令
else 测试条件不成立,执行相应命令
fi 结束
Demo:
if [ $USER = root ] ;
then
echo “root user”
else
echo “other user”
fi
使用 if-elif-else 语句
• if-then-else 语句可以在条件不成立时也运行相应的命令
if [ 测试条件成立 ]
then 执行相应命令
elif [ 测试条件成立 ]
then 执行相应命令
else 测试条件不成立,执行相应命令
fi 结束
Demo: root user1 other
If的嵌套
• if 条件测试中可以再嵌套 if 条件测试
if [ 测试条件成立 ]
then 执行相应命令
if [ 测试条件成立 ]
then 执行相应命令
fi
fi 结束
Demo:root用户+脚本存在,执行
case 分支
• case语句
case “$变量” in
模式1)
cmd…
;;
模式2)
cmd…
;;
* )
cmd…
;;
esac
case 分支
Demo:.sh start/stop/restart/reload
循环
• 使用 for 循环遍历命令的执行结果
• 使用 for 循环遍历变量和文件的内容
• C 语言风格的 for 命令
• while 循环
• 死循环
• until 循环
• break 和 continue 语句
• 使用循环对命令行参数的处理
使用 for 循环遍历命令的执行结果
• for 循环的语法
for 参数 in 列列表
do
执行的命令
done 结束
• 使用反引号或 $() 方式执行命令,命令的结果当作列表进行处理
使用 for 循环遍历变量和文本
• 列表中包含多个变量,变量用空格分隔
• 对文本处理,要使用文本查看命令取出文本内容
• 默认逐行处理,如果文本出现空格会当做多行处理
Demo:
# 回显
for i in {1..9}
# 修改文件名字
for file in `ls *.cpp`
扩展:basename a.cpp .cpp
C 语言风格的 for 命令
for((变量量初始化;循环判断条件;变量量变化))
do
循环执⾏行行的命令
done
Demo:
# 回显数值
for (( i=1 ; i<=10 ; i++ ))
while 循环
while test测试是否成立
do
命令
done
死循环
while test测试⼀一直成立
do
命令
done
until 循环
• until 循环与 while 循环相反,循环测试为假时,执行循环,为真时循环停止
Demo:
# while [ $a -lt 10 ] ; do done
# 死循环
while :
# util 条件为假 执行
util [ 5 –lt 4 ];
do
echo always
done
循环的使用
• 循环和循环可以嵌套
• 循环中可以嵌套判断,反过来也可以实现嵌套
• 循环可以使用 break 和 continue 语句在循环中退出
break是直接停止循环 continue是停止关于符合条件的此次循环
Demo:
# 循环嵌套if的demo /etc/profile.d/*.sh
# 九九乘法表
循环的使用
break 循环直接结束
continue 结束本次循环,进入到下一次循环
Deno:# 打印数字,break和continue 结束循环和结束本次循环
使用循环处理命令行参数
• 命令行参数可以使用 $1 $2 … ${10}… $n 进行读取
• $0 代表脚本名称
• $* 和 $@ 代表所有位置参数
• $# 代表位置参数的数量
Demo:根据入参名称不同,执行不同的结果
for pos in $*
do
do something
done
或者
while [ $# -ge 1 ]
do
do something
shift
done
函数 内聚 单一 简洁
• 自定义函数
• 系统脚本
自定义函数
• 函数用于“包含”重复使用的命令集合
• 自定义函数
function fname() {
命令
}
• 函数的执行
• fname
Demo: #编写脚本 实现 cd 和 du –sh 的函数
自定义函数
• 函数作用范围的变量
• local 变量名
• 函数的参数
• $1 $2 $3 … $n
Demo:1 输入目录名参数,实现 du –sh
2 checkpid是否存活,一个pid和多个pid输入
系统脚本
• 系统自建了函数库,可以在脚本中引用
• /etc/init.d/functions
• 自建函数库
• 使用 source 函数脚本文件“导入”函数
Demo: echo_success
注意:执行前,先source/etc/init.d/functions
脚本控制
• 脚本所占资源的控制
• 避免出现“不可控的”死循环
• 死循环导致cpu占用过高
• 死循环导致死机
Demo:经典的fork炸弹 千万别使用
function func() { func | func & }
可简写为
.() { .|.& };.
捕获信号
• 捕获信号脚本的编写
• kill默认会发送15号信号给应用程序
• ctrl+c发送2号信号给应用程序
• kill -9 9号信号不可堵塞
Demo:trap “echo signal 15” 15
脚本
计划任务
• 一次性计划任务 at
Demo: # at 时间
ctrl+d提交
atq 查询
atrm 任务号
at -c 任务号 #查看任务具体内容
注意:
1 如果提示at找不到,请进行安装 yum install at
2 如果提交任务:遇到 Can't open /var/run/atd.pid to signal atd. No atd running?
说明没有启动atd任务,请启动:systemctl start atd
一次性计划任务
at 时间格式
at 指定时间的方法很丰富:
hh:mm 小时:分钟(当天,如果时间已过,则在第二天执行);
midnight(深夜),noon(中午),teatime(下午茶时间,下午4点),today,tomorrow等;
12小时计时制,时间后加am(上午)或pm(下午);
指定具体执行日期:mm/dd/yy(月/日/年)或dd.mm.yy(日.月.年);
相对计时法:now + n units,now是现在时刻,n为数字,units是单位(minutes、hours、days、weeks)
# 第四章 crontab应用
周期性计划任务 可以执行很多次
• cron
• 配置方式
• crontab -e edit 编辑 实际上就是一个vi编辑器
• 查看现有的计划任务
• crontab –l
• 配置格式:(面试概率80%)
前面的五个*:分钟 小时 日期 月份 星期
• 分钟 小时 日期 月份 星期 执行的命令
• 注意命令的路径问题
从at开始,所有的执行结果不要打屏幕 而是重定向到文件中
配置格式要求:
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
Demo: * * * * * date >> /tmp/date.txt
* * * * *的意思是 每隔一分钟调度一次后面的命令
最小的调度周期是一分钟
日期和周几最好不要同时限制
时间格式:
星号(*):代表所有可能的值,如month字段为星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。
逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”
中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”
正斜线(/):可以用正斜线指定时间的间隔频率,例如“*/2 * * * *”表示每两分钟执行一次。 正斜线之前必须加*
举例解释:
* * * 1 * 一月份的每天每隔一分钟执行一次
* * 1 * * 每个月的一号每隔一分钟执行一次
* 10 1 1 * 一月一号的十点之内每隔一分钟执行一次
* * * * 1 每周一每隔一分钟执行一次
* 12 * * 5 每周五的十二点之内每一分钟执行一次
30 9 * * * 每天九点半执行一次
* * * * 1,5 每周一,周五每分钟执行一次
* * * * 1-5 每周一到周五每分钟执行一次
* * 20 10 1-5 十月二十日 是周五的话 每分钟执行一次
30 9 1,2,10 10 * 十月的一号,二号,十号的九点三十执行一次
30 9 10-13 10 * 十月的十号到十三号的九点三十执行一次
*/5 10 * * * 每天的十点每隔五分钟执行一次
工作常用:
50 1 * * * 含义:每天的1:50
*/5 * * * * 含义:每隔5分钟
0 */2 * * * 含义:每隔2小时 小时前面的数字必须写明确 不能写*
30 1 * * 1 含义:每个星期一的1:30
删除日志文件:30 1 * * * find /var/log/hadoop-hdfs -type f -mtime +7 -iname "*.log" -exec rm -rf {} \;
每天一点半删除七天前的日志文件 即保证服务器上只有最近七天之内的日志文件
每天执行一次 执行完就退出
文件保存位置:
/var/spool/cron
flock锁文件(排他锁)
应用场景: 备份脚本
锁:用于多线程
作用: 保证只有一个实例在运行 程序调度时,只有一个实例被调度
使用参数:
-x exclusive 排他锁,只能运行一次
-n nonblock 如果锁不能被立即获取,直接失败而不是一直等待 block 阻碍,阻塞
-c command 执行命令
Demo:# sleep 脚本
# flock –xn “/tmp/lock.lock” -c “/home/zzx/shell/a.sh” 必须用flock的方式执行脚本
如果定时文件出了问题,一直执行到第二天 那么加上排他锁之后 之后前一天的任务完成后才会继续执行
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
# 第五章 nohup、&与exec
• 守护进程
• nohup --- no hang up 不挂断的运行
• 使用nohup运行程序 使用方法:nohup 文件名
• 结果默认会输出到nohup.out(自动生成的文件)
• 关闭session发送SIGHUP信号,程序免疫 也就是关闭会话之后,进程还在继续运行,进程的运行并没有停止,程序的运行与界面无关
• 使用Ctrl + C发送SIGINT信号,程序关闭 利用ctrl+c 可以终止进程的运行,杀死进程
• & --- 后台运行
• 使用&后台运行程序 使用方法:./文件名 &
• 结果会输出到终端
• 使用Ctrl + C发送SIGINT信号,程序免疫 ctrl+c 是用来关前台的
• 关闭session发送SIGHUP信号,程序关闭 即 终止程序运行的方法是:关闭会话
Demo:# 死循环,输出hello world;分别运行查看结果
• nohup 和 & 组合使用
• 使用格式
nohup 执行命令或者运行脚本 > test.log 2>&1 &
> 本来是覆盖重定向 但是 >& 不会覆盖
这句话的功能是将错误输出重定向到正确输出中,然后在重定向到test.log中 也就是最后test.log 中既有正确输出,也有错误输出
组合使用时,ctrl+c 和 关闭会话 都不能结束进程 只能kill -9 来杀死进程
Demo:# 组合使用
• exec 命令不产生新的子进程。
系统调用exec是以新的进程去代替原来的进程,但进程的PID保持不变。少了一级进程
Demo:# cat 与 exec cat
# 脚本调用脚本
texec1调用texec2:
用./执行脚本时: 调用进程是被调用进程的父进程 也就是:-bash texec1 texec2
用exec执行脚本时: 调用进程被被调用进程取代,少了一级进程 -bash texec2
最里层的进程取代其他的所有进程
关闭当前终端可以继续执行的是:
使用 nohup 运行该程序
使用 supervisor 运行该程序
在 screen 下运行该程序
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
# 第六章 初始化操作与快捷方式
• 初始化操作 类似于windows下的开机自启动
• 系统启动之后需要执行的操作
• /etc/rc.d/rc.local 中添加 服务的启动命令 不能打到屏幕上 所有的东西都写绝对路径
验证绝对路径是否有错的方法:绝对路径 cat
• chmod +x /etc/rc.d/rc.local 添加执行权限 a+x 给所有的用户添加执行权限
以上两步缺一不可
• 添加静态路由 或者 重启之后的启动服务
• demo:# 执行一个脚本,输出内容。
• 快捷执行命令
查看命令的安装位置:which 命令
• 命令的搜索路径 --- echo $PATH
• 方式一 修改path路径 不推荐 export PATH=$PATH:/home/zzx/shell/eight_class/
PATH=$PATH:
• 方式二 创建软连接 ln -s /path/to/cli.sh /usr/bin/cli 推荐 建议放在/usr/bin/下
• 方式三 别名 ~/.bashrc alias cli=‘/path/to/cli’ 推荐 四大配置文件在哪个里面改都可以
改完配置文件 source一下才能生效
timezone:时区
• demo: #演示
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
# 第七章 supervisor应用
supervisor 监控程序
• 安装
• 官网 http://supervisord.org/ org:orgnization
• 进程管理工具 --- 启动/停止/重启/自动重启(自动拉起)
进程意外退出,可以自动重启
oom:内存溢出 出现这种情况,操作系统会自动去杀程序 通常杀的是内存占得较大的
• 应用场景 --- 极为广泛
• 监控应用程序,崩溃后立刻拉起
• 典型的C/S模型的程序
• supervisord 是server端(后台),supervisorctl 是client端(前端) daemon control
安装 配置 改配置 启动
打开配置文件: vi /etc/supervisord.conf
; 是注释
• supervisor 相关服务配置
[unix_http_server]
file=/etc/supervisor.sock ; (the path to the socket file)
;chmod=0700 ; socket file mode (default 0700)
;chown=nobody:nogroup ; socket file uid:gid owner
;username=user ; (default is no username (open server))
;password=123 ; (default is no password (open server))
前面的分号表示注释;以上是unix服务配置,可全部默认,也建议默认。
[inet_http_server] ; inet (TCP) server disabled by default
port=*:9001 ; (ip_address:port specifier, *:port for all iface)
username=user ; (default is no username (open server))
password=123 ; (default is no password (open server))
以上是web控制界面服务的配置,可根据需要配置用户名和密码
• supervisor 相关服务配置
[supervisord]
logfile=/tmp/supervisord.log ; (main log file;default $CWD/supervisord.log)
logfile_maxbytes=50MB ; (max main logfile bytes b4 rotation;default 50MB)
logfile_backups=10 ; (num of main logfile rotation backups;default 10)
loglevel=info ; (log level;default info; others: debug,warn,trace)
pidfile=/etc/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
nodaemon=false ; (start in foreground if true;default false)
minfds=1024 ; (min. avail startup file descriptors;default 1024)
minprocs=200 ; (min. avail process descriptors;default 200)
;umask=022 ; (process file creation umask;default 022)
;user=chrism ; (default is current user, required if root)
;identifier=supervisor ; (supervisord identifier, default is 'supervisor')
;directory=/tmp ; (default is not to cd during start)
;nocleanup=true ; (don't clean up tempfiles at start;default false)
;childlogdir=/tmp ; ('AUTO' child log dir, default $TEMP)
;environment=KEY="value" ; (key value pairs to add to environment)
;strip_ansi=false ; (strip ansi escape codes in logs; def. false)
以上是supervisord 的全局配置,可全部默认。
• supervisor 相关服务配置
; the below section must remain in the config file for RPC
; (supervisorctl/web interface) to work, additional interfaces may be
; added by defining them in separate rpcinterface: sections
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl]
serverurl=unix:///etc/supervisor.sock ; use a unix:// URL for a unix socket
;serverurl=http://127.0.0.1:9001 ; use an http:// url to specify an inet socket
;username=chris ; should be same as http_username if set
;password=123 ; should be same as http_password if set
;prompt=mysupervisor ; cmd line prompt (default "supervisor")
;history_file=~/.sc_history ; use readline history if available
以上是RPC和supervisorctl的配置,可全部默认。
supervisor 监控的进程 是一直需要运行的进程/程序
shell 一直运行 死循环,
• program 配置模板 --- 需要根据实际情况进行配置
[program:kafka-connect-hdfs] 首先改名 [program:test-supervisor-8]
command=/opt/bin/start-worker-supervisor.sh /opt/connect-distributed.properties 改成程序的启动命令 绝对路径
/home/fh/./tsupervisor.sh
process_name=%(program_name)s
numprocs=1
startsecs=0
stopwaitsecs=0
autostart=true
autorestart=true
stopsignal=KILL
user=hive 改为自己有的用户
environment=HADOOP_USER_NAME="hive" 干掉
stdout_logfile=/var/log/test-supervisor-8.log 改成和服务一样的名字 后缀不动
stderr_logfile=/var/log/test-supervisor-8.err
.log 和.err的日志文件 在程序正常的情况下是没有输出的,只要在程序运行出错的时候,日志中才会有输出,输出的内容是错误信息,要根据错误信息对文件作出相应的更改
----------------------------------------------------------------------------------------
启动supervisor的命令:/usr/bin/supervisord -c /etc/supervisor.conf
进入客户端:敲命令:supervisorctl
客户端的几个命令:
status 查看状态 PID一直变化说明程序一直是死了又被拉起来了 uptime 启动时间
status查看出来的进程PID不改变时,说明进程已经稳定了
stop 名字 停掉正在执行的状态
start 启动进程
restart 重启进程
update 加载配置
ctrl+c 退出
• program 配置模板 --- 各字段含义
program 被管理的进程的名称,不可重复,需自定义
command 程序启动命令,建议使用绝对路径,和手动启动程序的命令一致
process_name python字符串表达式,表示supervisor启动这个程序的名称,默认即可
numprocs supervisor启动这个程序的实例个数,可默认为1
startsecs 程序启动后等待多长时间,supervisor才认为程序启动成功,默认是10秒,可配置为0/3/10
stopwaitsecs 在程序收到停止信号之后,supervisor等待操作系统返回SIGCHLD的时间(单位:s);如果等待 了这个时间之后,supervisor没有收到SIGCHLD信号,supervisor将会使用SIGKILL去杀死这个 进程。可配置为0/10
autostart 如果设置为true,当supervisord启动的时候,进程会自动启动,建议设置为true
autorestart 如果设置为true,程序退出后会被自动重启,建议设置为true
stopsignal 当supervisord收到stop请求的时候,发送给程序的停止信号,建议设置为kill
user 使用这个用户启动被管理程序
environment 设置运行被管理程序的环境变量
stdout_logfile 配置程序的标准输出的文件
stderr_logfile 配置程序的错误输出的文件
• 为了便于管理program的配置文件
[include]
files = /etc/supervisor/config.d/*.ini
Demo:# 写一个运行脚本,使用supervisor进行管理
常见错误:
pemission denied :没有权限
定位过程:
看一下程序 缺少的是什么权限
首先查看已有的权限:ll 文件名
然后查进程:ps -ef |grep .sh 看进程PID,用户 判断该用户对上面的文件是什么样的用户
根据所属的用户给文件加权限 chmod 用户+权限 文件名
supervisor: couldn't exec /home/zzx/shell/supervisor1.sh: EACCES
由于 supervisor无法判断使用什么解释器来执行该命令导致的在配置的command前面添加 /bin/bash 即可
supervisor: child process was not spawned
改完之后 不会立即生效
要做的操作:update 回车 更新配置
注意:supervisor不能监控后台进程,command 不能为后台运行命令。
启动进程时 不能加& 不支持
中断级的拉起 父进程监管子进程
有错误 看日志
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
# 第八章 yum源配置与应用
自配置yum源
• 创建yum源仓库 仓库里面放的是rpm包
将rpm包放到 /home/zzx/yum/目录下
createrepo /home/zzx/yum/
• 配置路径 /etc/yum.repos.d repos:仓库
在此路径下,新建一个配置文件,例如:local.repo
• 配置内容
[local-repo]
name=local-repo
baseurl=http://192.168.11.116/repo/BDP/
baseurl=file:///home/zzx/yum
enabled=1
gpgcheck=0
如果在普通模式下,直接复制,系统会安装可以进入编辑模式的字母进行删除。
例如,[local-repo] 会把o当做进入编辑模式的指令,会新开一行,打出cal-repo]
• yum list |grep xxx 查看系统上所有的安装文件
清缓存:yum clean all
# 第九章 ssh免密 跳服务器
ssh IP地址
配置主机A免密登录到主机B
cd ~/.ssh/ 切换到ssh的目录下,查看ssh目录是否存在,如果存在,则执行下一步 如果不存在,则满足执行ssh-keygen -t rsa 的执行条件一
ll 看是否存在id_rsa 和id_rsa.pub 文件,如果存在,则说明不符合执行条件二 如果不存在,则满足执行ssh-keygen条件二
执行 ssh-keygen -t rsa 命令的前提条件:
1.没有 ~/.ssh目录
2.存在 ~/.ssh 目录,但是此目录下没有 id_rsa(私钥) 和id_rsa.pub(公钥) 文件
执行命令后生成目录与文件
• 1 在主机A和主机B上,都执行如下操作,生成公钥
ssh-keygen –t rsa
一直回车,此时和在家目录下生成 .ssh目录
ssh 是一种协议
genarate 生成 -t type 加密算法的类型 rsa 是一种加密算法
• 2 将主机A的 ~/.ssh/id_rsa.pub的内容,追加到主机B的~/.ssh/authorized_keys(没有此文件,就新建)
只能再往里加,不能删东西 vi 打开 GG 跳到最后一行 o进入编辑模式
把A的秘钥放在B的文件中
• 3 在主机B上:chmod 600 ~/.ssh/authorized_keys
• 4 在主机上A ssh 用户名@B,即可实现免密登录 加用户名可以区分用户
注意:用户名就是你1-3步中登录B使用的用户。
A免密到B:在A上输入ssh+B的IP地址 跳到B上
exit 退出B到A
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
# 第十章 ntp配置
ntp配置-主节点
• NTP是网络时间协议(Network Time Protocol)
没有ntp则安装:yum install ntp
• 1 如若没有现成的ntp服务器,需要选择一个节点作为主节点,作为ntp服务器
主节点的配置:
/etc/ntp.conf修改为如下配置
vi打开文件 把里面所有的东西全部删除,然后把下面的内容全部粘到文件中
driftfile /var/lib/ntp/drift
restrict 127.0.0.1
restrict -6 ::1
restrict default nomodify notrap
server 127.127.1.0 # local clock
fudge 127.127.1.0 stratum 10
includefile /etc/ntp/crypto/pw
keys /etc/ntp/keys
ntp配置-其他节点
• 2 主节点之外的其他节点配置,将server指向主节点
/etc/ntp.conf修改为如下配置
server 127.127.1.0
fudge 127.127.1.0 stratum 10
driftfile /var/lib/ntp/drift/ntp.drift
logfile /var/log/ntp
keys /etc/ntp.keys
trustedkey 1
requestkey 1
server 192.168.1.111 iburst
restrict 192.168.1.111
操作同上
其中 192.168.1.111为主节点的IP地址。(唯一需要知道的)
启动命令:service ntpd start (centos 6) 在任意目录下敲 daemon
运行之后查看进程:ps -ef |grep ntpd
ntp配置-操作命令
• 手动与主节点进行时钟同步
ntpdate 192.168.1.111
• 启动ntp服务(自动)
service ntpd start
停止ntp服务
service ntpd stop
• 查看时钟同步状态 在从节点上敲
ntpstat
• 查看ntp连接状态
ntpq -p
local 是自己的状态
自动同步:
ntpdate 老大的IP地址
逐步逼近 而不是一次靠近
第一次用手动配置 后面用自动配置
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
# 第十一章 screen
安装screen:yum install screen
screen 守护进程
• 应用场景
• 集群间的数据备份
• 使用命令
• screen –S yourname 创建一个会话 session
• screen -ls 查看所有会话
• screen -r session-id 恢复一个会话 r:recover
• ctrl+a+d 在一个会话里提交任务,会话后台运行
ctrl+d 提交任务
使用的场景:at wc -l
• exit 退出一个会话,会话关闭