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)
的东西while
子句和nc(1)
命令都消失了,我认为这是因为INT
信号被发送到了第2项所述的过程组kill%1
不再像我猜测的那样起作用。以下是脚本(kill2.sh):
当我键入ctrl-c时,31835和31836被终止,但nc被保留。所以我想知道在脚本上下文中是否有kill%1
的特殊情况
kill 30995
时,while
子句按预期终止,但保留了nc(1)
。我
猜测kill语句只是调用kill(2)
系统
打电话杀死%1
时,整个31095
进程组被杀。我认为这可能会引起
killpg(2)
内部。while
子句和
nc(1)
命令消失了,我想那是因为
INT
信号被发送到过程组,如中所述
第2项。killpg()
,但至少在Linux上,killpg()
是作为一个库函数实现的,它可以调用kill(-pgrp,sig)
kill%1
不再像我猜的那样起作用了…所以我想知道
在脚本上下文中,kill%1
有一个特殊情况
作业规范%1
仅在启用作业控制时可用。对于非交互式Shell,默认情况下禁用作业控制。通过插入命令set-m
,可以在脚本中启用作业控制
kill 30995
时,while
子句按预期终止,但保留了nc(1)
。我
猜测kill语句只是调用kill(2)
系统
打电话杀死%1
时,整个31095
进程组被杀。我认为这可能会引起
killpg(2)
内部。while
子句和
nc(1)
命令消失了,我想那是因为
INT
信号被发送到过程组,如中所述
第2项。killpg()
,但至少在Linux上,killpg()
是作为一个库函数实现的,它可以调用kill(-pgrp,sig)
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)