Shell编程进阶及进程管理

SHELL编程进阶

一、各类循环语句的用法

1.  条件选择if语句

            if 判断条件;then

            当判断条件为真时执行

            else

            当判断条件为假时执行

            fi

2.  条件判断 case 语句

        case 变量 in

            指定内容1)输出   ;;

            指定内容2)输出   ;;

            ……

            指定内容3)输出   ;;

        esac

其中在指定内容中支持 *、?、[ ]、| 这几个文件通配符

3.  循环语句

第一种:       for 变量名 in 指定列表;do

                       循环体

                    done

第二种:       while 循环控制条件 ;do

                       循环体

                    done

        (其中循环控制条件为真时进行循环)

第三种:       until 循环控制条件 ;do

                       循环体

                    done

        (其中循环控制条件为假时进行循环)

在循环体中出现 continue 时,则立刻结束当前判断条件下的循环,进入下一个判断条件继续执行循环;

在循环体中出现 break 时,则循环立刻全部结束;

在循环体中出现 shift 时,表示参数列表每执行一次循环就去除第一个参数,直至参数为0 个时,结束循环。

4.  无限循环的创建方式

第一种 :  while true ; do

                       循环体

                done

第二种:       until false ;do

                       循环体

                   done

5.  while特殊用法

            while read line;do

                循环体

            done < 需要读取的文件

此循环表示依次读取文件中的每一行,并将内容赋值给变量line(其中变量line可以为任何指定的字符)

也可不需要在 done 后导入文件,可以通过命令执行然后传导给while,例如:df | grep “/dev/sda”|while read line

6.  for 特殊用法

            for ((变量赋值;判断条件;变量的修正));do

                循环体

            done

其中,变量赋值只执行一次,然后每循环一次变量修正一次再去进行条件判断。直至条件判断为假,结束循环。

7.  select 循环

select循环主要是用于菜单的创建,通常情况是与case 一同使用的,并且利用PS3提示符来显示用户要输入的内置变量 REPLY,举例如下:

选择水果,并显示出水果的价格

#!/bin/bash

PS3="Please choose yourfruit: "

select menu in apple bananaorange quit;do

    case $REPLY in

       1)echo "The prise is $10";;

       2)echo "The prise is $5";;

       3)echo "The prise is $6";;

       *)break;;

    esac

done

8.  信号捕捉trap

trap   ‘触发指令’+ 信号    不执行原信号操作,执行触发指令

    ‘’+ 信号          忽略信号的操作

    ‘-’+ 信号         恢复原信号的操作

trap  -p 列出自定义的的信号操作

举例如下:

#!/bin/bash

trap 'echo haha' int

trap -p

for ((n=1;n<=15;n++));do

    echo $n

    sleep 1

done

trap '' int

for ((n=16;n<=30;n++));do

    echo $n

    sleep 1

done

trap '-' int

for ((n=31;n<=60;n++));do

    echo $n

    sleep 1

done

二、函数介绍及使用

1.  函数的基本格式:

            function_name ( ) {

                    函数体

            }

其中函数被使用前,必须是已经定义了的,先后顺序。

return  表示从函数中返回

return 0 无错误返回; return 1-255 有错误返回

2.  函数中的变量有效范围

内部函数:变量的定义,只对当前函数有效。

                declare -i 定义整数

                local 定义字符串

全局函数:变量的定义,对当前shell有效。

                declare -ig或不用declare

环境函数:变量的定义,对当前shell及子shell都有效。

                export -f 或declare -xf

3.  set 可以查看已经载入的函数

            . | source +函数名(正确路径)表示将函数载入shell

            unset + 函数名  表示删除函数定义

三、数组

1. 索引:编号从0开始,属于数值索引

   关联索引:自定义变量对应字符

                declare -a  显示索引数组

                declare -A  显示关联数组

   在创建数组前,通过 “declare –a|A” 表明数组类型

