2015-12-03 174 views
1

最近,我正在其用于从文件中启动的工作,承担以下任务的脚本:

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. 当我输入'fg'将背景放在前面,然后键入'Ctrl-C'发送中断信号,则while子句和nc(1)命令都没有了,我认为这是因为INT信号已发送到第2项中描述的进程组。

我还下载了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的特殊情况?

回答

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发送到该组。

但是,当我把上面的后台作业的脚本,kill %1并不如我猜测任何更多的工作。 ...所以我想知道 在脚本上下文中有kill %1的特殊情况吗?启用作业控制时

JOBSPEC%1仅仅是可用的。默认情况下,非交互式shell的作业控制被禁用。您可以通过插入命令set -m来启用脚本中的作业控制。