问题标签 [child-process]

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 回答
1949 浏览

java - java Process'inputStream卡住了

这是我的场景:

  1. 进程 A 产生子进程 B 并旋转线程以耗尽 B 的输出。
  2. 进程 B 生成守护进程 C 并排出其输出。
  3. 进程 B 完成,守护进程仍然存在。
  4. 进程 A 发现进程 B 通过 process.waitFor() 退出。但是,它一直在读取进程 B 的输入流。这是因为 B 已经启动了一个守护进程。输入流仅在进程 C 退出时接收 EOF。

这只发生在 Windows 上。我正在使用 ProcessBuilder。这是我想出的解决方案,我想听听您的反馈,因为没有我真正喜欢的解决方案:

  1. 我可以使用 jna 来生成守护进程 C。这样我可以创建一个“足够分离”的进程,并且进程 A 不会卡在从 B 中排出流。它有效,但我不太热衷于该解决方案,因为这意味着一些本机代码(还有很多,因为我热衷于使用输入)。一些如何通过 JNA 来实现的灵感在这里:http: //yajsw.sourceforge.net(但是它包含的东西不仅仅是进程启动)。
  2. 在 jre7 上运行。Jdk7 为 ProcessBuilder 带来了一些新的好处,例如,inheritIO() 也解决了我的问题。显然,当打开inheritIO() 时,我可以简单地关闭守护进程C 中的所有流(无论如何我都会这样做,因为它是一个守护进程),这就解决了问题。但是,我需要在 jre5+ 上运行
  3. 在生成守护进程 C之前关闭进程 B 中的 System.out 和 System.err 。同样,它解决了问题,但我确实需要这些流在进程 B 中工作,因为我向它们编写有用的东西。不好。我希望我可以通过在 B 和 C 之间放置某种引导过程来利用这个特性,但这并没有解决问题。
  4. 我在linux上没有这个问题,所以我只能在linux上运行吗?不,我不能。
  5. 使进程 A 以非阻塞方式排出进程 B 的输出。这有点工作,但它不方便。例如 inputStream.read() 是不可中断的。我可以使用 inputStream.available() 但它不区分 EOF 和零字节可用。因此,只有当进程 A 对 B 的输出 EOF 不感兴趣时​​,该解决方案才是好的。此外,这个解决方案似乎更占用 CPU 资源,而且通常......感觉很尴尬,而且不是真正的防弹。
  6. 在 --dry-run 模式下运行进程 C,它只是检查它是否可以启动。它尝试启动、发送欢迎消息并退出。它不再长时间运行,因此不会阻塞读取。进程 B 可以获得足以启动 C 的信心,并且我们可以使用相对简单的 JNA 代码来生成分离的进程而不消耗其输出(正是输出的消耗使 JNA 相关的代码变得混乱和重量级)。唯一的问题是我们不再使用进程的 C 输出,但可以通过让 C 写入进程 B 可以使用的众所周知的文件来解决。这个解决方案更像是一个大而丑陋的解决方法,但对我们来说是可行的。无论如何,我们目前正在尝试解决方案 1)。

我真的很感激任何提示!

0 投票
1 回答
3785 浏览

c# - 从 C# 启动一个新的 explorer.exe 进程

如果我运行这个命令:

从 Windows shell(通过Windows+ R),我的打印机和传真在 explorer.exe进程中打开。(所以我有 2 个正在运行的explorer.exe进程。)

如果我执行:

从 C# 程序中,我的打印机和传真也打开了,但作为主进程的子进程explorer.exe(运行 Windows shell 的进程,包括任务栏等)。

如何explorer.exe从 C# 使用打印机和传真窗口启动第二个进程?

0 投票
1 回答
6346 浏览

bash - 使用 bash 中的陷阱捕获已终止后台进程的 pid

我正在编写一个生成许多后台进程的 bash 脚本。我希望在进程终止时收到通知;我想知道终止进程的pid。

我看过 using wait,这样每个生成的进程的 pid 都被捕获并存储在一个数组中,然后迭代数组,并在每个进程上调用 wait 。此处以各种方式描述了此技术:

https://stackoverflow.com/a/356154/366856

如果我理解正确的话,这个问题是,如果您想在单个进程终止后立即执行某些操作,则效率可能相对较低。例如,如果您生成进程 A 和 B,并且 B 在 A 之前完成,则执行必须等待 A 和 B 都完成。我需要在 B 完成后立即执行操作。