1.  数组赋值方式

            a.  每次赋值一个     数组名[数字]=被赋值个体

            b.  一次性赋值       数组名=(被赋值个体1 被赋值个体2 被赋值个体3)

            c.  给多文件赋值     数组名=(文件路径)(例如:/etc/*.conf)

            d.  用read  -a +数组名,然后输入需要赋值的个体

2.  数组的引用

${数组名[索引]} 表示取出对应索引名的元素

若不加[索引],表示取出[0]索引的元素

               ${数组名[*|@]}   表示引用数组的所有元素

               ${#数组名[*|@]}  表示数组中的元素的个数

               数组切片:${数组名[@]:offset:number}

                       offset: 要跳过的元素个数

                       number: 要取出的元素个数

               ${数组名[@]:offset}  表示取偏移量后的所有元素

               数组名[${#数组名[*]}]=新加的元素名

====================================================================

进程管理

一、进程管理工具

1.pstree 以树状图显示系统进程;加上“-p”选项,则会同时显示进程号

2.ps 可以来查看进行信息,接上如下选项:

             a 显示所有终端上运行的前台进程

             u 显示用户名

             x 显示当前用户所运行的所有进程,包括前台和后台守护进程

    可以合并使用ps aux

    常用组合:-ef

            -e: 显示所有进程

            -f: 显示完整格式程序信息

    常用组合:-eFH

            -F: 显示更完整格式的进程信息

            -H: 以进程层级格式显示进程相关信息

    常用组合:自定义显示需要显示的信息

        -eo (pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,comm)

        -axo (stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm)

5.  进程优先级

开始运行时前设置nice值

            nice -n +设定值 +命令/进程号

运行过程中修改nice值

            renice -n +设定值 +命令/进程号

其中“设定值必须是1-19的数”,进程号用“pidof +进程名”显示

6.  pgrep 搜索进程命令

        -u username/uid 查看指定用户所运行的所有进程的进程号

        -lu username/uid 查看指定用户所运行的所有进程的进程号及进程名

        -t 终端名 查看指定终端所运行的所有进程的进程号

        -lt 终端名 查看指定终端所运行的所有进程的进程号及进程名

        -P 进程号  查看指定进程的子进程的进程号

5. kill 进程运行时的管理工具

        1)SIGHUP:  无须关闭进程而让其重读配置文件

        2)SIGINT:  中止正在运行的进程,相当于ctrl+c

        3)SIGQUIT:  ctrl+\

        9)SIGKILL   强制杀死正在运行的进程

        15)SIGTERM  终止正在运行的进程

        18)SIGCONT: 将休眠的进程放入后台运行

        19)SIGSTOP: 将进程休眠

例如:kill -1/SIGHUP/HUP +进程号

二、作业管理

1. 作业控制内容

前台作业:通过终端启动,启动后会一直占据终端

   后台作业:通过终端启动,启动后就立刻进入后台运行,从而释放终端

   ctrl + Z  将前台进程暂停

fg 将当前终端上运行的后台进程放入前台运行 

bg 将前台暂停的进程放入后台运行

可通过 “命令 + &”直接让命令运行时直接放入后台

jobs 可以查看当前终端的进程

2. 为了防止进程因终端关闭而结束,可采取以下方法:

方法一:将进程运行在后台(两种方法)

    1)先前台运行,然后ctrl+z 暂停,再bg

    2) 运行命令后加上 &

方法二:

输入screen命令后,再输入需要执行的命令

方法三:

nohup ./test.sh &>/dev/null &

3.使多进程并行运行

可将需要执行的进程命令分别写入脚本,然后进行以下操作:(例如:)

方法一:      #!/bin/bash

                     /app/bin/test.sh&

                     /app/bin/test2.sh &

                     /app/bin/test3.sh &

方法二:

(./test.sh &);(./test2.sh &);(./test3.sh &)

方法三:

{ ./test.sh & ./test2.sh & ./test3.sh & }

三、任务计划

1. at命令(临时性)

当/etc/at.allow不存在时,为黑名单模式,写入/etc/at.deny的用户不能at

当/etc/at.allow存在时,为白名单模式,/etc/at.deny文件失效,写入/etc/at.allow的用户才能at

常用选项:

    -V 显示版本信息:

    -l: 列出指定队列中等待运行的作业;相当于atq

    -d: 删除指定的作业;相当于atrm

    -c: 查看具体作业任务

    -f /path/from/somefile:从指定的文件中读取任务

    -m:当任务被完成之后,将给用户发送邮件,即使没有标准输出

注意:作业执行命令的结果中的标准输出和错误以邮件通知给相关用户

TIME:定义出什么时候进行 at 这项任务的时间

    HH:MM [YYYY-mm-dd] (写具体的时间)

    noon(中午十二点), midnight(晚上十二点), teatime(下午4点)

    tomorrow(明天)

    now+#{minutes,hours,days,OR weeks}

2. crontab命令(循环性)

crontab  -e 设置当前用户的计划任务

当/etc/cron.allow不存在时,为黑名单模式,写入/etc/cron.deny的用户不能crontab -e

当/etc/cron.allow存在时,为白名单模式,/etc/cron.deny文件失效,写入/etc/cron.allow的用户才能crontab -e

其中格式为:

 其他的参数选项为:

-l 查看用户的计划任务

       -u username 指定用户名

        -r 删除指定用户的全部计划任务

猜你喜欢

转载自blog.csdn.net/Ruixycowboy/article/details/80797353