问题标签 [perl-ipc-run]

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 投票
2 回答
488 浏览

perl - 如何判断 IPC::Run 作业何时完成

是否有一种简单、可靠的方法来判断IPC::Run任务何时完成,即任何子进程已退出?

令人惊讶的是,文档对此保持沉默。

似乎循环pumpable工作,虽然它并没有真正清楚地记录为正确的做事方式:

有更好的选择吗?finish块,但是当您等待 proc 完成时,您无法在事件循环中执行其他工作。

我很惊讶没有简单的

或者

我错过了一些明显的东西吗?

同样,似乎没有记录的方式来获取孩子(ren)的pid。

0 投票
1 回答
1279 浏览

perl - 如何测试 IPC::Run3 的退出状态

我正在尝试测试 Perl 模块 IPC::Run3 但难以检查命令是失败还是成功。
我知道如果 IPC::Run3 的参数有问题,它会发出退出代码,但是如果参数正常但命令不存在怎么办?如何测试以下示例?

有一个调用 Run3 的子程序

当执行$cmds[0]下面的ls命令(*nix 系统的命令)时,它会OK按预期打印,但使用命令$cmds[1]它只是说No such file or directory at ./testrun3.pl line 18. 通过对退出代码的测试,我希望它打印出来Something is wrong

或者在这种情况下,什么是 IPC::Run3 的最佳替代方案?这只是对过程的过度简化,但最终我想为更复杂的情况捕获 STDERR 和 STDOUT。

谢谢。

0 投票
1 回答
525 浏览

perl - 在 Windows 10 x64 上安装 IPC::Run 测试期间的 SIGBREAK

我无法IPC::Run 在 Windows 10 x64 上安装:

然后它给我一个提示...

...之后它(显然)终止。看起来我在安装过程中多次按下 Ctrl-Break 但我没有。该行为是可重复的。有人知道发生了什么吗?

0 投票
1 回答
365 浏览

perl - 使 Perl IPC::Run pump 每行,而不是偶尔的批次

我使用 IPC::Run 从 cron 运行脚本中的外部可执行文件获取输出。我需要它能够根据即时输出进行过滤和做出决策。但问题是它不是即时给我输出,而是分几批输出 - 一次多行,只有在可执行文件运行一段时间后。是否有可能像我们在 grep 命令中使用 grep 命令一样刷新输出grep --line-buffered?我没有在所有 Perl 站点中看到正确的回答。这是我的脚本部分:

0 投票
1 回答
164 浏览

perl - Perl 发送 STDIN 并从外部程序过滤 STDOUT

我正在为另一个应用程序编写 Perl 包装器。

我需要通过管道传输 STDIN 和一些 STDOUT。

Perl 代码

输出

我想实现这个标准输出:

所以 STDOUT 必须被过滤,我不知道怎么做。

我试过了,$stdout =~ s/....//g但它不起作用。

请记住,在过滤 STDOUT 之后,它也必须从父级向子级发送 STDIN

0 投票
1 回答
77 浏览

perl - perl open() 总是返回 sh 的 PID 而不是底层程序

我必须杀死一个我通过它打开的程序

$pid = open(FH, "program|")

或者

$pid = or open(FH, "-|", "program")

但是,程序(具体来说是 mosquittto_sub)仍然在后台徘徊,因为open它正在返回 perl 用来运行程序的 PID sh,所以我只是杀死了sh包装程序而不是实际程序。

有没有办法让程序真正的PID?获取sh的 PID 有什么意义?

0 投票
1 回答
67 浏览

perl - 在 IPC::Run 中使用正确的 Perl 数组引用

我试图让这个 Perl 代码正常工作,我相信我只需要正确地引用我的引用。对于如何使用引用的任何反馈,我将不胜感激,但如果在没有 API 更改的情况下无法使此代码工作,我还将感谢有关如何更改周围 API 以支持我需要的数据类型的反馈。

我正在尝试向 PostgreSQL 测试套件添加一个新测试。有问题的代码运行一个子进程并将进程参数存储在散列中的数组文字中。例如:

该数组被传递给一个辅助库,如下所示:

辅助库不断向下传递数组:

然后最后调用IPC::Run

要编写我的测试用例,我必须将命令的输出通过管道传输到不支持查找的文件描述符。看起来 IPC::Run 模块为您支持管道。这是文档的示例:

但是我尝试了很多不同的方法来尝试构建我的数组文字,但都没有奏效。例如,我试过这个,我相信它给了我一个ARRAY(0xFFFFFFFF)错误:

如何获取此代码以使用管道设置多个子流程?

更新:我尝试了 ikegami 的建议:该command_ok函数只能有两个参数传递给它,所以这不起作用(你必须为第一个参数传递一个数组引用)。

更新:打开 IPC:Run 的调试功能我可以看到它是如何试图解释我的命令行的。它不是取消对数组的引用,而是尝试将其字符串化(?)并将该字符串作为可执行文件执行:

0 投票
2 回答
90 浏览

perl - Perl IPC::Run 输入文件大于 64KiB 的管道块

Perl 程序用于IPC::Run通过一系列在运行时确定的命令将文件传递到另一个文件中,就像这个小测试摘录所示:

它从作为参数给出的命令构建管道,测试文件是硬编码的。问题是如果文件大于 64KiB,管道就会挂起。这是一个cat在管道中使用以保持简单的演示。首先一个 64KiB(65536 字节)的文件按预期工作:

接下来,再增加一个字节。run永远不会回来的电话......

启用后,再加IPCRUNDEBUG上几只猫,您可以看到它是最后一个没有结束的孩子:

(对于 64KiB 以下的文件,您会看到所有四个都正常退出)

如何使它适用于任何大小的文件?

(Perl 5,版本 30,subversion 3 (v5.30.3) 为 x86_64-linux-thread-multi 构建,在目标平台 Alpine Linux 和 Arch Linux 上尝试排除 Alpine 的原因)