0

私は以下のように実行されたときにプロセスを持ってい
ます:

process_name > file.txt

すべての出力をfile.txtとコンソールにリダイレクトします。

このように実行すると

process_name >& file.txt&

出力をfile.txtにリダイレクトしますが、出力をコンソールに出力せず、コンソールにpidを返します。

今、私はperlスクリプト内でプロセスを実行する2番目の方法を実行したいと思います!どうすればこれを行うことができますか?現在、私は以下の方法を使用しています:

#!/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 に答える