(十六) 信号

十六 信号、定时及周期性运行脚本

到目前为止,我们运行脚本是通过:实时模式在命令行界面运行,除此之外,还有很多种运行脚本方式。另外还有一些选项用于控制脚本,这些控制方法包括:向脚本发送信号、修改脚本优先级、在脚本运行时切换到运行模式;

Linux最常见的系统信号:

(十六) 信号_第1张图片

默认情况下,bash shell会忽略任何收到的SIGQUIT和SIGTERM信号(正因这样,交互式shell才不会被意外终止)

1.1 处理信号

Linux利用信号与系统中的进程进行通信,利用这些信号来停止、启动、终止进程;

1.1.1 生成信号

bash shell允许用键盘上的组合键生成两种基本的信号;

  1. 中断进程

ctrl+C生成SIGINT信号,并将其发送给当前在shell中运行的所有进程;

  1. 暂停进程

在进程运行期间暂停进程,而无需中止它;

ctrl+z生成一个SIFTSTP信号,停止shell中运行的任何进程;

如果shell会话中已有一个停止的进程,退出shell(exit)时,bash会提醒,如果你仍想退出,只需要在输出一次exit命令,shell就会退出并且终止停止进程;或者如果你知道停止进程PID,也可以通过kill命令来发送一个SIGKILL信号来终止它;如:

		kill -9 进程id

-9:表示强迫进程立即终止

该种方式在终止作业后,不会有任何回应,但是在下一次输入命令回车是,会显示有一条作业被终止了的消息;

停止进程与终止进程区别:
停止进程会让程序继续保留在内存中,并能从上次停止的位置继续运行;

***作业:***shell将shell中运行的每个进程称为作业,并为每个作业分配一个唯一的作业号;第一个作业作业号为1,以此类推…

1.1.2 捕获信号

trap命令:运行你来指定shell脚本要监看并从shell中拦截的Linux信号;

格式:

		trap 命令   信号值1/信号名  信号值2/信号名 ....

捕获信号,并执行指定的命令;

1.1.3 修改、移除捕获

修改捕获:只需要在脚本不同位置进行不同的捕获,只需使用带有新选项的trap命令;
如:

	trap echo“起始捕获处理” SIGINT
	
		
	while 	...


		done

	trap echo "x修改后的信号捕获处理" SINGINT

	while	

		...


		done

移除捕获:移除捕获后,如果再次收到该信号,将恢复该信号原始的作用;比如:SIGINT信号,捕获后执行echo命令,当我们移除捕获后,再一次收到该信号,就会按照该信号原始的作用即终止进程;

(十六) 信号_第2张图片

语法:

	trap -- 信号值/信号名

(十六) 信号_第3张图片

1.1.4 捕获脚本退出

前面我们说了在脚本中捕获信号,也可以在脚本退出时进行捕获,只需要在trap命令后加上EXIT信号

		#!/bin/bash

		trap echo "脚本退出了" EXIT
			
		count=1
		while [ $count -le 10 ]

			do
				sleep 1

				count=$[ $count + 1 ]

			done

在脚本运行到正常的退出位置或者我们按下ctrl+c生成SIGINT信号是脚本提前退出,捕获就会触发;

1.2 后台模式运行脚本

有时候直接在命令行界面运行shell脚本可能不方便比如:脚本执行时间长,而你不想一直在命令行界面等着,这时你就没法在终端界面做其他的事;这时后台进程就出现了:在后台模式下,进程运行时会使用显示器来显示标准输出、标准错误消息,避免后台标准输出、标注错误的的干扰,一般对后台进程标准输出、错误进行重定向;

只需要在脚本运行命令后添加一个&符号如:

		./test &

他会将命令与bash shell分离开来,将命令作为系统中一个独立的后台进程运行;即会在后台运行该脚本显示的一行:

		[1]  3333

方括号的数字:作业好

后面的数字:进程id

一旦显示了这些内容,命令行提示就出现了,你可以输入新的命令;当后台进程结束后,会显示:

	[1]  done  ./test

表明作业已经完成;

注意:当后台进程运行时,它仍然会使用终端显示器来显示STDOUT、STDERR信息;你可以将脚本的STDOUT、STDERR重定向;如:

	./test > out.txt &

每一个后台进程都会和终端会话(pt/0)终端联系在一起,如果终端会话退出,那么后台进程也会随之退出;

如果你想后台进程,在退出控制台后,仍然可以运行,就看接下来的:

1.2.1 在非控制台下运行脚本

nohup命令:运行了另外一个命令来阻止所有发送给该进程的SIGHUP信号;这会在退出中断会话是阻止进程退出;

语法格式:

	nohup  ./test &

关闭会话,脚本会忽略中断发送过来的SIGHUP信号;

由于该命令会解除终端与进程的关联,进程也就不再同STDOUT、STDERR关联到一起;会自动将他们的消息重定向到一个名为nohup.out的文件中;

