perlスクリプトで他の4つのperlスクリプトをWindowsで実行する方法を見つけて、すべてが完了したら、5番目のスクリプトを開始します。私はたくさんのことをチェックしましたが、どれも簡単ではないようです。提案を歓迎します。スクリプトはWindowsボックスで実行されます。スクリプト1〜4は、スクリプト5を開始する前に最初に終了する必要があります
3 に答える
Accept answers to your other questions
use threads
2.1. kick of the 4 scripts:
my @scripts = qw(... commands ...); my @jobs = (); foreach my $script (@scripts) { my $job = threads->create( sub { system($script); }); push @jobs, $job; }
2.2. Wait for completition
$_->join() foreach @jobs;
2.3. Kick off the last script
Edit
As you indicated that my solution didn't work for you, I fired up my Windoze box, taught me to use this horrible cmd.exe and wrote following test script. It is a bit simplified over over the above solution, but does meet your requirements about sequentiality etc.
#!/usr/bin/perl
use strict; use warnings; use threads;
my @scripts = (
q(echo "script 1 reporting"),
q(perl -e "sleep 2; print qq{hi there! This is script 2 reporting\n}"),
q(echo "script 3 reporting"),
);
my @jobs = map {
threads->create(sub{
system($_);
});
} @scripts;
$_->join foreach @jobs;
print "finished all my jobs\n";
system q(echo "This is the last job");
I used this command to execute the script (on Win7 with Strawberry Perl v5.12.2):
C:\...>perl stackoverflow.pl
And this is the output:
"script 1 reporting"
"script 3 reporting"
hi there! This is script 2 reporting
finished all my jobs
"This is the last job"
So how on earth does this not work? I would very much like to learn circumventing Perl's pitfalls the next time I write a script on a non-GNU system, so please enlighten me about what can go wrong.
use Proc::Background;
my @commands = (
['./Files1.exe ALL'],
['./Files2.exe ALL'],
['./Files3.exe ALL'],
['./Files4.exe ALL'],
);
my @procs = map { Proc::Background->new(@$_) } @commands;
$_->wait for @procs;
system 'echo', 'CSCProc', '--pidsAndExitStatus', map { $_->pid, $_->wait } @procs;
`mergefiles.exe`;
個人的な経験からfork()
、ActiveState Perl を使用すると、常にプロセスが順番に実行されるとは限りません。そこで使用されるスレッド化されたシミュレーションはfork()
、すべてのプロセスを開始し、特定のポイントに到達してから、一度に 1 つずつ実行するようです。これは、マルチコア CPU でも当てはまります。Straberry Perl も同じようにコンパイルされていると思います。また、fork()
はまだバッククォートに使用されていることに注意しsystem()
てください。これは単に抽象化されているだけです。
Windows で Cygwin Perl を使用すると、Cygwin 自体のfork()
呼び出しによって実行され、適切に並列化されます。ただし、Cygwin は別の点で低速です。