什么是'kill%1`和`kill $ pid`之间的区别?

时间:2015-12-03 05:29:40

标签: shell process jobs kill

最近,我正在编写一个用于从文件启动作业的脚本,承担以下工作:

while true; do nc -l 8188 < index.html; done &

当我在交互式shell中运行它时,我得到了一个像这样的pid回声:

[1] 31095

pstree(1)输出:

bash(31095,31095)---- nc(31096,31095)

while子句和nc(1)命令都在同一个进程组中。

  1. 当我输入kill 30995时,while子句按预期终止,但nc(1)已离开。我想kill语句只是调用kill(2)系统调用。
  2. 当我输入kill %1时,整个31095进程组被终止。我可以在内部调用killpg(2)
  3. 当我输入&#39; fg&#39;将背景置于前面,然后键入“Ctrl-C&#39;发送中断信号,然后while子句和nc(1)命令都消失了,我认为这是因为INT信号被发送到进程组,如项目中所述2。
  4. 我也下载了bash-4.3-beta源代码,但源代码太多了,我找不到相关的东西。有人可以帮我清楚一点吗?

    但是,当我将上述后台工作放在脚本中时,kill %1无法正常工作,因为我已经猜到了。这是脚本(kill2.sh):

    while true; do
        nc -l 8888 < $0
    done &
    
    trap 'kill %1' INT TERM
    wait || wait
    

    我是通过bash kill2.sh运行,然后是pstree -pg 31835结果:

    bash(31835, 31835) -- bash(31836, 31835) -- nc(31837, 31835)
    

    当我输入ctrl-c时,31835和31836被杀,但是nc被遗弃了。所以我想知道脚本上下文中是否有kill %1的特例?

1 个答案:

答案 0 :(得分:0)

  
  1. 当我输入kill 30995时,while   子句按预期终止,但nc(1)已离开。一世   猜测kill语句只是调用kill(2)系统   呼叫。
  2. 当我输入kill %1时,整个31095   进程组被杀。我可以调用的东西   内部killpg(2)
  3. 当我输入“fg”时   前面的背景,然后键入'Ctrl-C'发送中断   信号,然后是while子句和。{   nc(1)命令消失了,我认为那是因为   INT信号已发送到进程组,如中所述   第2项。
  1. 那是真的。
  2. 它可能会调用killpg(),但至少在Linux上,killpg()被实现为调用kill(-pgrp, sig)的库函数。
  3. 如果终端是前台进程组的控制终端,则中断字符将导致SIGINT被发送到该组。
  4.   

    但是,当我将上述后台工作放在脚本中时,kill %1无法正常工作,因为我已经猜到了。 ......所以我想知道是否   在脚本上下文中有kill %1的特殊情况吗?

    jobspec %1仅在启用作业控制时可用。对于非交互式shell,默认情况下禁用作业控制。您可以通过插入命令set -m

    在脚本中启用作业控制