私は本当にうんざりの問題を抱えています。私はこれを狙ってしまいました。私はプログラミングの初心者です(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;
}
"クラッシュ"とはどういう意味ですか?コアダンプはありますか? stderrへのメッセージ?後者の場合は、正確に投稿してください。前者の場合、デバッグシンボルをインストールしてスタックトレースを収集すると便利です。 –
さらにもう1つ: 'system'の戻り値は何ですか? – ikegami
OK、@CharlesDuffy問題を解決しました。なんらかの理由で、stderrに書き込もうとすると、5回目の繰り返しでクラッシュが発生していました。 'script.pl >> log00.log 2>&1'を使ってリダイレクトしたところ、動作し始めました。 これは、古いサーバーで起こっていなかった場合、なぜこれが起こっているのか、そして4回目の反復後に何が起こったのかについて、まだ多くの混乱を残しています。 @ikegamiシステムの戻り値が何であるかは分かりませんが、どうすれば得られますか? 私の問題は解決されていますが、 – thereleventfridge