在perl中运行后台进程

时间:2012-10-31 12:10:59

标签: perl unix command-line

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

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";

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

有人可以帮忙吗?

1 个答案:

答案 0 :(得分: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);