2

ダウンロードしたいファイル URL のリストがあります。

http://somedomain.com/foo1.gz
http://somedomain.com/foo2.gz
http://somedomain.com/foo3.gz

私がやりたいことは、各ファイルに対して次のことです。

  1. wgetおよび と並行して foo1,2.. をダウンロードしますnohup
  2. ダウンロードが完了するたびに、それらを次のように処理しますmyscript.sh

私が持っているのはこれです:

#! /usr/bin/perl

@files = glob("foo*.gz");

foreach $file (@files) {
   my $downurls = "http://somedomain.com/".$file;
   system("nohup wget $file &");
   system("./myscript.sh $file >> output.txt");
}

問題は、ファイルのダウンロードがいつ終了するかを上記のパイプラインに伝えることができないことです。そのため、myscript.sh が正しく実行されません。

これを達成する正しい方法は何ですか?

4

3 に答える 3

2

perlを使用してこれを行う理由。代わりに bash を使用してください。以下はほんの一例です。

#!/bin/bash

for file in foo1 foo2 foo3
do
    wget http://samedomain.com/$file.gz .

    if [ -f $file.gz ];
    then
        ./myscript.sh $file.gz >> output.txt
    fi
done
于 2010-04-16T10:40:45.017 に答える
1

並列処理が必要な場合は、fork を使用して自分で実行するか、組み込みモジュールを使用して処理することができます。Parallel::ForkManagerを試してください。その使用法については、Perl でフォーク プールを管理するにはどうすればよいですか? でもう少し見ることができます。ですが、モジュールの CPAN ページには実際に役立つ情報があります。おそらく次のようなものが必要です。

use Parallel::ForkManager;

my $MAX_PROCESSES = 8; # 8 parallel processes max
my $pm = new Parallel::ForkManager($MAX_PROCESSES);

my @files = glob("foo*.gz");

foreach $file (@all_data) {
  # Forks and returns the pid for the child:
  my $pid = $pm->start and next; 

  my $downurls = "http://somedomain.com/".$file;
  system("wget $file");
  system("./myscript.sh $file >> output.txt");

  $pm->finish; # Terminates the child process
}

print "All done!\n";
于 2010-04-16T16:46:24.173 に答える
1

&&最初のコマンドが正常に完了した後にのみ 2 番目のコマンドが実行されるように、を使用してコマンドを組み合わせてみてください。

system("(nohup wget $file  && ./myscript.sh $file >> output.txt) &");
于 2010-04-16T06:04:07.967 に答える