如何在 Perl 中实时读取外部命令的输出?

2024-01-07

我运行了一些 bash 脚本,但它们可能需要几个小时才能完成,在此期间它们会显示下载速度、预计到达时间和类似信息。我需要在 perl 中捕获这些信息,但是我遇到了一个问题,我无法逐行读取输出(除非我遗漏了一些东西)。

有帮助解决这个问题吗?

编辑:为了更好地解释这一点,我正在同时运行几个 bash 脚本,我希望使用 gtk 和 perl 来生成方便的进度条。 目前,我正在为每个我希望运行的 bash 脚本运行 2 个线程,一个主线程用于更新图形信息。它看起来像这样(尽可能减少):

  my $command1 = threads->create(\&runCmd, './bash1', \@out1);
  my $controll1 = threads->create(\&monitor, $command1, \@out1);
  my $command1 = threads->create(\&runCmd, 'bash2', \@out2);
  my $controll2 = threads->create(\&monitor, $command2, \@out2);

  sub runCmd{
     my $cmd = shift;
     my @bso = shift;
     @bso = `$cmd`
  }
  sub monitor{
     my $thrd = shift;
     my @bso = shift;
     my $line;
     while($thrd->is_running()){
       while($line = shift(@bso)){
         ## I check the line and do things with it here
       }
       ## update anything the script doesn't tell me here.
       sleep 1;# don't cripple the system polling data.
     }
     ## thread quit, so we remove the status bar and check if another script is in the queue, I'm omitting this here.
  }

使用以下命令代替线程和 ``:

 open my $fh, '-|', 'some_program --with-options';

以这种方式打开多个文件句柄(与您需要运行的程序一样多),然后使用IO::Select http://search.cpan.org/perldoc?IO::Select从他们那里轮询数据。

简单的例子。

假设我有如下所示的 shell 脚本:

=> cat test.sh
#!/bin/bash
for i in $( seq 1 5 )
do
    sleep 1
    echo "from $$ : $( date )"
done

它的输出可能如下所示:



=> ./test.sh
from 26513 : Fri Aug  7 08:48:06 CEST 2009
from 26513 : Fri Aug  7 08:48:07 CEST 2009
from 26513 : Fri Aug  7 08:48:08 CEST 2009
from 26513 : Fri Aug  7 08:48:09 CEST 2009
from 26513 : Fri Aug  7 08:48:10 CEST 2009
  

现在,我们来写一个multi-test.pl:

#!/usr/bin/perl -w
use strict;
use IO::Select;

my $s = IO::Select->new();

for (1..2) {
    open my $fh, '-|', './test.sh';
    $s->add($fh);
}

while (my @readers = $s->can_read()) {
    for my $fh (@readers) {
        if (eof $fh) {
            $s->remove($fh);
            next;
        }
        my $l = <$fh>;
        print $l;
    }
}

正如你所看到的,没有叉子,没有线程。这就是它的工作原理:



=> time ./multi-test.pl
from 28596 : Fri Aug  7 09:05:54 CEST 2009
from 28599 : Fri Aug  7 09:05:54 CEST 2009
from 28596 : Fri Aug  7 09:05:55 CEST 2009
from 28599 : Fri Aug  7 09:05:55 CEST 2009
from 28596 : Fri Aug  7 09:05:56 CEST 2009
from 28599 : Fri Aug  7 09:05:56 CEST 2009
from 28596 : Fri Aug  7 09:05:57 CEST 2009
from 28599 : Fri Aug  7 09:05:57 CEST 2009
from 28596 : Fri Aug  7 09:05:58 CEST 2009
from 28599 : Fri Aug  7 09:05:58 CEST 2009

