我有一个过程,当时 执行如下:
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";
即使上面的脚本也会抛出相同的错误。 目的是在后台执行该过程并继续下一个语句,而不关心过程发生的事情,而且我也不需要将过程的输出内部运行到控制台。
有人可以帮忙吗?
答案 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);