2016-04-09 15 views
1

"lvs"をperlスクリプトで実行して出力を解析しようとしています。Linux LVM lvsコマンドはcron perlスクリプトからは失敗しますが、直接cronから動作します

my $output = `lvs --noheadings --separator : --units m --nosuffix 2>&1`; 
my $result = $?; 
if ($result != 0 || length($output) == 0) { 
    printf STDERR "Get list of LVs failed (exit result: %d): %s\n", 
    $result, $output; 
    exit(1); 
} 
printf "SUCCESS:\n%s\n", $output; 

上記のスクリプトをターミナルウィンドウから実行すると、正常に動作します。私は同じ「LVS --noheadings --separator実行する場合

Get list of LVs failed (exit result: -1): 

注任意の出力(stdout +標準エラー出力)

の欠如を:私はそれが失敗したのcron経由で実行する場合--unitsメートルを - nosuffix "コマンドをcronで直接実行すると、うまく実行され出力されます。

open3()を使用するようにperlスクリプトを変更した場合も、出力がなくても同じエラーが発生します。

lvsコマンドに "-d -d -d -d -v -v -v"を追加して冗長/デバッグ出力を有効にすると、ターミナルからperlスクリプトを実行すると表示されますが、 cron/perlで実行しても出力はありません。

Iが、/ usr/binに/ perlのでRHEL 7.2でこれを実行している(5.16.3)

任意の提案?

答えて

0

lvsへの絶対パスを使用してみてください:

my $output = `/sbin/lvs --noheadings --separator : --units m --nosuffix 2>&1`; 
2

perldoc systemによると、「-1 戻り値は、(2)システムコールが($を検査プログラムや待ち時間の誤差を開始するために失敗したことを示し!理由のため) "出力がない理由は、lvsが正常に起動していないためです。

cron関連の問題の通常の性質を考えると、実行に失敗する可能性が最も高い理由は、$PATHcronで使用されていない可能性が高いと言えます。フルパスを指定してみてください。問題が解決しない場合は、オペレーティングシステムのエラーメッセージについて$!を確認してください。

+1

はい、問題は、cron + perl内で$ PATHに "lvs"がある/ sbinを含めるように設定されていないことです。したがって、 "/ sbin/lvs"と指定すると問題が解決されます。ありがとうございました!!! –

関連する問題