用户体验度好的网站,网络营销的收获与体会,微网站模板多少钱,100%提现赚钱游戏一、Linux系统信号
1、常见的系统信号 常见的Linux系统信号 信号值描述1SIGHUP挂起#xff08;hang up#xff09;进程2SIGINT中断进#xff08;interrupt#xff09;程3SIGQUIT停止#xff08;stop#xff09;进程9SIGKILL无条件终止#xff08;terminate#xff09;…一、Linux系统信号
1、常见的系统信号
常见的Linux系统信号 信号值描述1SIGHUP挂起hang up进程2SIGINT中断进interrupt程3SIGQUIT停止stop进程9SIGKILL无条件终止terminate进程15SIGTERM尽可能终止进程18SIGCONT继续运行停止的进程19SIGSTOP无条件停止但不终止进程20SIGTSTP停止或暂停pause但不终止进程
2、两种基本的信号
中断进程CtrlC
CtrlC生成的是SIGINT信号它会将其发送给当前在shell中运行的所有进程。 暂停进程CtrlZ
CtrlZ生成的是SIGTSTP信号停止shell中运行的任何进程。
停止stopping进程和终止terminating进程不同前者是让程序继续驻留在内存中但依然能从上次停止的位置继续运行。 方括号里的数字 1 是shell分配的作业号。 shell将运行的各个进程称为作业并且为作业在当前shell内分配了唯一的作业号。作业号从1开始接着是2依次递增。 如果shell会话中存在一个已经停止的作业那么在退出shell时bash会给出提醒。 此时只需要再输入一遍exit命令即可shell就会退出并终止已停止的作业。 也可以用kill命令发送SIGKILL(9)信号将其终止。 ps命令查看已停止的作业。 3、捕获信号trap命令
trap命令可以让shell脚本需要侦测并拦截的Linux信号如果脚本收到了trap命令中列出的信号则该信号不再由shell处理而是由本地处理。 格式 trap commands signals commands列出想要shell执行的命令 signals列出想要捕获的信号多个信号之间用空格分隔。指定信号时可用信号的值或信号名。 #!/bin/bashtrap echo 捕获到了CtrlC信号 SIGINTecho 测试脚本count1
while [ $count -le 5 ]
doecho 这是第$count次循环sleep 1count$[ $count 1 ]
doneecho 测试脚本结束
exit
此shell脚本每次侦测到CtrlC信号SIGINT时trap命令都会打印出一条“捕获”信息。通过此可以阻止用户通过CtrlC停止脚本。 如果shell脚本中的命令被信号中断使用带有指定命令的trap未必能让被中断的命令继续执行。为了保证脚本中的关键操作不被打断可以使用带有空操作命令的trap以及要捕获的信号列表。 如trap SIGINT 此形式的trap命令可以让shell脚本完全忽略SIGINT信号继续执行重要工作。 捕获shell脚本在退出时的信号
在trap命令后加上EXIT信号即可。
#!/bin/bashtrap echo 此脚本已执行完马上退出…… EXITecho 测试脚本count1
while [ $count -le 5 ]
doecho 这是第$count次循环sleep 1count$[ $count 1 ]
doneecho 测试脚本结束
exit
正常退出 提前退出 修改或移除信号捕获
要想在shell脚本中不同位置进行不同的信号捕获处理只需要重新使用带有新选项的trap命令即可。
#!/bin/bashtrap echo 捕获到CtrlC信号 SIGINTecho 第1项测试count1
while [ $count -le 5 ]
doecho 这是第$count次循环sleep 1count$[ $count 1 ]
donetrap echo 捕获到CtrlZ信号 20echo 第2项测试count1
while [ $count -le 4 ]
doecho 这是第$count次循环sleep 1count$[ $count 1 ]
doneexit 查看被捕获的信号
在交互式shell会话中使用 trap -p 查看被捕获的信号。如果什么都没显示说明shell会话按照默认方式处理了信号。 移除已设置好的信号捕获 在trap命令与希望恢复默认行为的信号列表之间加上两个连字符如 trap -- SIGINT也可以在trap命令后使用单连字符来恢复信号的默认行为如 trap - SIGINT
#!/bin/bashtrap echo 捕获到CtrlC信号 SIGINTecho 第1项测试count1
while [ $count -le 5 ]
doecho 这是第$count次循环sleep 1count$[ $count 1 ]
donetrap -- SIGINT # 等同于trap - SIGINT
echo 移除信号捕获。echo 第2项测试count1
while [ $count -le 4 ]
doecho 这是第$count次循环sleep 1count$[ $count 1 ]
doneexit
在移除信号捕获后一旦执行CtrlC就会立即停止执行脚本。 二、后台运行脚本 使用 ps -e 命令查看系统后台运行的进程。
在后台运行模式中进程运行时不和终端会话的STDIN、STDOUT、STDERR关联。 1、后台运行脚本
在脚本名后面加上 即可它会将脚本与当前shell分离开并将脚本作为一个独立的后台进程运行。 方括号里的数字 1 是shell分配给后台进程的作业号数字 109747 是Linux系统为进程分配的进程IDPID。Linux系统中的每个进程都必须有唯一的PID。 注如下所示当后台进程运行时它仍然会使用终端显示器来显示STDOUT和STDERR的消息。 如下所示后台运行时可以执行其它命令 三、在非控制台下运行脚本 退出终端会话后仍然想让脚本一直在后台运行直到结束。可以使用 nohup 命令实现。
nohup命令可以阻断发给特定进程的SIGHUP信号当退出终端会话时便可以避免进程退出。 格式nohup command 当使用nohup命令时如果关闭终端会话shell脚本会忽略其发送的SIGHUP信号。由于nohup命令会解除终端与进程之间的关联因此进程不再同STDOUT和STDERR绑定在一起。为了保存该命令产生的输出nohup命令会自动将STDOUT和STDERR产生的消息重定向到 nohup.out 的文件中。nohup.out文件一般在当前工作目录下不然就在$HOME目录下 如果使用nohup运行了另一个命令则该命令的输出会被追加到已有的nohup.out文件中。
四、作业控制 kill命令可以杀死作业如果要重启已停止的进程需要向其发送SIGCONT信号。
作业控制包括启动、停止、杀死及恢复。
1、查看作业jobs命令
jobs 命令允许用户查看shell当前正在处理的作业。
#!/bin/bashecho 脚本的PID$$ # $$是一个特殊变量它表示shell进程的进程IDPIDcount1
while [ $count -le 6 ]
doecho 这是第$count次循环。sleep 8count$[ $count 1 ]
doneecho 脚本结束……
exit 运行脚本后使用 CtrlZ 组合键停止脚本。 然后在后台又运行一次此脚本并将输出重定向到文件 test1.out 中。 使用 jobs 命令查看分配给shell的作业。
如下图所示加号 表示默认作业。如果作业控制命令没有指定作业号则引用该默认作业。
减号 - 表示在默认作业结束后成为下一个默认作业。 任何时候不管shell中运行着多少作业带加号和减号的作业都有且只能有一个。 jobs -l 查看作业的进程号。 jobs命令选项 -l列出进程的PID以及作业号-n只列出上次shell发出通知后状态发生改变的作业-p只列出作业的PID-r只列出运行中的作业-s只列出已停止的作业
删除已停止的作业 2、重启已停止的作业bg命令
可以将已停止的作业作为后台进程或前台进程重启注前台进程重启后会接管当前正在使用的终端
后台模式重启bg命令
注当作业被转入后台模式后并不会显示其PID。
如果存在多个作业需要在bg命令后加上作业号如 bg 2 前台模式重启fg命令
如下所示因为作业是在前台运行的所以直到该作业完成后命令行界面的提示符才会出现。