最近,我正在编写一个用于从文件启动作业的脚本,承担以下工作:
while true; do nc -l 8188 < index.html; done &
当我在交互式shell中运行它时,我得到了一个像这样的pid回声:
[1] 31095
pstree(1)
输出:
bash(31095,31095)---- nc(31096,31095)
while
子句和nc(1)
命令都在同一个进程组中。
kill 30995
时,while
子句按预期终止,但nc(1)
已离开。我想kill语句只是调用kill(2)
系统调用。 kill %1
时,整个31095进程组被终止。我可以在内部调用killpg(2)
。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 :(得分:0)
- 当我输入
kill 30995
时,while
子句按预期终止,但nc(1)
已离开。一世 猜测kill语句只是调用kill(2)
系统 呼叫。- 当我输入
kill %1
时,整个31095 进程组被杀。我可以调用的东西 内部killpg(2)
。- 当我输入“fg”时 前面的背景,然后键入'Ctrl-C'发送中断 信号,然后是
while
子句和。{nc(1)
命令消失了,我认为那是因为INT
信号已发送到进程组,如中所述 第2项。
killpg()
,但至少在Linux上,killpg()
被实现为调用kill(-pgrp, sig)
的库函数。但是,当我将上述后台工作放在脚本中时,
kill %1
无法正常工作,因为我已经猜到了。 ......所以我想知道是否 在脚本上下文中有kill %1
的特殊情况吗?
jobspec %1
仅在启用作业控制时可用。对于非交互式shell,默认情况下禁用作业控制。您可以通过插入命令set -m
。