这似乎trap SIGCHLD是在孩子终止时立即执行操作的方式,但问题是我找不到确定 SIGCHLD 信号源的 pid 的方法,这也是我需要的。我发现的最接近此工作示例的是本文中的第三个代码示例:

http://www.linuxforums.org/forum/programming-scripting/103996-multithreading-bash.html#post510187

为方便起见,我在这里复制粘贴:

我觉得这个例子行不通,因为作者犯了trap多次调用的错误,每次在trap's 参数中捕获不同的 pid 变量。每次调用 trap 时,它都会覆盖上一次调用,因此将捕获任意 pid。我一直找不到更好的技术。

有没有办法使用 bash 中的陷阱获取终止的子进程的 pid?

更新

我只是想指出这个资源,它包含迄今为止我所看到的解决这个问题的最佳、最全面的概述:

http://mywiki.wooledge.org/ProcessManagement#I_want_to_process_a_bunch_of_files_in_parallel.2C_and_when_one_finishes.2C_I_want_to_start_the_next._And_I_want_to_make_sure_there_are_exactly_5_jobs_running_at_a_time

0 投票
0 回答
1199 浏览

node.js - 如何杀死由 child_process 启动的进程树?

我有 Node.js 应用程序,它使用child_process.spawn(my_command). 我用它来运行像sudo my-app.

sudo进程开始时,它开始my-app。所以我最终得到了一棵进程树。sudo在顶部,我的应用程序、我的服务器等在底部。

从我的节点脚本中,如果我终止了我启动的进程: my_process.kill("SIGTERM"),它会终止sudo进程而不是它的子进程。我的服务器一直在运行。

有没有办法杀死整个进程树?

0 投票
4 回答
36515 浏览

node.js - 从 Node.js 运行 shell 命令而不缓冲输出

我正在尝试从 Node.js 启动一个 shell 命令,而不重定向该命令的输入和输出——就像使用 shell 脚本或使用 Ruby 的system命令将 shell 输出到命令一样。如果子进程想要写入 STDOUT,我希望它直接进入控制台(或者重定向,如果我的 Node 应用程序的输出被重定向)。

Node 似乎没有任何直接的方法来做到这一点。看起来运行另一个进程的唯一方法是 with child_process,它总是将子进程的输入和输出重定向到管道。我可以编写代码来接受来自这些管道的数据并将其写入我的进程的 STDOUT 和 STDERR,但如果这样做,API 会迫使我牺牲一些灵活性。

我想要两个功能:

  • 外壳语法。我希望能够在命令之间传输输出,或者运行 Windows 批处理文件。
  • 无限输出。如果我向编译器发起攻击并且它想要生成兆字节的编译器警告,我希望它们都在屏幕上滚动(直到用户厌倦它并按下 Ctrl+C)。

看起来 Node 想要强迫我在这两个功能之间做出选择。

  • 如果我想要无限量的输出,我可以使用child_process.spawn然后做child.stdout.on('data', function(data) { process.stdout.write(data); });同样的事情stderr,它会很高兴地管道数据,直到奶牛回家。不幸的是,spawn不支持 shell 语法。
  • 如果我想要 shell 语法,我可以使用child_process.exec. 但exec坚持为我缓冲子进程的 STDOUT 和 STDERR 并在最后将它们全部提供给我,并且它限制了这些缓冲区的大小(可配置,默认为 200K)。on('data')如果我想查看生成的输出,我仍然可以挂钩事件,但exec仍会将数据添加到其缓冲区中。当数据量超过预定义的缓冲区大小时,exec将终止子进程。

(还有child_process.execFile,从灵活性的角度来看,这是两全其美的:没有 shell 语法,但你仍然必须限制你期望的输出量。)

我错过了什么吗?有什么方法可以只在 Node 中的子进程中使用,而不是重定向它的输入和输出?支持 shell 语法并且在预定义数量的输出后不会出错的东西,就像在 shell 脚本、Ruby 等中可用的那样?

0 投票
2 回答
1080 浏览

node.js - nodejs在子进程中输出中断

我在 ubantu 上连接 了 wavecom GSM 调制解调器。我使用 node.js 语言与 GSM 调制解调器进行通信。我通过Child Process向调制解调器发送命令。这里的例子

现在,当我在端口 /dev/ttyUSB15 上触发某些命令时,我无法正确获得输出。

例如

