Linux必备进阶命令


• 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                退出一个会话,会话关闭


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值