【问题标题】:Can I capture the output of another process that I started?我可以捕获我启动的另一个进程的输出吗?
【发布时间】:2018-11-19 18:50:43
【问题描述】:

我目前正在使用> /dev/null & 让 Perl 脚本 A 完全独立地运行 Perl 脚本 B,它工作正常。脚本 B 运行时不会返回任何输出,并且在脚本 A 结束时保持活动状态,即使我的终端会话结束也是如此。

不是说我需要它,但是如果我愿意,有没有办法重新捕获它的输出?

谢谢

【问题讨论】:

  • 重定向到文件或命名管道而不是/dev/null?管道要小心,如果不读取,它将默认填满然后阻塞。
  • @tink 你的回答吓到我了,> /dev/null 填满了吗?
  • 不,它没有。这就是它的美妙之处。但是 /dev/null 的内容留在 /dev/null ;)
  • 如果您想在后台启动程序,请查看nohup 命令行实用程序。它

标签: linux perl system


【解决方案1】:

您的代码框架可能如下所示:

#!/usr/bin/perl
# I'm a.pl
#...
system "b.pl > ~/b.out &";
while (1)
{
    my $time = localtime;
    my ($fsize, $mtime) = (stat "/var/log/syslog")[7,9];
    print "syslog: size=$fsize, mtime=$mtime at $time\n";
    sleep 60;
}

而 b.pl 可能看起来像:

#!/usr/bin/perl
# I'm b.pl
while (1)
{
    my $time = localtime;
    my $fsize_a = (stat "/var/log/auth.log")[7];
    my $fsize_s = (stat "/var/log/syslog")[7];
    print "fsize: syslog=$fsize_s auth.log=$fsize_a at $time\n";
    sleep 60;
}
  • a.pl 和 b.pl 独立完成工作。
  • b.pl 被 a.pl 作为后台作业调用,它将其输出发送到 b.out(不会弄乱 a.pl 的屏幕)
  • 您可以从其他终端读取 b.out,或在 a.pl 完成后(或将 a.pl 暂时置于后台时)

关于终止两个脚本:

  • `ctrl-c` 用于 a.pl
  • `killall b.pl` 用于 b.pl

注意:

  • b.pl 永远不会在您终止终端时终止(假设您的终端作为桌面应用程序运行),因此您不需要 `nohup` 命令来提供帮助。 (也许只在控制台有用)
  • 如果您的 b.pl 可能不时吐出错误消息,那么您仍然需要处理它的 stderr。它留作你的功课。

【讨论】:

  • 我正在使用 /dev/null 因为我无意查看输出,我的意思是如果我想将它重定向到其他东西,然后放回去?我不必这样做,我只是好奇是否可以,
  • @PlasticProgrammer - 您不必总是将 b.pl 的标准输出重定向到 b.out。您可以选择打开它,同时使用> /dev/null 作为默认重定向。但是,您必须在运行 a.pl 之前决定如何重定向。中途切换并不是一件容易的事。而且您无法恢复已发送到 /dev/null 的任何内容。
猜你喜欢
  • 2014-04-18
  • 2023-04-05
  • 2018-09-04
  • 2013-01-09
  • 2012-02-10
  • 1970-01-01
  • 2010-09-11
  • 2021-05-29
  • 1970-01-01
相关资源
最近更新 更多