专栏首页葫芦linux 控制脚本-处理信号~作业控制

linux 控制脚本-处理信号~作业控制

1               SIGHUP      挂起进程
2                SIGINT      终止进程
3               SIGQUIT     停止进程
9               SIGKILL       无条件终止进程
15             SIGTERM    可能的话终止进程
17             SIGSTOP     无条件停止进程,但不是终止进程
18             SIGSTP       停止或暂停进程,但不终止进程
19              SIGCONT    继续运行停止的进程
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CTRL+C    终止进程组合键 SIGINT
CTRL+Z     停止进程组合键 SIGSTP
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
捕捉信号
trap 
vt.诱骗;使受限制;困住;使(水与气体等)分离
n.圈套;(对付人的)计谋;(练习射击用的)抛靶器;(捕捉动物的)夹子
vi.设陷阱;装捕捉机;设圈套
trap command signals
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[root@aoi ~]# cat l
#!/bin/bash
trap "echo ' Sorry! I have ctrl-C'"  SIGINT SIGTERM
echo this is a test program
count=1
while [ $count -le 10 ]
do
echo "Loop #$count"
sleep 5
count=$[ $count + 1 ]
done
echo this is the end of the test program
[root@aoi ~]# sh l
this is a test program
Loop #1
Loop #2
^C Sorry! I have ctrl-C
Loop #3
^C Sorry! I have ctrl-C
Loop #4
^C Sorry! I have ctrl-C
Loop #5
^C Sorry! I have ctrl-C
Loop #6
Loop #7
Loop #8
^C Sorry! I have ctrl-C
Loop #9
^C Sorry! I have ctrl-C
Loop #10
^C Sorry! I have ctrl-C
this is the end of the test program
每次使用CTRL+C组合键,脚本都会执行trap命令中指定的echo语句,而不是忽略此信号并允许shell停止该脚本。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
捕捉脚本的退出
[root@aoi ~]# cat k
#!/bin/bash
trap " echo 'bye bye'" exit
count=1
while [ $count -le 5 ]
do
echo "Loop #$count"
sleep 3
count=$[ $count+1 ]
done
[root@aoi ~]# sh k
Loop #1
^Cbye bye

[root@aoi ~]# sh k
Loop #1
Loop #2
Loop #3
Loop #4
Loop #5
bye bye
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
移除捕捉


[root@aoi ~]# cat i
#!/bin/bash
trap "echo byebye" exit
count=1
while [ $count -le 5 ]
do
echo "Loop #$count"
sleep 2
count=$[ $count+1 ]
done
trap - EXIT
echo "I just removed the trap"
[root@aoi ~]# sh i
Loop #1
Loop #2
Loop #3
Loop #4
Loop #5
I just removed the trap

[root@aoi ~]# sh i
Loop #1
^Cbyebye
一旦信号捕捉被移除了,脚本就会忽略该信号。但是如果捕捉被移除前收到信号脚本就会在trap命令中处理它
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
要在命令行界面以后台模式运行shell脚本,只要在命令后加个&就可以,可以在命令行提示符下同时启动任意多个后台作业
[root@aoi ~]# sh i &
[1] 1568
[root@aoi ~]# Loop #1
Loop #2
Loop #3
wangzi
bash: wangzi: command not found
[root@aoi ~]# Loop #4
Loop #5
I just removed the trap
wafiofd
bash: wafiofd: command not found
[1]+  Done                    sh i
[root@aoi ~]#
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
退出终端时,捆绑在此终端的后台进程也会推出。
nohup命令运行了另一个命令来阻断所有发给该进程的SIGHUP
[root@aoi ~]# nohup sh i &
[1] 1596
[root@aoi ~]# nohup: ignoring input and appending output to `nohup.out'
cat nohup.out
Loop #1
Loop #2
Loop #3
Loop #4
Loop #5
I just removed the trap
[1]+  Done                    nohup sh i
由于nohup命令会从终端解除进程的关联,进程会丢掉到 STDOUT和STDERR的链接。为了保存命令产生的输出,nohup命令会自动将STDOUT和STDERR的消息重定向到一个nohup.out的文件中。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
作业控制
启动,停止,无条件终止,以及恢复作业的这些功能统称为作业控制。
[root@aoi ~]# cat ss
#!/bin/bash
echo "thi is a test program $$"
count=1
while [ $count -le 10 ]
do
echo "Loop #$count"
sleep 5
count=$[ $count+1 ]
done
echo this is the end of test program
[root@aoi ~]# sh ss
thi is a test program 1608
Loop #1
Loop #2
^Z
[1]+  Stopped                 sh ss
[root@aoi ~]#  jobs
[1]+  Stopped                 sh ss
[root@aoi ~]# sh ss > sss &
[2] 1611
[root@aoi ~]# jobs
[1]+  Stopped                 sh ss
[2]-  Running                 sh ss > sss &