real    0m5.128s
user    0m0.060s
sys     0m0.076s
  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Perl 中实时读取外部命令的输出? 的相关文章

  • 如何在 Linux shell 中将十六进制转换为 ASCII 字符?

    假设我有一个字符串5a 这是 ASCII 字母的十六进制表示Z 我需要找到一个 Linux shell 命令 它将接受一个十六进制字符串并输出该十六进制字符串代表的 ASCII 字符 所以如果我这样做 echo 5a command im
  • 两种情况或 if 哪个更快? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我必须制作一个 非常 轻的脚本 它将接受用户的选项并调用脚本中的函数来执行一些任务 现在我可以使用 IF 和 CASE 选项 但我想知道两
  • Text::平衡和多行 xml

    看来我有点失落了 我需要解析一个大的 大约 100 mb 且相当难看的 xml 文件 如果我使用parsefile 它返回错误 文档元素后的垃圾 但它会很乐意解析文件的较小元素 所以我决定将文件分解为元素并解析它们 由于不鼓励使用正则表达式
  • 使用 su 和 Expect 脚本登录用户时遇到问题

    我正在为一个班级制作一个网站 您可以使用用户名和密码登录 然后它会将您带到一个显示您在班级中的成绩的页面 该网站正在运行bash脚本 https github com jduga002 rapache 并将托管在用户已有用户名和密码登录的计
  • 快速 Perl signint 处理程序

    收到 Ctrl C 时处理程序清理的最方便 最清晰的方法是什么 例如 当我的套接字服务器以这种方式被终止时 TCP 套接字永远不会关闭 我想要一个很好的衬里 我可以将其放在程序的顶部来设置 sigint 处理程序 或类似 atexit 的东
  • 围绕 readline 构建的 python 批处理的触发器选项卡完成

    背景 我有一个 python 程序 它导入并使用 readline 模块来构建自制的命令行界面 我有第二个 python 程序 围绕 Bottle 一个 Web 微框架构建 充当该 CLI 的前端 第二个 python 程序向第一个程序打开
  • 分叉/多线程进程|重击

    我想让我的代码的一部分更加高效 我正在考虑让它分叉成多个进程 并让它们一次执行 50 100 次 而不是只执行一次 例如 伪 for line in file do foo foo2 foo3 done 我希望这个 for 循环运行多次 我
  • 折叠具有多个字段的行

    我有这个代码 awk seen 1 2 a 1 a 1 a 1 t 2 END for i in a print i a i inputfile 我想折叠具有两个以上字段的行 但始终基于第一个字段作为索引 输入文件 三列制表符分隔 prot
  • 在脚本内使用不带密码的 sudo

    由于某种原因 我需要作为用户在没有 sudo 的情况下运行脚本 script sh 该脚本需要 root 权限才能工作 我认为将 sudo 放入 script sh 中是唯一的解决方案 让我们举个例子 script sh bin sh su
  • 将二进制输出从文件输出重定向到 stdout

    我有一个专有的二进制文件 它顽固地接受两个文件作为参数 第一个作为输入 第二个作为输出 我想 构建第一个参数 不创建临时文件 使二进制写入标准输出而不是输出文件 第二个参数 我解决了第一个问题 lt 但不确定第二个参数 我编写了以下脚本 看
  • Bash 脚本:自动为 mpeg-dash 进行 ffmpeg 编码

    我正在编写一个 bash 文件来创建视频编码和串联 以供 dash 实时流媒体使用 基本上 它读取输入视频文件夹 将所有视频编码为三种分辨率格式 然后将它们连接起来创建三个适应集 DIAGRAM 该脚本检查 fps 一致性 如果输入不是 1
  • 通过 sed 使用 unix 变量将数据附加到每行末尾[重复]

    这个问题在这里已经有答案了 我有一个文件 我想使用 SED 将值附加到每行末尾的 unix 变量中 我已经通过 AWK 实现了这一点 但我想在 SED 中实现 像这样的东西 我已经尝试过以下命令 但它不起作用 sed i s BATCH R
  • 在两次之间每分钟执行一次 Cronjob

    我需要在 crontab 中每分钟运行一个 bash 脚本8 45am and 9 50am每天的 Code 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 8 home pull sh gt ho
  • 符合 POSIX 标准的 shell 相当于 Bash“while read -d $'\0' ...”?

    我正在尝试使 Bash 脚本严格符合 POSIX 标准 即消除任何潜在的 Bashisms http mywiki wooledge org Bashism 通过使用checkbashisms px script filename 在给定的
  • Spyder 无法启动:spyder:找不到命令

    我已经安装了spyderpip3 install spyder在苹果电脑上 但是 当我无法从 bash 启动它时 它会显示spyder command not found 我已按照其说明进行操作Github页面 https github c
  • 如何忽略 perl 中的“证书验证失败”错误?

    我想访问一个无法验证证书的网站 我正在使用 WWW Mechanize 获取请求 那么如何忽略这一点并继续连接到该网站呢 use IO Socket SSL qw use WWW Mechanize qw my mech WWW Mecha
  • 从 systemd bash 内联脚本创建 filename_$(date %Y-%m-%d)

    我正在尝试执行systemd计时器并希望将执行脚本的输出保存在每个日期的文件中 这是我的ExecStart脚本中的 service file ExecStart bin bash c echo date Y m d gt gt home u
  • 如何在 Perl 中修改 Windows NTFS 权限?

    我在 Windows Server 2003 上使用 ActiveState Perl 我想在 Windows NTFS 分区上创建一个目录 然后授予 Windows NT 安全组对该文件夹的读取访问权限 这在 Perl 中可能吗 我必须使
  • 如何避免使用 python 处理空的标准输入?

    The sys stdin readline 返回之前等待 EOF 或新行 所以如果我有控制台输入 readline 等待用户输入 相反 我想打印帮助并在没有需要处理的情况下退出并显示错误 而不是等待用户输入 原因 我正在寻找一个Pytho
  • 如何检测脚本是否正在被获取

    我有一个脚本 我不希望它调用exit如果它正在被采购 我想检查一下是否 0 bash但是如果脚本源自另一个脚本 或者用户从不同的 shell 获取它 例如ksh 有没有可靠的方法来检测脚本是否来源 稳健的解决方案bash ksh zsh 包

