为什么此命令没有在Backticks(PERL)附带的后台运行

时间:2012-02-16 13:05:50

标签: perl

我在perl脚本中运行带有参数的脚本。脚本和参数用反引号括起来。当我使用'&'时参数后面的符号,命令不在后台运行,它在前台运行。有人可以在我的程序中找到错误。我需要保存输出并将其重定向到一个变量然后再记录。

以下是我的代码:

open (MYSM, "> /logs/${SM}.smlog");
open (MYSP, "> /logs/${SM}.splog");
$SM_LOG_VAR = ` ./sm.sh  $SE_VER  $SMS_VERSION   & ` ;
$SP_LOG_VAR = ` ./sp.sh  $SE_VER  $SMS_VERSION ` ;
print MYSM  $SM_LOG_VAR ;
print MYSP  $SP_LOG_VAR ;
close(MYSM);
close(MYSP);

该行:

$SM_LOG_VAR = ` ./sm.sh  $SE_VER  $SMS_VERSION   & ` ;  

未在背景中运行,后者完全用反引号括起来。

3 个答案:

答案 0 :(得分:2)

只有在命令完成时,反引号本身才会完成。您需要fork + execdup2之类的内容。无论如何,如果获取该信息的命令尚未完成,程序将如何继续使用$SM_LOG_VAR的值?

答案 1 :(得分:1)

我认为你提出错误的问题,从阅读你的代码让我猜出你真正的问题。你有一个Perl脚本可以做一些未显示的工作来设置一些变量然后用来运行2个外部程序。您希望同时运行这两个程序并将每个程序的输出存储到它自己的日志文件中。

实现此目的的最简单方法是在后台运行这两个程序并让shell执行重定向。

system("./sm.sh  $SE_VER  $SMS_VERSION > /logs/${SM}.smlog &");
system("./sp.sh  $SE_VER  $SMS_VERSION > /logs/${SM}.splog &");

这将返回到您的脚本而不等待任何一个程序完成,如果您在程序中稍后有代码要求完成命令,那么您可能需要更复杂的解决方案。

答案 2 :(得分:0)

我会看: Perl Backticks

如果你想在后台运行它我会尝试像open3: IPC::Open3