问题标签 [process-group]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
linux - “kill 0”和“kill -- -$$”有什么区别?
基本上,我想要一个 bash 脚本进程,在收到一个SIGINT
,在退出之前杀死它的所有子进程。我在这里读到使用以下内容:
我也读过使用kill 0
:
它们之间有什么区别,它们是否满足以下要求(如果不满足,是什么?)?:
- 只杀死它自己及其子进程(假设它是由终端命令启动的顶级进程)。
- 它不会杀死任何其他进程或同一 shell 脚本的实例(从单独的终端命令运行:即在运行时
./foo.sh &
then./foo.sh
,即使在同一个 tty 中,杀死第二个也不应该杀死第一个)。
bash - 我的调用脚本中有“trap 'echo ignore' USR1”,为什么调用脚本会被杀死?
假设我有这两个 bash 脚本:
/tmp/陷阱:
/tmp/usr1er:
Trapper 应该捕获 USR1 并简单地忽略它。它启动 usr1er,它使用 USR1 信号终止其进程组。现在,如果我从交互式 shell 中将 trapper 作为脚本单独启动,它会杀死 usr1er 并正常退出:
如果我尝试$(/tmp/trapper)
,它会退出整个外壳。同样,如果我制作一个单独的脚本来调用/tmp/trapper
,例如/tmp/outer
:
它被杀死而不打印“到达外部的末端”:
为什么?
go - 为什么 Go 中的 os.StartProcess 将子进程组 id 设置为子 pid
golang 库函数在 fork 后在子进程中os.StartProcess()
调用。setpgid(0,0)
它在“linux”和“bsd”配置上执行此操作,来源:http: //golang.org/src/pkg/syscall/exec_bsd.go? h =SYS_SETPGID# L105 http://golang.org/src/ pkg/syscall/exec_linux.go?h=SYS_SETPGID#L117
我过去注意到 OSX Foundation 库NSTask - (void)launch
方法做同样的事情(未记录)。当时这似乎很烦人,因为它使管理流程树变得更加困难。
这些库自动执行此操作有什么好处?
c - 信号处理程序中的 pgid 与真正的 pgid 不同
我有以下简单的程序,它为 STDIN 设置主程序的 pgid 和 pgroup。然后,我有一个信号处理程序,它打印当前进程的 pgid 和发送信号的进程的 pgid。这是我的代码
但是,当我按 ^C 时,我得到的输出是
由于程序在主程序中运行并且信号也是从同一源发送的,因此它们不应该是相同的吗?
process - 从 task_struct 和 pid_namespace 获取用户 ID 和进程组 ID
我正在尝试修改 Linux 内核,我需要从 atask_struct
和 a获取用户 ID 和进程组 ID pid_namespace
。尽管我在源代码中搜索了它们的定义,但我找不到任何全局变量或函数(可能因为代码中缺少注释而丢失)来访问它们。
由于我不能使用用户空间函数等getuid()
,有没有一种方法可以将它们放入内核空间?
bash - bash 陷阱'' vs 陷阱函数传递信号
我对将信号转发到带有陷阱的子进程感到困惑。假设我有两个脚本:
灰
b.sh
如果我执行a.sh
然后从另一个窗口用 杀死进程组kill -- -PGID
,则 SIGTERM 将被忽略并且不会传递给b.sh
. 但如果我这样做trap cleanup SIGTERM
,SIGTERM 会通过并终止b.sh
。为什么我的陷阱在一种情况下传递信号而不是另一种情况?
linux - 标识符 PID、PPID、SID、PGID、UID、EUID 是什么意思?
我被分配到
编写一个 C 程序,打印以下标识符 PID、PPID、SID、PGID、UID、EUID。
然后任务继续问
每个标识符代表什么?
我已经完成了这个程序,但还没有找到对标识符的充分解释。
- 它们真正代表什么?
- 特别是 SID 和 PGID 标识符的用途是什么?
bash - 为什么后台 ssh 可以从 Bash 接管 tty?
(我在 Debian 8 上使用 Bash 4.4.12。在bash 邮件列表中也提出了问题。)
请参阅以下步骤以重现该问题。
从tty #1 ( pts/2
):
步骤 102启动作为守护进程运行的多路复用 SSH 连接。步骤 105尝试使用多路连接来运行sleep
命令。但是我不能在当前的shell中输入任何东西。如果我终止该ssh ... sleep &
进程,那么 Bash 将能够再次接受我的输入。似乎所有输入都被后台ssh
进程消耗。
转到tty #2 ( pts/3
):
我解码了信号掩码:
在这里我们可以看到 ssh 进程没有捕捉到SIGTTIN
信号。这让我感到困惑,因为后台作业(进程组)SIGTTIN
在尝试从 tty 读取时应该接收并停止。
python - 如何在python中杀死一个分叉的孩子及其jackd子进程
我正在尝试实现一个托盘图标,它可以让我控制一个进程(jackd)。最为显着地
- 我想读取进程 stdout 和 stderr 以进行日志记录
- 我希望能够从主程序的菜单项中终止进程
杀戮让我头疼。我相信,当我阅读 stdout 和 stderr 时,我必须在额外的线程/进程中执行此操作以保持图标响应。所以我使用 fork() 创建了一个子进程并调用了子进程setsid()
。subprocess
然后该子进程使用模块调用jackd
现在我希望我可以让我的分叉子进程进入同一个进程组,这样我就可以一次杀死两者,但令我惊讶的是,我Popen
创建了一个新的进程组和一个新的会话:
因此,杀死孩子不会杀死孙子,我看不出有任何干净的方法可以让孙子的 PID(5804)知道以main
明确地杀死它。我可能会使用一些信号诡计让垂死的孩子杀死孙子,但我犹豫不决。
我也不能setpgid
在 jackd 进程上使用强制它进入孩子的进程组,因为它的 SID 与我孩子的 SID 不同。
我相信我要么
- 必须说服 Popen 不要创建新会话,或者
- 使用一个魔力低于 的模块
subprocess
,但它仍然允许我阅读 stdout 和 stderr。
但我也不知道该怎么做。诚然,我对进程组的了解有些有限。
10 月 12 日更新
我发现新会话不是由python创建的,而是由jackd
它自己创建的。当我用 替换 jackd 时xterm
,一切都很好。
我也发现了这个
这些杰克时代调用 setsid() 以使自己成为新的流程组负责人
只剩下选择
- 让 jack 的 PID 为人所知
main
并明确地杀死它,或者 - 让垂死的孩子杀死 杀死杰克德
对此有何建议?
.
c - 如何获取与终端关联的会话的会话 ID?
在Linux中,每个终端只关联一个会话(一个会话有一个或多个进程组,一个进程组有一个或多个进程)。
是否有一些函数(或命令)采用 tty 设备文件(例如:/dev/tty1
或/dev/pts/0
)并返回与此 tty/终端关联的会话 ID?