随机推荐

  • Python如何获取用zlib压缩的数据的长度?

    我有一个包含多个 zlib 压缩的二进制数据的文件 并且偏移量和长度未知 下面 我有一个脚本 用于获取最终 zlib 压缩数据之后的字节偏移量 这就是我所需要的 脚本有效 但是 为了获得原始 zlib 压缩数据的长度 我必须将其解压缩并重新
  • Ontotext GraphDB 如何在 Visual Graph 中分配颜色?

    我一直在尝试使用 Ontotext GraphDB 创建一些图形可视化 我希望我对相同数据制作的各种可视化效果之间的颜色保持一致 我知道颜色是根据类型而定的 但似乎并不一致 例如 如果我创建一个仅包含类型节点的可视化图表A 分配给节点的颜色
  • Jax rs 客户端池

    我正在努力使用 jax rs 2 客户端 API 设置 REST 客户端 在 api 文档中 它说 客户端是管理客户端通信基础设施的重量级对象 客户端实例的初始化和处置可能是一个相当昂贵的操作 因此建议仅构建少量客户端应用程序中的实例 ht
  • 无法加载文件或程序集 CrystalDecisions.ReportAppServer.CommLayer

    我有一个与此类似的错误one https stackoverflow com q 10001310 196526或这个one https stackoverflow com q 38025601 196526但我的问题不同 我在本地计算机上
  • 删除一个类的所有成员

    昨天我读了一位同事的一些代码 发现了这一点 class a class public a class int some method int some param int value 1 int value 2 float value 3
  • 暂时将powershell语言更改为英语?

    我编写了一些使用系统 powershell 命令输出的软件 但没有预见到对于英语以外的语言 输出会有所不同 有没有办法暂时将Powershell中的语言更改为英语就这一个 单个 powershell 会话 Notes 如果它很重要 我希望运
  • pandas - Groupby 两个函数

    我一直在尝试获取 pandas groupby 对象的 cumsum 我需要将 cumsum 移动 1 这是通过 shift 实现的 然而 在单个 groupby 对象上执行这两个函数会产生一些不需要的结果 df pd DataFrame
  • React 的 getDefaultProps() 中的 this.props ?

    我正在尝试添加一个依赖于其他道具的道具 这些道具基本上将由组件的所有者组件传递 所以我做了 propTypes user React PropTypes object comment React PropTypes object getDe
  • 如何在谷歌地图中禁用两指滚动

    我正在尝试在我的应用程序中实现谷歌地图 其中我想在谷歌地图中禁用两根手指滚动 这意味着如果用户用一根手指触摸地图 则地图应该滚动 如果用户用两根手指触摸地图 则不应滚动 谢谢 您可以在 GoogleMap 上启用 禁用滚动手势 您可以通过调
  • 如果应用程序以管理员身份运行,则会出现奇怪的文件权限

    我的程序必须以管理员身份运行并创建一些文件 如果我通过右键单击图标并选择 以管理员身份运行 来手动运行它 一切正常 所有用户都可以访问创建的文件 但是 如果程序通过 ShellExecuteEx 使用 runas 动词从另一个程序启动 则创
  • Node.js 中的用户管理系统

    大多数 Web 应用程序对用户管理的要求相当普遍 用户自行注册 收到一封确认电子邮件 要求忘记密码 管理员为用户分配角色等 是否有一个node js express js项目已经实现了流程并且可以定制 Passport js 允许应用程序仅
  • Spark 中的 DataFrame 到 Json 数组

    我正在用 Java 编写 Spark 应用程序 它读取 HiveTable 并将输出以 Json 格式存储在 HDFS 中 我使用读取配置单元表HiveContext它返回 DataFrame 下面是代码片段 SparkConf conf
  • 用字符串变量替换字符串 - 错误 91

    背景 最近我回答了一个question https stackoverflow com q 57723867 9758194其中涉及查看文件的属性 最终我提供的代码运行良好 但有一件事让我感到困惑 Problem 有两行特定的行 我想用变量
  • 包裹错误 - 找不到模块 @parcel\fs-search\fs-search.win32-x64-msvc.node

    我最近将 Windows 从 Windows 10 更新到了 11 更新 我再次重新安装了 Windows 10 但收到了同样的错误 当我运行yarn start或npm start时 我收到以下错误 yarn start yarn run
  • 我们可以看到 pandas.core.groupby.SeriesGroupBy 对象中的组数据吗

    我们可以检查a中的数据吗pandas core groupby SeriesGroupBy object 第一个选项 迭代所有组 for name group in df groupby column print name print gr
  • 非规格化数 - IEEE 754 浮点

    因此 我试图了解有关 IEEE 754 浮点数标准中定义的非规范化数字的更多信息 感谢 Google 搜索结果 我已经阅读了几篇文章 并且浏览了几篇 StackOverFlow 帖子 然而我还有一些问题没有得到解答 首先 回顾一下我对非规范
  • BLE:使用 CoreBluetooth 在 2 个 ios 设备之间传输图像

    我有 2 台 iOS 设备 一台是 Peripheral 另一台是 Central 我希望数据是图像 我尝试过使用字符串值 它工作正常 但使用图像时出现此错误 read user chunkIDOT 1221 无效的 PNG 文件 没有有效
  • 按日和月过滤 SPARQL 结果

    我目前正在使用http dbpedia org snorql http dbpedia org snorql网站发起一些基本请求 如下所示 PREFIX dbpedia0
  • 一直出现 WebResource.axd?d=.... 错误

    我有一个 ASP NET C 应用程序 但总是遇到不同的错误 如下所示 有谁知道如何解决这个问题 谢谢 Page http www sitename com WebResource axd d OYuYekAZWSmOdOaJyDRqKg2
  • 如何在 Perl 中实时读取外部命令的输出?

    我运行了一些 bash 脚本 但它们可能需要几个小时才能完成 在此期间它们会显示下载速度 预计到达时间和类似信息 我需要在 perl 中捕获这些信息 但是我遇到了一个问题 我无法逐行读取输出 除非我遗漏了一些东西 有帮助解决这个问题吗 编辑