假设我的输出应该是

但我得到的不是它

简而言之,我的输出被破坏了。我无法从我的输出完全中断的地方推断出来。这是随机的。谁能给我任何想法?

提前致谢。

0 投票
4 回答
7182 浏览

php - 终止从套接字服务器派生的僵尸子进程

免责声明

我很清楚 PHP 在这种情况下可能不是套接字服务器的最佳选择。请不要建议不同的语言/平台——相信我——我已经从各个方向听到了。

Unix 环境中工作并使用PHP 5.2.17,我的情况如下 - 我在 PHP 中构建了一个与 flash 客户端通信的套接字服务器。我的第一个问题是每个传入的连接都会阻塞顺序连接,直到它完成处理。我通过使用 PHP 的pcntl_fork(). 我成功地生成了许多子进程(将它们的 PID 保存在父进程中),它们负责向其他客户端广播消息,因此“释放”父进程并允许它继续处理下一个连接[s]。

我现在的主要问题是处理/处理这些死/僵尸子进程的集合并终止它们。我已经(一遍又一遍地)阅读了pcntl_fork()的相关 PHP 手册页,并意识到父进程负责清理其子进程。当子进程执行一个exit(0). 我能够使用该pcntl_signal()函数“捕获”该信号来设置信号处理程序

我的 signal_handler 看起来像这样:

我确实看到了两个回声,包括需要删除的相关且正确的子 PID,但似乎

我理解的同义词kill -9 $childPid是返回 TRUE 虽然它实际上并没有删除该过程......

取自以下的手册页posix_kill

成功时返回 TRUE,失败时返回 FALSE。


我正在使用ps命令监视子进程。它们在系统上显示如下:

如您所见,所有这些进程都是父进程的子进程,其 PID 为5234

我的理解是否遗漏了什么?我似乎已经设法让一切正常工作(而且确实如此),但我在系统上留下了无数的僵尸进程!

我对僵尸启示录的计划是坚如磐石的——
但是当我什sudo kill -9至不杀死僵尸子进程时我能做些什么呢?


10天后更新

经过一些额外的研究,我自己已经回答了这个问题,如果你仍然能够忍受我的漫无边际的随意继续

0 投票
1 回答
529 浏览

c - 如何从另一个 c 程序检查 ac 程序的 main 函数的返回值

我正在尝试测试 ac 程序是否已正确编译和执行。

假设我刚刚在 ac 程序中打印Hello World ,所以我想编写 ac 程序来检查

第一个程序已返回 0 或已返回其他内容。

我怎样才能做到这一点。

提前致谢。

0 投票
2 回答
2558 浏览

javascript - 通过 nodejs 重新附加到生成的进程

我正在 Node.js 中创建一个小型专有游戏服务器管理器;目前它通过生成通过以下方式运行游戏child_process

只要经理继续运行,我就可以管道命令并按照我的意愿处理孩子。但是,请考虑我的经理崩溃或关闭的可能性。然后我将如何重新连接 到先前生成的子进程(在管理器关闭时仍在运行)?我可以存储 pidfiles 以尝试基于 pid 重新连接;但我不确定如何获取可以child_process访问孩子对象的stdio对象。

我真的希望这是可以恢复的;任何帮助表示赞赏,谢谢!


请注意:游戏服务器是专有的,例如 Minecraft、Source DS 等。假设我无权访问服务器源。


编辑

从节点读取一些源代码后child_process,看起来如果您在名为stdinStream,的选项中指定了一个属性stdoutStream,或者stderrStream它应该只打开一个套接字。(见第428 - 496行)。所以问题是,我如何阻止 spawn实际执行 spawn,而只是根据指定的 pid 和我传递的流设置其值。(由于 fd 是作为管道创建的,所以我会stdinStream通过这样做来获得我的结果。)fs.createWriteStream('/proc/PID/fd/0');

0 投票
1 回答
3986 浏览

node.js - 如何在 Node.js 中逐行读取 child_process?

我正在尝试制作一个 Node.js 脚本来分析磁盘使用情况。为此,我全力以赴du,但我无法弄清楚如何逐行读取子进程的输出。这是我到目前为止所尝试的:

du.stdout.on('data'只是读取数据块,虽然readline应该按行拆分其输入,但它没有,相反,我得到了完全相同的数据(du.stdout 返回一个缓冲区,但调用.toString()它会得到与我得到的相同的数据linereader)。