0

我有一个过程,
执行如下:

process_name > file.txt

会将所有输出重定向到 file.txt 以及控制台。

像这样执行时

process_name >& file.txt&

将输出重定向到 file.txt 但不会将输出打印到控制台,返回控制台上的 pid。

现在我想执行第二种在 perl 脚本中运行进程的方法!我怎么能这样做?目前我正在使用以下方法:

#!/usr/bin/perl

use strict;
use warnings;

my $res = `bsm_adjust_controller -F -ra -d 'subnetwork=NETSim_STD/bsc=0005' -f /tmp/31102012/Task_31102012_1421_0005.log >& /tmp/31102012/Ctrl_31102012_1421_0005.log&`;
print $res;

当我运行它给出的脚本时:

 ./temp.pl
sh: /tmp/31102012/Ctrl_31102012_1421_0005.log: bad number

我还尝试了以下方法:

#!/usr/bin/perl

use strict;
use warnings;

my $res = "bsm_adjust_controller -F -ra -d 'subnetwork=NETSim_STD/bsc=0005' -f /tmp/31102012/Task_31102012_1421_0005.log >& /tmp/31102012/Ctrl_31102012_1421_0005.log&";

open(CMD, '-|', $res) || die "couldn't run $res: $!\n";

即使是上面的脚本也会抛出同样的错误。目的是在后台执行进程并继续执行下一个语句,而不关心进程发生了什么,而且我不需要在内部运行进程的输出到控制台。

有人可以帮忙吗?

4

1 回答 1

1

这行得通:

#!/usr/bin/perl

use strict;
use warnings;

my $cmd="bsm_adjust_controller -F -ra -d 'subnetwork=NETSim_STD/bsc=0106' -f /tmp/31102012/Task_31102012_1421_0005.log >/tmp/31102012/Ctrl_31102012_1421_0005.log";

open STDERR, ">/dev/null";
print "Redirected stderr to /dev/null\n";

my $pid=open (FH, "-|",$cmd);
if ($pid) { #parent
    print "/tmp/31102012/Task_31102012_1421_0005.log";
    exit; 
          } 
print "Redirected stderr to /dev/null\n";
close(FH);
于 2012-10-31T13:00:42.357 回答