10.1、Linux信号
10.1.1 信号介绍
默认情况下,bash shell 会忽略它接收到的任何SIGQUIT(3)和SIGTERM(15)信号,以防止交互的shell意外终止,但是bash shell
处理它收到的任何SIGHUP(1)和SIGINT(2)信号。
如果收到SIGHUP信号,bash shell会退出,并在退出前,向自身所启动的任意进程发送SIGHUP信号。
如果收到SIGINT信号,bash shell会立刻中断,Linux内核停止向shell提供CPU上的处理时间,bash shell会将SIGINT信号通知由其启动的任意进程。
信号 | 值 | 描述 |
1 | SIGHUP | 挂起进程 |
2 | SIGINT | 中断进程 |
3 | SIGQUIT | 停止进程 |
9 | SIGKILL | 无条件终止进程 |
15 | SIGTERM | 如果可能的话终止进程 |
17 | SIGSTOP | 无条件停止,但不终止进程 |
18 | SIGTSTP | 停止或者暂停进程,但不终止 |
19 | SIGCONT | 重新启动停止的进程 |
10.1.2 生成信号
快捷键方式:
SIGINT:Ctrl+C组合键,发送给当前正在shell中运行的任意进程。不会生成任何输出,只会终止当前运行的进程,但可能不是立即终止。
SIGTSTP:Ctrl+Z组合键,发送给当前正在shell中运行的任意进程。停止的进程与终止的进程不同,停止进程后程序仍然留在内存中,能够从停止的地方继续运行。
10.1.3 捕获信号
trap commands signals,其中signals表示所捕获的信号,commands表示捕获singnals后进程的处理方式。
trap commands EXIT,捕获脚本退出,当shell脚本退出时或者收到导致脚本退出的信号时执行commands。
trap - EXIT,移除捕获,可以恢复正常行为的信号列表。
10.2 以后台模式运行脚本
10.2.1 后台运行模式
在命令后加上一个&符号。
例如 ./signal.sh &
10.2.2 不使用控制台运行脚本
nohup ./signal.sh &
10.3 作业控制
10.3.1 查看作业
jobs查看shell处理的当前作业,其中带有加号的作业被视为默认作业,如果命令行没有指定作业编号,则它应该是任何作业控制命令引用的作业。
带有减号的作业是在处理完当前默认作业之后将成为默认作业的作业。在任何一个时间点,只能有一个带有加号的作业,也只能有一个带有减号的作业。
参数 | 描述 |
-l | 列出进程的PID和作业编号 |
-n | 仅列出自上次shell通知以来已经更改了状态的作业 |
-p | 仅列出作业的PID |
-r | 仅列出运行的作业 |
-s | 仅列出停止的作业 |
10.3.2 重新启动停止的作业
bg 作业编号。以后台模式重新启动停止的作业。
fg 作业编号。以前台模式重新启动停止的作业。
10.4 修改进程优先级
Linux优先级从-20(最高优先级)到+20(最低优先级),默认情况下,bash shell启动所有优先级为0的进程。
10.4.1 nice命令
nice命令可以在启动时设置优先级。不允许普通系统用户增加命令的优先级,这是一个安全特性,防止用户以高优先级启动所有的命令。
nice -n number commands,其中number表示优先级,commands表示要执行的命令或者脚本。
10.4.2 renice命令
renice更改运行中命令的优先级。
renice number -p pid,其中number表示优先级,pid表示需要修改优先级的进程ID
10.5 设置运行时间限制
10.5.1 at命令
at命令设置脚本运行时间。at命令将一个作业提交到一个队列,并指示shell在何时运行该作业。另一个命令atd以后台模式运行,60秒查询一次作业队列以运行作业。atd命令检查
特殊目录(通常是/var/spool/at),以便运行使用at命令提交的作业。
at [-f filename] time,默认情况下at命令将STDIN的输入提交到队列,可以使用-f参数指定用于读取命令的文件名。time参数指定希望运行的时间。
还有-q参数,可用于设置作业的优先级队列,共有a-z共计26个队列,默认提交到最高优先级队列a中。
10.5.2 列出排队的作业
atq,查看系统中排队的作业
10.5.3 移除作业
atrm number,其中number表示作业的编号
10.5.4 batch命令
batch [-f filename] [time] 检查当前的平均负载水平,如果负载低于0.8,将运行任何在作业队列中等待的作业。
10.5.5 cron调度定期脚本
cron命令
10.6 开机加载脚本
10.6.1启动过程
打开Linux系统之后,Linux内核加载到内存并运行。最先运行的是init程序(通常位于/sbin/init),内核总是为其分配PID 1。然后init进程负责启动其他进程。
在启动过程中,init程序读取/etc/inittab文件,inittab文件列出了init程序以不同的运行级别启动的脚本。
Linux运行级别
大部分Linux发行版以运行级别3启动所有服务器软件,该级别允许多个用户登录系统。
Linux系统通过rc脚本确定以哪种运行级别启动哪些程序。rc脚本确定当前系统的运行级别并在该级别上运行相应的脚本。
Linux系统使用启动脚本启动应用程序。启动脚本是启动应用程序的shell脚本,为运行的程序提供必要的环境变量。
运行级别 | 描述 |
0 | 停止 |
1 | 单用户模式 |
2 | 多用户模式,通常没有网络 |
3 | 完全多用户模式,有网络 |
4 | 未使用 |
5 | 多用户模式,有网络和图形X Window对话 |
6 | 重启 |
启动脚本一般放在/etc/init.d目录,或者/etc/init.d/rc.d目录,或者/etc/rc.d目录
10.6.2 自动启动脚本
以下两个文件一般包含在主目录中
.bash_profile文件在新用户登录而运行的shell时自动运行。
.bashrc文件在每次启动新shell时(包括新用户登录时)运行。
如果希望为系统的每个用户运行脚本,可以使用大部分Linux都提供的/etc/bashrc文件。