加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

linux – shell脚本中的信号处理

发布时间:2020-12-14 01:19:25 所属栏目:Linux 来源:网络整理
导读:以下是我有的 shell脚本(myscript.sh): #!/bin/bashsleep 500 Aprogram arg1 arg2 # Aprogram is a program which runs for an hour.echo "done" 我在一个终端启动了这个,并从另一个终端发出了’kill -INT 12345′. 12345是myscript.sh的pid. 过了一会儿,我
以下是我有的 shell脚本(myscript.sh):

#!/bin/bash

sleep 500 &

Aprogram arg1 arg2  # Aprogram is a program which runs for an hour.

echo "done"

我在一个终端启动了这个,并从另一个终端发出了’kill -INT 12345′. 12345是myscript.sh的pid.

过了一会儿,我可以看到myscript.sh和Aprogram都已经死了.然而’睡觉500&’还在运行

任何人都可以解释为什么这种行为?

另外,当我向’myscript.sh’发出SIGINT信号时究竟发生了什么?为什么’Aprogram’被杀,为什么不’睡觉’?信号INT如何传输到它的子进程?

解决方法

After a while I can see that both myscript.sh and Aprogram have been dead. However ‘sleep 500 &’ is still running.

一旦Aprogram完成,myscript.sh就会打印出“完成”,并且也会完成. sleep 500以PID 1作为父进程进行处理.这就对了.

Can anyone explain why is this behavior?

当myscript.sh得到它时,SIGINT不会传递给Aprogram.使用strace确保Aprogram不会收到信号.

Also,when I issued SIGINT signal to the ‘myscript.sh’ what exactly is happening?

我首先想到的情况就像当用户按下Ctrl-C并读取这个http://www.cons.org/cracauer/sigint.html时那样.但情况并非完全相同.在你的情况下,shell接收到SIGINT但子进程没有.然而,贝壳在那个时刻有一个儿童过程,它没有做任何事情,并一直在等孩子.在将SIGINT发送到等待子进程的shell脚本之后,这是我的计算机上的strace输出:

>strace -p 30484
Process 30484 attached - interrupt to quit
wait4(-1,0x7fffc0cd9abc,NULL)      = ? ERESTARTSYS (To be restarted)
--- SIGINT (Interrupt) @ 0 (0) ---
rt_sigreturn(0x2)                       = -1 EINTR (Interrupted system call)
wait4(-1,

Why is ‘Aprogram’ getting killed and why not ‘sleep’ ? How is the signal INT getting transmitted to it’s child processes?

据我所知,像你的Aprogram这样的儿童计划并没有被杀死.它没有收到SIGINT并正常完成.一旦完成你的shell脚本也完成了.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读