$$用来显示linux分配给该脚本的PID,然后进入循环,每次迭代都休眠5秒。
jobs命令允许查看shell当前正在处理的作业。
重启停止的作业
bg 2         2是作业号 bg是以后台形式重启,此时还可以输入其他命令。
fg 2          是前台模式重启,此时命令行提示符不会出现,知道该作业完成
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-20最高优先级  19最低优先级
nice命令允许在启动时调整一个命令的调度优先级。
nice -n 10 sh ss
[root@aoi ~]# nice -n 10 sh ss >ww &
[4] 1656
[root@aoi ~]# ps al
F   UID   PID  PPID PRI  NI    VSZ   RSS WCHAN  STAT TTY        TIME COMMAND
4     0  1294     1  20   0   4116   572 n_tty_ Ss+  tty2       0:00 /sbin/ming

4     0  1296     1  20   0   4116   572 n_tty_ Ss+  tty3       0:00 /sbin/ming

4     0  1298     1  20   0   4116   568 n_tty_ Ss+  tty4       0:00 /sbin/ming

4     0  1300     1  20   0   4116   568 n_tty_ Ss+  tty5       0:00 /sbin/ming

4     0  1308     1  20   0   4116   568 n_tty_ Ss+  tty6       0:00 /sbin/ming

4     0  1382  1292  20   0 108352  1928 n_tty_ Ss+  tty1       0:00 -bash
4     0  1402  1398  20   0 108428  1908 wait   Ss   pts/0      0:00 -bash
0     0  1416  1402  20   0 145384  1560 wait   S    pts/0      0:00 su root
4     0  1417  1416  20   0 110524  2052 wait   S    pts/0      0:00 bash
0     0  1608  1417  20   0 108176  1364 signal T    pts/0      0:00 sh ss
0     0  1610  1608  20   0 100960   592 signal T    pts/0      0:00 sleep 5
4     0  1654  1417  30  10 108176  1360 wait   SN   pts/0      0:00 sh ss
0     0  1656  1417  30  10 108176  1360 wait   SN   pts/0      0:00 sh ss
0     0  1661  1656  30  10 100960   596 hrtime SN   pts/0      0:00 sleep 5
0     0  1662  1654  30  10 100960   596 hrtime SN   pts/0      0:00 sleep 5
4     0  1663  1417  20   0 108152   964 -      R+   pts/0      0:00 ps al

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
renice 命令可以改变系统上已经运行的命令优先级。
你只能对属于你的进程执行renice命令
你只能通过renice命令降低进程的优先级
root用户可以通过renice调整任何进程的优先级

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • linux SED替换指定两字符行之间的内容

    葫芦
  • linux 将现有分区转换为lvm2分区并扩展放大容量

    此次主要进行了/dev/sdb从默认系统转换到lvm系统模式。期间备份恢复数据,不同磁盘下的不同分区创建pv加入同一vg组,放大lv容量,从vg中删除单个pv,...

    葫芦
  • python 面向对象基础 继承和多态

    在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类、父...

    葫芦
  • 面试官,你再问我滑动窗口问题试试?我有解题模板,不怕!

    滑动窗口类问题是面试当中的 高频题 ,问题本身其实并不复杂,但是实现起来细节思考非常的多,想着想着可能因为变量变化,指针移动等等问题,导致程序反复删来改去,有思...

    五分钟学算法
  • yii框架使用分页的方法分析

    在Yii中,分页时会用这个类CDBcritria进行数据库查询很重要,这样分页很简单。

    砸漏
  • 聊聊chronos的addMessage

    DDMQ/carrera-chronos/src/main/java/com/xiaojukeji/chronos/services/MqPullService...

    codecraft
  • 聊聊chronos的addMessage

    DDMQ/carrera-chronos/src/main/java/com/xiaojukeji/chronos/services/MqPullService...

    codecraft
  • CentOS6.X 安装mycli

    最近发现在centos7上很容易就安装成功mycli了。但是到centos上同样的方法虽然按照提示成功了,执行mycli却报错。后来怀疑是python2.6版本...

    二狗不要跑
  • Numpy 改变数组维度的几种方法

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    小二哥
  • 非常重要 却被世人忽略的Java基础知识 原

    本文将一点一滴的累计记录Java中的一些细节知识。不只是加以说明,而是所有的细节都找到来源,以官方文档、知名社区的介绍为主。

    随风溜达的向日葵

扫码关注云+社区

领取腾讯云代金券