1.3 作业控制

启动、停止、终止、恢复作业的这些功能统称作业控制;

1.3.1 查看作业

jobs命令:查看分配个shell的作业;

-l:查看作业PID

(十六) 信号_第4张图片

输出中,带加号的:表示默认作业,作业控制命令针对的都是默认作业;带减号的表示:当前的默认作业处理完后,带减号的作业将成为下一个默认作业;任何时候,都只有一个带加号、带减号的作业,不管shell中运行着多少正在运行的作业;

1.3.2 重启作业

将已停止的作业作为后台进程、前台进程重启;

以后台模式重启一个作业:

(十六) 信号_第5张图片

语法格式:

		bg 作业号

bg命令是以后台模式启动的默认作业,如果有多个作业,要启动指定作业需要在bg命令后添加作业号;

以前台模式启动作业:

大同小异,不再赘述

语法格式:

	fg  作业号

1.4 调度优先级

Linux是多任务系统,调度优先级:是内核分配给进程的CPU时间;由shell启动的所有进程调度优先级默认都是相同的默认为0;

调度优先级是个整数,-20(最高优先级)-19(最低优先级)

nice命令:允许设置命令启动时的调度优先级,要让命令以更低的优先级运行,通过-n 选项指定如:

		nice -n 10 ./test >test.out &

注意:如果要提高命令调度优先级,如果是普通用户,nice命令会阻止;

有时候可能,你想改变已经运行命令的调度优先级,通过renice命令,允许你指定运行进程的PID来改变它的优先级:如:

语法格式:

	renice -n 10(调度优先级) -p PID(进程号)

注意和nice命令一样同样有些限制:

  1. 普通用户只能降低优先级,如果要提高优先级必须切换到root用户
  2. 只能对属于你的进程执行renice

1.5 定时、周期性运行作业

比如:预设某个时间点运行脚本,Linux提供了多个在预设时间点运行脚本的方法

1.5.1 at命令

at命令会将作业提交到队列中,指定shell何时运行该作业;at的守护进程atd会以后台模式运行,检查作业队列来运行作业(默认情况下,没60秒会检查一次系统上一个特殊的目录/var/spool/at来获取at提交的作业,有作业会检查作业运行时间,如果运行时间与当前时间匹配,atd守护进程就会运行该作业);大多数Linux发行版本会在启动时运行此守护进程;‘

作业队列存在26种不同的优先级,通常用a-z和A-Z来指代,队列的字母排序越高,作业运行的优先级就越低(更高的nice值);at命令提交到a作业队列;如果要想以更高的优先级运行作业,用-q参数指定不同的队列字母;

语法格式:

	at  [ -f 文件名] 时间

默认情况下,at将STDIN的输入(即键盘)放入队列,也可以通过-f选项指定用于读取命令的(脚本文件)文件名;

这儿关于时间:如果指定的时间已经错过了,会在第二天这个时间点运行;

关于时间格式:

  1. 标准的小时和分钟格式:10:15
  2. AM/PM指示符,10:15AM
  3. 特定可命名时间,比如:now、noon、midnight、teatime(4PM)

你也可以指定时间增量:

  1. 当前时间+25min
  2. 明天10:15PM
  3. 10:15+7天

除此之外,还可以指定时期:

  1. 标准时期格式:MMDDYY、MM/DD/YY、DD.MM.YY
  2. 文本时期:如Jul 4,加不加年份均可

(十六) 信号_第6张图片

at命令使用e-mail作为命令输出,at命令利用sendmail应用程序来发送文件,如果为未安装该应用,将得不到任何输出;因此在使用at命令是,可以在脚本中对STDOUT、STDERR重定向;

  • 查询系统中等待的作业:

atq命令

  • 删除作业:

根据作业号,删除指定作业

命令:

	atrm 作业号

1.5.2 cron表

周期性运行作业

corn时间表格式:

	分钟 小时 一个月中第几天 月份 一周中第几天 命令列表

运行你用特定值、取值范围如(1-5)、通配符(*)来指定条目;

一周中第几天:可以用数字表示0(星期天)-6(星期六)或三个字符的文本值(mon、tue、wed、thu、fri、sat、sun)表示;

注意:命令列表必须指定要运行的命令或脚本的全路径名;

atq命令

  • 删除作业:

根据作业号,删除指定作业

命令:

	atrm 作业号

1.5.2 cron表

周期性运行作业

corn时间表格式:

	分钟 小时 一个月中第几天 月份 一周中第几天 命令列表

运行你用特定值、取值范围如(1-5)、通配符(*)来指定条目;

一周中第几天:可以用数字表示0(星期天)-6(星期六)或三个字符的文本值(mon、tue、wed、thu、fri、sat、sun)表示;

注意:命令列表必须指定要运行的命令或脚本的全路径名;

你可能感兴趣的:(Linux基础与Shell脚本)