2012-04-01 17 views
0

私は本当にうんざりの問題を抱えています。私はこれを狙ってしまいました。私はプログラミングの初心者です(2年以上)。これが何か明白な場合、または申し訳ありませんが、適切な詳細を提供していません。cronで実行しているときにカールがクラッシュする

問題は... 私はそれを呼び出すときにカールがクラッシュしますwhileループの5回目(ルートのcronから実行されるとき)。 ログインしている間にループを手動で実行するとカールは正常です(約50回の反復)。

私はbashスクリプトが perlスクリプトは、このwhileループの第5回の反復で、whileループ 内カール呼び出すperlスクリプトを実行するcron からbashスクリプトを実行し

、カールが呼び出されていないとクラッシュする(何も出力)
  • 私はそれは私がした場合
  • 罰金4回を実行して、私は、それは環境ベースだとは思わないルートとしてはcron(/ crontabの/ファイル/へのcrontab -uルート/パス/)
  • を実行していますよwhileループを4回繰り返して終了し、もう一度起動すると、それでも失敗しますwhileループではありません。
  • この正確なスクリプトは、私は、このカールとcron間の問題だと思う
  • (私はUbuntuのサーバ10.04になりましたよ)Ubuntuデスクトップを実行している私の古いサーバー上で正常に動作します。

クラッシュの行は、この(記入VARS)のように見えます

$err = system("/usr/bin/curl -f -v -s -r "36155357-36259993,36790101-37194555,53623979-53745261" http://nomads.ncep.noaa.gov/pub/data/nccf/com/gfs/prod/gfs.2012040100/master/gfs.t00z.mastergrb2f21 -o /root/Desktop/getGFS_uploadGFS/GFS/windvect/gfs.t00z.mastergrb2f21.tmp"); 

誰もが、それははるかに高く評価されるだろう任意のアイデアを持っている場合、私は、今、完全に困惑の書き込みです。以下はwhileループです(クラッシュポイントが下に表示されます)。

while ($fhr <= $hr1) { 
    if ($fhr <= 9) { $fhr="0$fhr"; } 
    $url = $URL; 
    $url =~ s/\$FHR/$fhr/g; 
    $url =~ s/\${FHR}/$fhr/g; 
    $file = $url; 
    $file =~ s/^.*\///; 

    # 
    # read the inventory 
    # $line[] = wgrib inventory, $start[] = start of record (column two of $line[]) 
    # 

    if ($windows eq 'yes') { 
     $err = system("$curl -f -s $url$inv -o $OUTDIR/$file.tmp"); 
     $err = $err >> 8; 
     if ($err) { 
      print STDERR "error code=$err, problem reading $url$inv\n"; 
     sleep(10); 
     exit(8); 
     } 
    open (In, "$OUTDIR/$file.tmp"); 
    } 
    else { 
     open (In, "$curl -f -s $url$inv |"); 
    } 

    $n=0; 
    while (<In>) { 
     chomp; 
     $line[$n] = $_; 
     s/^[^:]*://; 
     s/:.*//; 
     $start[$n] = $_; 
     $n++; 
    } 
    close(In); 
    if ($n == 0) { 
     print STDERR "Problem reading file $url$inv\n"; 
     sleep(10); 
     exit(8); 
    } 

    # 
    # find end of record: $last[] 
    # 

    $lastnum = $start[$n-1]; 
    for ($i = 0; $i < $n; $i++) { 
     $num = $start[$i]; 
     if ($num < $lastnum) { 
     $j = $i + 1; 
     while ($start[$j] == $num) { $j++; } 
     $last[$i] = $start[$j] - 1; 
     } 
     else {  
     $last[$i] = ''; 
     } 
    } 

    if ($action eq 'inv') { 
     for ($i = 0; $i < $n; $i++) { 
     print "$line[$i]:range=$start[$i]-$last[$i]\n"; 
     } 
     exit(0); 
    } 

    # 
    # make the range field for Curl 
    # 

    $range = ''; 
    $lastfrom = ''; 
    $lastto = '-100'; 
    for ($i = 0; $i < $n; $i++) { 
     $_ = $line[$i]; 
     if (/$LEVS/i && /$VARS/i) { 
     $from=$start[$i]; 
     $to=$last[$i]; 

     if ($lastto + 1 == $from) { 
      $lastto = $to; 
     } 
     elsif ($lastto ne $to) { 
      if ($lastfrom ne '') { 
       if ($range eq '') { $range = "$lastfrom-$lastto"; } 
       else { $range = "$range,$lastfrom-$lastto"; } 
      } 
      $lastfrom = $from; 
      $lastto = $to; 
     } 
     } 
    } 
    if ($lastfrom ne '') { 
     if ($range eq '') { $range="$lastfrom-$lastto"; } 
     else { $range="$range,$lastfrom-$lastto"; } 
    } 


    if ($range ne '') { 


    ################################################################################# 
    ########### THE BELOW LINE IS WHERE CURL IS CALLED AND IT CRASHES ############### 
    ################################################################################# 


     $err = system("$curl -f -v -s -r \"$range\" $url$grb -o $OUTDIR/$file.tmp"); 
     $err = $err >> 8; 
     if ($err != 0) { 
     print STDERR "error in getting file $err $url$grb\n"; 
     sleep(20); 
     exit $err; 
     } 
     rename "$OUTDIR/$file.tmp", "$OUTDIR/$file"; 
     $output = "$output $OUTDIR/$file"; 
    } 
    else { 
     print "no matches (no download) for $file\n"; 
    } 
    $fhr += $dhr; 
} 
+2

"クラッシュ"とはどういう意味ですか?コアダンプはありますか? stderrへのメッセージ?後者の場合は、正確に投稿してください。前者の場合、デバッグシンボルをインストールしてスタックトレースを収集すると便利です。 –

+0

さらにもう1つ: 'system'の戻り値は何ですか? – ikegami

+0

OK、@CharlesDuffy問題を解決しました。なんらかの理由で、stderrに書き込もうとすると、5回目の繰り返しでクラッシュが発生していました。 'script.pl >> log00.log 2>&1'を使ってリダイレクトしたところ、動作し始めました。 これは、古いサーバーで起こっていなかった場合、なぜこれが起こっているのか、そして4回目の反復後に何が起こったのかについて、まだ多くの混乱を残しています。 @ikegamiシステムの戻り値が何であるかは分かりませんが、どうすれば得られますか? 私の問題は解決されていますが、 – thereleventfridge

答えて

0

なぜあなたはカールするのですか?それだけの範囲なら、それは簡単です:

use v5.10.1; 

use Mojo::UserAgent; 

say Mojo::UserAgent->new->get(
    'http://www.example.com', 
    { 'Range' => 'bytes=500-600' } 
    )->res->body; 

libcurlへのPerlバインディングもありますNet::CurlWWW::Curlが。

+0

おかげで、この先端のためにあなたの助けのための おかげで、シェルスクリプトが部分的GRIBファイルをダウンロードカール使用NOAAによって書かれた複数のもの(いくつかのperlスクリプトをトリガし、なぜ私は完全には理解していません他の多くのモジュラーシェルスクリプトもこのスクリプトから生成されます)。カールを使用するperlスクリプトはNOAAによって事前に書かれたので、私は実際にそれらがどのように書かれているか調査する時間はなかった。 http://www.cpc.ncep.noaa.gov/products/wesley/get_gfs.html – thereleventfridge

関連する問題