Linux_《Linux命令行与shell脚本编程大全》第十六章学习总结

时间:2017年09月26日星期二
说明:本文部份内容均摘取自书籍《Linux命令行与shell脚本编程大全》,版权归原做者全部。《Linux命令行与shell脚本编程大全》(第三版)第十六章学习总结linux

第十六章:控制脚本

本章内容shell

处理信号
之后台模式运行脚本
禁止挂起
做业控制
修改脚本优先级
脚本执行自动化

16.1 处理信号

16.1.1 重温Linux信号

Linux系统信号编程

Linux利用信号与运行在系统中的进程进行通讯
可使用信号来中止/启动/终止进程
能够经过对脚本进行编程,使其在收到特定信号时执行某些命令,从而控制shell脚本
默认状况下,bash shell会忽略收到的任何3和15信号
可是bash shell会处理1和2信号

常见的Linux系统信号bash

信号:值:描述
1:SIGHUP:挂起进程
2:SIGINT:终止进程
3:SIGQUIT:中止进程
9:SIGKILL:无条件终止进程
15:SIGTERM:尽量终止进程
17:SIGSTOP:无条件中止进程,但不是终止进程
18:SIGTSTP:中止或暂停进程,但不终止进程
19:SIGCONT:继续运行中止的进程

16.1.2 生成信号

1.中断进程app

使用Ctrl+C组合键会生成2(SIGINT)信号,并将其发送给当前在shell中运行的全部进程ide

执行命令oop

sleep 100
^C

注:^代指Ctrl键学习

2.暂停进程url

使用Ctrl+Z组合键会生成18(SIGTSTP)信号,中止shell中运行的任何进程操作系统

执行命令

sleep 100
^Z

当按键Ctrl+Z组合键时,bash shell会给出以下提示

[1]+  Stopped sleep 100
方括号中的数字时shell分配的做业号(job number)
shell将shell中运行的每一个进程称为做业,并为每一个做业分配惟一的做业号
若是shell回话中有已中止的做业,在退出shell时,bash会提醒你

经常使用操做

ps -l
查看已中止的做业,在S列中(进程状态)显示T的为已中止的做业
kill -9 PID
终止指定PID的做业,终止已中止做业的PID
通俗来说,就是杀掉进程

16.1.3 捕获信号

命令格式:trap commands signals
命令说明:使用trap命令来指定shell脚本要监看并从shell中拦截的Linux信号

使用trap命令来忽略SIGINT信号

编写test1.sh脚本

#!/bin/bash

trap "echo 'Sorry!I have trappend Ctrl-C'" SIGINT

echo This is a test script

count=1
while [ $count -le 10 ]
do
    echo "Loop #$count"
    sleep 1
    count=$[ $count+1 ]
done

echo "This is the end of the test script"

16.1.4 捕获脚本退出

捕获shell脚本的退出EXIT信号

编写test2.sh脚本

#!/bin/bash

trap "echo Goodbye..." EXIT

count=1
while [ $count -le 5 ]
do
    echo "Loop #$count"
    sleep 1
    count=$[ $count+1 ]
done

16.1.5 修改或移除捕获

修改信号捕获,脚本仍然会根据最初的trap命令进行处理

编写test3.sh脚本

#!/bin/bash
#
trap "echo 'Sorry.. Ctrl+C is trapped.'" SIGINT
#
count=1
while [ $count -le 5 ]
do
    echo "Loop #$count" 
    sleep 1
    count=$[ $count+1 ]
done
#
trap "echo 'I modified the trap!'" SIGINT
#
count=1
while [ $count -le 5 ]
do
    echo "Loop #$count" 
    sleep 1
    count=$[ $count+1 ]
done

在trap和信号列表之间加上两个破折号删除已设置好的捕获并恢复默认行为

编写test3b.sh脚本

#!/bin/bash
#
trap "echo 'Sorry.. Ctrl+C is trapped.'" SIGINT
#
count=1
while [ $count -le 5 ]
do
    echo "Loop #$count" 
    sleep 1
    count=$[ $count+1 ]
done
#
# Remove the trap
trap -- SIGINT
echo "I just removed the trap"
#
count=1
while [ $count -le 5 ]
do
    echo "Loop #$count" 
    sleep 1
    count=$[ $count+1 ]
done

敲门:也能够在trap命令后使用单破折号来恢复信号的默认行为。单破折号和双破折号均可以正常发挥做用

