我可以捕获我启动的另一个进程的输出吗?

时间:2018-11-19 18:50:43

标签: linux perl system

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

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

谢谢

1 个答案:

答案 0 :(得分: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临时置于后台时)阅读

关于终止两个脚本:

    a.pl的
  • `ctrl-c`
  • `killall b.pl`表示b.pl

注意:

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