问题标签 [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.

0 投票
1 回答
4056 浏览

linux - “kill 0”和“kill -‍- -$$”有什么区别?

基本上,我想要一个 bash 脚本进程,在收到一个SIGINT,在退出之前杀死它的所有子进程。我在这里读到使用以下内容:

我也读过使用kill 0

它们之间有什么区别,它们是否满足以下要求(如果不满足,是什么?)?:

  1. 只杀死它自己及其子进程(假设它是由终端命令启动的顶级进程)。
  2. 它不会杀死任何其他进程或同一 shell 脚本的实例(从单独的终端命令运行:即在运行时./foo.sh &then ./foo.sh,即使在同一个 tty 中,杀死第二个也不应该杀死第一个)。
0 投票
2 回答
1165 浏览

bash - 我的调用脚本中有“trap 'echo ignore' USR1”,为什么调用脚本会被杀死?

假设我有这两个 bash 脚本:

/tmp/陷阱:

/tmp/usr1er:

Trapper 应该捕获 USR1 并简单地忽略它。它启动 usr1er,它使用 USR1 信号终止其进程组。现在,如果我从交互式 shell 中将 trapper 作为脚本单独启动,它会杀死 usr1er 并正常退出:

如果我尝试$(/tmp/trapper),它会退出整个外壳。同样,如果我制作一个单独的脚本来调用/tmp/trapper,例如/tmp/outer

它被杀死而不打印“到达外部的末端”:

为什么?

0 投票
1 回答
844 浏览

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方法做同样的事情(未记录)。当时这似乎很烦人,因为它使管理流程树变得更加困难。

这些库自动执行此操作有什么好处?

0 投票
1 回答
389 浏览

c - 信号处理程序中的 pgid 与真正的 pgid 不同

我有以下简单的程序,它为 STDIN 设置主程序的 pgid 和 pgroup。然后,我有一个信号处理程序,它打印当前进程的 pgid 和发送信号的进程的 pgid。这是我的代码

但是,当我按 ^C 时,我得到的输出是

由于程序在主程序中运行并且信号也是从同一源发送的,因此它们不应该是相同的吗?

0 投票
1 回答
5941 浏览

process - 从 task_struct 和 pid_namespace 获取用户 ID 和进程组 ID

我正在尝试修改 Linux 内核,我需要从 atask_struct和 a获取用户 ID 和进程组 ID pid_namespace。尽管我在源代码中搜索了它们的定义,但我找不到任何全局变量或函数(可能因为代码中缺少注释而丢失)来访问它们。

由于我不能使用用户空间函数等getuid(),有没有一种方法可以将它们放入内核空间?

0 投票
2 回答
468 浏览

bash - bash 陷阱'' vs 陷阱函数传递信号

我对将信号转发到带有陷阱的子进程感到困惑。假设我有两个脚本:

b.sh

如果我执行a.sh然后从另一个窗口用 杀死进程组kill -- -PGID,则 SIGTERM 将被忽略并且不会传递给b.sh. 但如果我这样做trap cleanup SIGTERM,SIGTERM 会通过并终止b.sh。为什么我的陷阱在一种情况下传递信号而不是另一种情况?

0 投票
1 回答
26036 浏览

linux - 标识符 PID、PPID、SID、PGID、UID、EUID 是什么意思?

我被分配到

编写一个 C 程序,打印以下标识符 PID、PPID、SID、PGID、UID、EUID。

然后任务继续问

每个标识符代表什么?

我已经完成了这个程序,但还没有找到对标识符的充分解释。

  • 它们真正代表什么?
  • 特别是 SID 和 PGID 标识符的用途是什么?
0 投票
1 回答
516 浏览

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 读取时应该接收并停止。

0 投票
1 回答
1417 浏览

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并明确地杀死它,或者
  • 让垂死的孩子杀死 杀死杰克德

对此有何建议?

.

0 投票
1 回答
4490 浏览

c - 如何获取与终端关联的会话的会话 ID?

在Linux中,每个终端只关联一个会话(一个会话有一个或多个进程组,一个进程组有一个或多个进程)。

是否有一些函数(或命令)采用 tty 设备文件(例如:/dev/tty1/dev/pts/0)并返回与此 tty/终端关联的会话 ID?