16.2 之后台模式运行脚本

16.2.1 后台运行脚本

在命令后加个&符之后台模式运行shell脚本

编写test4.sh脚本

#!/bin/bash
count=1
while [ $count -le 10 ]
do
    sleep 1
    count=$[ $count+1 ]
done

执行命令

./test4.sh &

而后显示[1] 3231
方括号中的表示后台进程的做业号,后面的数字为进程的进程ID(PID)

当后台进程运行时,它仍然会使用终端显示器来显示STDOUT和STDERR消息

编写test5.sh脚本

#!/bin/bash
#
echo "Start the test script"
count=1
while [ $count -le 5 ]
do
    echo "Loop #$count"
    sleep 5
    count=$[ $count+1 ]
done
#
echo "Test script is complete"

当脚本在后台模式运行时,脚本的输出和输入的命令以及命令输出全都混在了一块儿,最好是将后台运行的脚本的STDOUT和STDERR进行重定向,避免杂乱的输出

16.2.2 运行多个后台做业

可使用&符号的方法在命令行提示符下同时启动多个后台做业
使用ps命令查看全部脚本的运行状态
在终端会话中使用后台进程时必定要当心,当退出终端时,后台进程也会退出

16.2.3 在非控制台下运行脚本

命令格式:nohup ./test1.sh &
命令说明:使用nohup命令在终端会话中启动shell脚本,并让脚本一直之后台模式运行到结束,即便退出了终端会话,shell脚本也会一直运行

执行命令

nohup ./test1.sh &
cat nohup.out

说明

使用nohup启动shell脚本时,脚本会忽略终端会话发过来的SIGHUP信号
因为nohup命令会解除终端与进程的关联,进程也就不在同STDOUT和STDERR关联
nohup命令会自动将STDOUT和STDERR的消息重定向到当前目录下名为nohup.out的文件中
若是使用nohup命令运行了另外一个脚本,则该脚本的输出会被追加到已有的nohup.out文件中

16.4 做业控制

启动/中止/终止以及恢复做业的这些功能统称为做业控制

16.4.1 查看做业

使用jobs命令查看shell当前正在处理的做业,脚本$$变量显示Linux系统分配给该脚本的PID

编写test10.sh脚本

#!/bin/bash
#
echo "Script Process ID: $$"
#
count=1
while [ $count -le 10 ]
do
    echo "Loop #$count"
    sleep 10
    count=$[ $count + 1 ]
done
#
echo "End of script..."
#

执行命令

./test10.sh > test10.out &
查看做业
jobs
查看做业的PID
jobs -l

jobs命令参数

参数:描述
-l:列出进程的PID以及做业号
-n:只列出上次shell发出的通知后改变了状态的做业
-p:只列出做业的PID
-r:只列出运行中的做业
-s:只列出已中止的做业

jobs命令输出中的加号和减号

带加号的做业会被当作默认做业
在使用做业控制命令时,若是未在命令行指定任何做业号,
    该做业会被当作做业控制命令的操做对象
当前的默认做业完成处理后,带减号的做业成为下一个默认做业
任什么时候候都只有一个带加号的做业和一个带减号的做业,
    无论shell中有多少个正在运行的做业

16.4.2 重启中止的做业

命令格式:bg 做业号
命令说明:之后台模式重启指定做业
命令格式:fg 做业号
命令说明:之前台模式重启指定做业

16.5 调整谦让度

在多任务操做系统中(Linux就是),内核负责将CPU时间分配给系统上运行的每一个进程
调度优先级是内核分配给进程的CPU时间(相对于其余进程)
在Linux系统中,由shell启动的全部进程的调度优先级默认都是相同的
调度优先级是个整数值,从-20(最高优先级)到+19(最低优先级)
默认状况下,bash shell以优先级0来启动全部进程

敲门:最低值-20是最高优先级,而最高值19是最低优先级,这太容易记混了。只要记住那句俗语“好人难作”就好了。越是“好”或高的值,得到CPU时间的机会越低

16.5.1 nice命令

使用nice命令-n参数来指定新的优先级级别

执行命令

nice -n 10 ./test4.sh > test4.out &
查看做业信息
ps -p 3678 -o pid,ppid,ni,cmd
nice -10 ./test4.sh > test4.out &
ps -p 3706 -o pid,ppid,ni,cmd

16.5.2 renice命令

