linux shell 学习之第15章 控制脚本

15.1 处理信号
15.1.1 重温信号
默认情况下,bash shell 会忽略收到的任何SIGQUIT(3,停止进程)和SIGTERM(5,可能的话终止进行)信号(因为这样,交互式shell才不会意外终止)。但是bash shell会处理收到的SIGHUP(1,挂起进程)和SIGINT(2,终止进程)。
如果bash shell收到了SIGHUP信号,在它退出前,它会将SIGHUP信号传给shell启动的所有进行。通过SIGINT,可以中断shell,shell会将SIGINT信号传给shell启动的所有进程,来通知它们。
15.1.2 产生信号
Ctrl+c 产生SIGINT信号(终止进程),
Ctrl+z 产生SIGISTP信号(暂停进程),可以恢复。
15.1.3 捕捉信号
trap命令
trap commands signals,signals可以是信号名或数值。
15.1.4 捕捉脚本的退出
trap commands exit
脚本正常退出或者Ctrl+c,都会捕捉到。
15.1.5 移除捕捉
trap - signal,可以移除信号。但是如果在捕捉在被移除前收到信号,则该移除无效。
15.2 以后台模式运行脚本
后台运行进程,不会运行在你的终端显示器上,进程不会和终端会话上的STDIN、STDOUT 及STDERR关联。
15.2.1 后台运行脚本
command &, 会显示 [1] 1976 ,方括号里面是shell 分配给后台进程的作业号,后面是进程ID(PID)。
此时的后台进程在运行时,仍会使用终端显示器来显示STDOUT 及STDERR 信息, 进程的输出会和shell中运行的其他命令的输出混杂在一起。
15.2.2 运行多个后台作业
15.2.3 退出终端
后台进程都绑定到终端会话,如果这个终端进程会话推出了,后台进程也会退出。
15.3 在非控制台下运行脚本
nohup command &,也会分配一个作业和和PID。如果关闭该会话,会忽略任何终端会话发来的SIGHUP信号。
nohup命令会从终端接触进程的关联,进程会丢掉STDOUT 及STDERR的链接,nohup命令会自动将STDOUT 及STDERR 的消息重定向到nohup.out 文件。在运行同目录下的多个命令,所有输出都会发送到同一个nohup.out 文件,会很乱。
15.4 作业控制
kill命令终止进程,重启停止的进程需要向其发送一个SIGCONT信号。
15.4.1 查看作业
jobs命令  -l 列出进程的PID和作业号
          -n 只列出上次shell发出的通知后改变了状态的作业
          -p 只列出作业的PID
          -r 只列出运行中的作业
          -s 只列出已停止的作业

jobs命令输出中两条比较特殊,一条有加号,一条有减号,带加号的作业会被当作默认的作业,在使用作业控制命令时,如果没有指定任何作业号,就会将带加号的作业作为操作对象。带减号的作业会在当前默认作业完成处理后成为下一个默认作业。任何时候都只有一个带加号和减号的作业。
15.4.2 重启停止的作业
bg 作业号   后台模式重启一个作业
fg 作业号   前台模式重启一个作业

15.5 调整谦让度
默认从shell 启动的所有进程在linux系统上具有同样的调度优先级。调度优先级从-20(最高)到+20(最低)。默认,bash shell以优先级0来启动所有进程。
15.5.1 nice命令
nice -n 优先级数值 command。  nice命令组织普通系统用户来增加命令的优先级。
15.5.2 renice命令
renice 优先级数值 -p PID。 限制:你只能对属于你的进程执行;你只能降低进程的优先级;root用户可以调整任何进程的优先级到任何级别。

15.6 定时运行作业
15.6.1 at命令
at [-f filename] time。at的守护进程atd会以后台模式运行,并检查作业队列来运行作业,它会检查系统上的一个特殊目录(/var/spool/at)来获取at命令提交的作业,默认每60s检查一次。
使用at命令后,该作业会被提交到作业队列。针对不同优先级,存在26种不同的作业队列,通常用小写字母a(最高)~z(最低)表示,用-q选项指定优先级。
当作业在linux系统上运行时,没有屏幕会关联到该作业,linux系统会将提交该作业的用户的email地址作为STDOUT和STDERR,任何发到STDOUT和STDERR的输出都会发送到该用户的邮箱。默认如果作业没有任何输出,就不会发送email,用-m选项改变这个。
atq命令可以查看系统中有哪些作业在等待。
atrm 作业号   删除等待中的作业。你只能删除自己提交的要执行的作业,不能删除别人的。
15.6.2 计划定期执行脚本
linux提供使用cron程序来计划要定期执行的作业,它会在后台运行并检查cron时间表来获得计划执行的作业。
cron时间表采用以下的格式来制定何时运行什么作业:
min hour dayofmonth month dayofweek command
必须指定要运行的命令或脚本的全路径名,可以添加任何命令行参数和重定向符号。cron程序会用提交作业的用户帐户运行该脚本,因此你必须有访问该命令和命令中指定的输出文件的权限。
crontab -l  列出已有的cron时间表。
默认每个用户的cron时间表不存在,要为cron时间表添加条目,可以用-e选项,crontab命令会用已有的cron时间表(不存在的话就新建一个空文件)来启动一个文本编辑器。
cron目录:/etc/下存在cron.hourly  cron.daily  cron.monthly  cron.weekly 四个文件夹,当你的脚步不要求有精确的执行时间时,可以直接放置到对应的目录里。
anacron程序:cron时间表中的作业计划在丽奴性关机后,时间错过后不会执行。而anacron程序不会。anacron程序不会处理执行时间需求小于一天脚本,即不会运行位于/etc/cron.hourly的脚本。

15.7 启动时运行
15.7.1 开机时运行脚本
一般的linux系统有0~6 共7种运行级(run level)。不同的发行版将开机版本放置不同目录下,如/etc/rc#.d,/etc/init.d,/etc/init.d/rc.d等等。不同的发行版提供rc.local或boot.local 来让用户定义自己的开机脚本(必须指定该脚本的全路径名)。不推荐与系统的开机脚本混合在一起。
15.7.2 在新shell中启动
每个用户的家目录下,有两个文件
.bash_profile   登录系统时,bash shell 会运行该文件,任何登录时需要运行的脚本可以放到该文件。
.bashc          新shell启动时,包括登录系统时,bash shell 会运行该文件。
/etc/bashrc 文件 是系统的所有用户都可以用。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值