禅道博客

分享专业技术知识,文章内容干货满满

《Linux命令行与shell脚本编程大全》第十六章

2023-12-21 15:05:21
赵岩
原创 804
摘要:本文是《Linux命令行与shell脚本编程大全》第16章的读书笔记。

16.1 处理信号

1.重温 Linux 信号

Linux系统和应用程序可以生成超过30个信号。常见的信号如下图所示:
默认情况下,bash shell会忽略收到的任何SIGQUIT(3)和SIGTERM(15)的信号,但是会处理SIGHUP(1)和SIGINT(2)的信号。

2.生成信号:在需要停止或暂时失控程序时非常方便

(1)中断进程


Ctrl+C组合键会发送SIGINT信号,停止shell中当前运行的进程。

(2)暂停进程


Ctrl+Z组合键会生成一个SIGTSTP信号,停止shell中运行的任何进程。
停止进程跟终止进程不同:停止进程会让程序继续保留在内存内,并能从上从停止的位置继续运行。

3.捕获信号

trap命令允许指定shell脚本要监看并从shell中拦截的Linux信号。

命令格式:trap commands signals

4. 捕获脚本退出

要捕获shell脚本的退出,只要在trap命令后加EXIT信号就可以。

5.修改或移除捕获

重新使用带有新选项的trap命令可以对脚本中不同位置进行捕获处理。
使用trap命令与希望恢复默认行为的信号列表之间加上两个破折号可以删除已设置好的捕获。

使用trap命令与单破折号可以恢复信号的默认行为。

16.2以后台模式运行脚本

在用ps命令时,运行在Linux系统上的一系列不同进程为后台运行进程。

1. 后台运行脚本

以后台模式运行shell脚本只需要在命令后加个&符

2. 运行多个后台作业

通过ps命令,可以看到所有脚本处于运行状态。
在ps命令的输出中,每一个后台进程都和终端会话(pts/0)终端联系在一起,如果终端会话退出,那么后台进程也会随之退出。

16.3在非控制台下运行脚本

当想在终端会话中启动shell脚本,让脚本一直以后台模式运行到结束,即使已经退出了终端会话时,可以使用到nohup命令。

nohup命令运行了另外一个命令来阻断所有发送给该进程的SIGHUP信号,会在退出终端会话时阻止进程退出。

为了保存该命令产生的输出,nohup命令会自动将STDOUT和STDERR的消息重定向到一个名为nohup.out的文件中。

16.4作业控制

(1)查看作业

jobs命令允许查看shell当前正在处理的作业
jobs命令可与以下命令参数连用

(2)重启停止的作业

当要以后台模式重启一个作业时可用bg命令加上作业号。

16.5调整谦让度

调度优先级是内核分配给进程的CPU时间。

调度优先级是个整数值,从-20(最高优先级)到+19(最低优先级)。默认情况下,bash shell以优先级0来启动所有进程。

1. nice 命令

当想要改变shell脚本的优先级时,不管是降低它的优先级,还是给予它更高的优先级都可以使用nice命令。

2. renice 命令

当想要改变系统上已运行命令的优先级,可以使用renice命令。

renice 命令的使用条件:
(1)只能对属于你的进程执行renice
(2)只能通过renice降低进程的优先级
(3)root用户可以通过renice来任意调整进程的优先级

16.6定时运行作业

1. 用 at 命令来计划执行作业

at命令允许指定Linux系统何时运行脚本。


(1)at命令的格式:at [-f filename] time

其中-f参数来指定用于读取命令的文件名;time参数指定了Linux系统何时运行该作业。

at命令能识别多种不同的时间格式:
  1. 标准的小时和分钟格式:19:59
  2. AM/PM指示符:7:59PM
  3. 特定可命名时间,比如now、noon等
  4. 标准日期格式
  5. 文本日期:Jul 4或Dec 25
  6. 指定时间增量:例如明天10:15 PM

(2)获取作业的输出

(3)列出等待的作业


atq命令可以查看系统中有哪些作业在等待。

(4)删除作业


使用atq命令后知道了哪些作业在作业队列中等待,可以使用atrm命令+作业号来删除等待中的作业。

2.安排需要定期执行的脚本

(1)cron时间表

cron时间表采用一种特别的格式来指定作业何时运行。

格式为:min hour dayofmonth month dayofweek command

例如:想在每天的10:15运行一个命令,则cron时间表条目:15 10 * command

(2)构建cron时间表

可以使用crontab -l命令来列出已有的cron时间表。
默认情况下,用户的cron时间表文件并不存在,用-e选项为cron时间表添加条目。

(3)浏览cron目录

(4)anacron程序

如果某个作业在cron时间表中安排运行的时间已到,但这时候Linux系统处于关机状态,那么这个作业就不会被运行。当系统开机时,cron程序不会再去运行那些错过的作业。

这时可以使用到anacron程序,该程序在Linux系统重启后会自动运行原定在关机期间运行的作业。但是anacron程序只会处理位于cron目录的程序,并用时间戳来决定作业是否在正确的计划间隔内运行了。

基本格式:period delay identifier command

其中period条目定义了作业多久运行一次,以天为单位;delay条目会指定系统启动后anacron程序需要等待多少分钟再开始运行错过的脚本;identifier条目是一种特别的非空字符串,用于唯一标识日志消息和错误邮件中的作业;command条目包含了run-parts程序和一个cron脚本目录名。

需要注意的是:anacron程序不会处理执行时间需求小于一天的脚本。
暂时没有记录
评论通过审核后显示。