使用renice命令指定运行进程PID的优先级

执行命令

./test4.sh &
ps -p 3742 -o pid,ppid,ni,cmd
renice -n 10 -p 3742
ps -p 3742 -o pid,ppid,ni,cmd

renice命令的一些限制

只能对属于你的进程执行renice
只能经过renice下降进程的优先级
root用户能够经过renice来任意调整进程的优先级

16.6 定时运行做业

16.6.1 用at命令来计划执行做业

1.at命令的格式

命令格式:at [-f filename] time
命令说明:使用-f参数指定须要执行的脚本文件的文件名,time参数制定了何时运行

多种不一样的时间格式

标准的小时和分钟格式,好比10:15
AP/PM指示符,好比10:15PM
特定可命名时间,好比now,noon,midnight或teatime(4PM)
标准日期格式,好比MMDDYY,MM/DD/YY或DD.MM.YY
文本日期,好比Junl4或Dec25,加不加年份都可
也能够指定时间增量
    当前时间+25min
    明天10:15PM
    10:15+7天

2.获取做业的输出

在Linux系统上运行时,显示器并不会关联到该做业。Linux系统会将STDOUT或STDERR的输出经过邮件系统发送给用户

编写test13.sh脚本

#!/bin/bash
echo "This script ran at $(date +%B%d,%T)"
echo
sleep 5
echo "This is the script end..."

执行命令

at -f test13.sh now

使用-M选项来屏蔽做业产生的输出信息

编写test13b.sh

#!/bin/bash
echo "This script ran at $(date +%B%d,%T)" > test13b.out
echo >> test13b.out
sleep 5
echo "This is the script end..." >> test13b.out

执行命令

at -M -f test13b.sh now
cat test13b.out

3.列出等待的做业

atq命令查看系统中有哪些做业在等待,显示做业列表
做业列表中显示了做业号,系统运行该做业的日期和时间及其所在的做业队列

4.删除做业

命令格式:atrm 做业号
命令说明:使用atrm删除指定做业

16.6.2 安排须要按期执行的脚本

1.cron时间表

命令格式:min hour dayofmonth month dayofweek command
命令说明:cron时间表采用一种特别的格式来指定做业什么时候运行

格式说明

dayofweek:文本(mon,tue,wed,thu,fri,sat,sun)或数值(0为周日,6为周六)
dayofmonth:表示月份中的日期值(1~31)

cron实例

在天天的10:15运行一个命令
15 10 * * * command
在每周一4:15PM运行的命令
15 16 * * 1 command
在每月的第一天中午12点执行命令
00 12 1 * * command
在每月的最后一天执行命令
00 12 * * * if [‘date +%d -d tomorrow’ = 01]; then;command
说明:在天天中午12点检查是否是当月的最后一天,若是是,cron将会运行该命令

执行命令

15 10 * * * /home/zc/test/unit16/test4.sh > test4.out

2.构建cron时间表

Linux提供了 crontab来处理cron时间表,使用cron时间表来运行安排好的任务

命令格式:crontab -l
命令说明:使用crontab -l列出已有的cron时间表

3.浏览cron目录

若是建立的脚本对精确的执行时间要求不高,则可使用预配置的cron脚本目录

四个基本目录

hourly:每小时执行
daily:天天执行
monthly:每个月执行
weekly:每周执行

执行命令

ls /etc/cron.*ly

4.anacron程序

cron程序只能保证,Linux系统在开机状态下,才执行定时做业,当Linux系统处于关机状态时,并不会去执行定时任务

使用anacron程序,当Linux系统关机,知道某个做业错过了执行时间,当Linux系统开机时,它会尽快运行做业

anacron程序只会处理位于cron目录的程序,如/etc/cron.monthly

命令格式:period delay identifier command
命令说明: period定义了做业多久运行一次,以天为单位。

注意:anacron程序不会处理执行时间小于一天的脚本,如位于/etc/cron.hourly的脚本

16.6.3 使用新shell启动脚本

每次启动一个新shell时,bash shell都会运行$HOME/.bashrc文件

验证

在$HOME/.bashrc文件的最后加入:echo "I'm in a new shell"
而后保存,关闭shell终端
从新打开shell终端时,能够看见该提示语

16.7 小结

本章主要讲解了linux中的信号控制,之后台模式执行脚本,指定时间执行脚本,修改脚本的优先级等。

相关文章
相关标签/搜索