sh -c "command" 的 Sigkill 子进程
Sigkill child process of sh -c "command"
我正在做一个项目,我需要在 D 中松散地重新创建 supervisord(作业控制系统)。我使用 spawnShell() 而不是 spawnProcess() 以便于配置参数等。这有效果运行 sh -c "command"。但是,它 returns sh NOT 子进程的 PID(原因很明显)。这成为一个问题,因为我的程序需要能够在一段时间后没有响应 SIGTERM 时向进程发送 SIGKILL。我可以毫无问题地发送 SIGTERM(大概是因为 sh 捕获了 SIGTERM 并在退出前将其传递给它的子节点 process/processes)。然而,由于再次明显的原因,SIGKILL 在它有机会向子进程发送信号之前停止 sh 并且它被孤立。这让我想到了我的问题:
A:我可以安全地假设派生进程的 PID 总是比 sh 的 PID 高一个吗?到目前为止,它在我所有的测试中都是如此。
B:如果不是,那么有没有更优雅的方式(系统调用等)来获取子进程的 PID,只知道父进程的 PID,而不是让我的程序只执行 pgrep -P <sh PID>
?
Can I safely assume that the PID of the spawned process will always be one higher than the PID of sh? It has behaved as such in all my testing so far.
没有。 Linux 是一个多任务 OS。虽然很少见,但其他过程可能会在两者之间开始。不要依赖竞争条件。
If not, then is there a more elegant way (system call or such) to get a child process's PID knowing only the parent process's PID than having my program just execute pgrep -P <sh PID>
?
不是真的。尝试浏览流程树表明您的方法是错误的。
你解决了错误的问题。摆脱 shell 中间人。
您只需要:
sh -c 'exec command'
shell 将自己替换为您的命令并让开,因此没有中间过程。
不,您不能假设 pids 会相差一个。
我正在做一个项目,我需要在 D 中松散地重新创建 supervisord(作业控制系统)。我使用 spawnShell() 而不是 spawnProcess() 以便于配置参数等。这有效果运行 sh -c "command"。但是,它 returns sh NOT 子进程的 PID(原因很明显)。这成为一个问题,因为我的程序需要能够在一段时间后没有响应 SIGTERM 时向进程发送 SIGKILL。我可以毫无问题地发送 SIGTERM(大概是因为 sh 捕获了 SIGTERM 并在退出前将其传递给它的子节点 process/processes)。然而,由于再次明显的原因,SIGKILL 在它有机会向子进程发送信号之前停止 sh 并且它被孤立。这让我想到了我的问题:
A:我可以安全地假设派生进程的 PID 总是比 sh 的 PID 高一个吗?到目前为止,它在我所有的测试中都是如此。
B:如果不是,那么有没有更优雅的方式(系统调用等)来获取子进程的 PID,只知道父进程的 PID,而不是让我的程序只执行 pgrep -P <sh PID>
?
Can I safely assume that the PID of the spawned process will always be one higher than the PID of sh? It has behaved as such in all my testing so far.
没有。 Linux 是一个多任务 OS。虽然很少见,但其他过程可能会在两者之间开始。不要依赖竞争条件。
If not, then is there a more elegant way (system call or such) to get a child process's PID knowing only the parent process's PID than having my program just execute
pgrep -P <sh PID>
?
不是真的。尝试浏览流程树表明您的方法是错误的。
你解决了错误的问题。摆脱 shell 中间人。
您只需要:
sh -c 'exec command'
shell 将自己替换为您的命令并让开,因此没有中间过程。
不,您不能假设 pids 会相差一个。