Shell 什么';“kill%1”和“kill$pid”之间的区别是什么?

Shell 什么';“kill%1”和“kill$pid”之间的区别是什么?,shell,process,jobs,kill,Shell,Process,Jobs,Kill,最近,我正在编写一个脚本,用于从文件启动作业,假设以下作业: while true; do nc -l 8188 < index.html; done & pstree(1)输出: bash(3109531095)---nc(3109631095) while子句和nc(1)命令都在同一进程组中 当我键入kill 30995时,while子句按预期终止,但nc(1)被保留。我猜kill语句只是调用kill(2)系统调用 当我键入终止%1时,整个31095进程组被终止。我知道可能在

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

while true; do nc -l 8188 < index.html; done &
pstree(1)
输出:

bash(3109531095)---nc(3109631095)

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

  • 当我键入
    kill 30995
    时,
    while
    子句按预期终止,但
    nc(1)
    被保留。我猜kill语句只是调用
    kill(2)
    系统调用
  • 当我键入
    终止%1
    时,整个31095进程组被终止。我知道可能在内部调用
    killpg(2)
    的东西
  • 当我键入'fg'将背景置于前面,然后键入'Ctrl-C'发送中断信号时,
    while
    子句和
    nc(1)
    命令都消失了,我认为这是因为
    INT
    信号被发送到了第2项所述的过程组
  • 我还下载了bash-4.3-beta源代码,但是源代码太多了,我找不到相关的东西。有人能帮我把想法说清楚吗

    但是,当我将上述后台作业放入脚本中时,
    kill%1
    不再像我猜测的那样起作用。以下是脚本(kill2.sh):

    当我键入ctrl-c时,31835和31836被终止,但nc被保留。所以我想知道在脚本上下文中是否有
    kill%1
    的特殊情况

  • 当我键入
    kill 30995
    时,
    while
    子句按预期终止,但保留了
    nc(1)
    。我 猜测kill语句只是调用
    kill(2)
    系统 打电话
  • 当我键入
    杀死%1
    时,整个31095 进程组被杀。我认为这可能会引起
    killpg(2)
    内部。
  • 当我键入“fg”带 将背景设置为前端,然后键入“Ctrl-C”发送中断 信号,
    while
    子句和
    nc(1)
    命令消失了,我想那是因为
    INT
    信号被发送到过程组,如中所述 第2项。
  • 没错
  • 它可能会调用
    killpg()
    ,但至少在Linux上,
    killpg()
    是作为一个库函数实现的,它可以调用
    kill(-pgrp,sig)
  • 如果终端是前台进程组的控制终端,则中断字符将导致向该组发送SIGINT
  • 但是,当我将上述后台作业放入脚本中时,
    kill%1
    不再像我猜的那样起作用了…所以我想知道 在脚本上下文中,
    kill%1
    有一个特殊情况

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

  • 当我键入
    kill 30995
    时,
    while
    子句按预期终止,但保留了
    nc(1)
    。我 猜测kill语句只是调用
    kill(2)
    系统 打电话
  • 当我键入
    杀死%1
    时,整个31095 进程组被杀。我认为这可能会引起
    killpg(2)
    内部。
  • 当我键入“fg”带 将背景设置为前端,然后键入“Ctrl-C”发送中断 信号,
    while
    子句和
    nc(1)
    命令消失了,我想那是因为
    INT
    信号被发送到过程组,如中所述 第2项。
  • 没错
  • 它可能会调用
    killpg()
    ,但至少在Linux上,
    killpg()
    是作为一个库函数实现的,它可以调用
    kill(-pgrp,sig)
  • 如果终端是前台进程组的控制终端,则中断字符将导致向该组发送SIGINT
  • 但是,当我将上述后台作业放入脚本中时,
    kill%1
    不再像我猜的那样起作用了…所以我想知道 在脚本上下文中,
    kill%1
    有一个特殊情况

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

    [1] 31095
    
    while true; do
        nc -l 8888 < $0
    done &
    
    trap 'kill %1' INT TERM
    wait || wait
    
    bash(31835, 31835) -- bash(31836, 31835) -- nc(31837, 31835)