"sudo lsof | grep ユーザー名 | wc -l" を呼び出す Perl スクリプトの出力は、cron と手動で異なります。

ファイルを計算するためにPerlスクリプトを実行するのに問題があります。

#!/usr/bin/perl
    $stat=`sudo lsof | grep username | wc -l`;
    $date=`date '+ %Y/%m/%d-%H:%M:%S'`;
    $exit=`echo $?`;
    if ( $exit == 0 ) {
            print "$date\n Statistic: $stat\n";
            exit 0;
            }

このスクリプトを手動で実行すると、良い結果が得られます。

# perl test.pl
 2020/07/30-19:17:10
 Statistic: 580

cronjobで実行すると*/5 * * * * perl /filepath/test.pl >> /filepath/test.txt0が出力されます。

 2020/07/30-19:20:01
 Statistic: 0

RHEL4システムで実行されており、ファイルを添付して統計を取得するためにcronjobとして実行しようとしています。

ベストアンサー1

拡張スクリプトが機能する可能性があります。

#!/usr/bin/perl
use POSIX qw(strftime);
$user = shift; $outputfile = shift;
$lsof=`lsof 2> /dev/null`;
exit $? unless($? == 0);
$count=0;
foreach(split /\n/, $lsof) {
        $count++ if(/$user/);
}
open($fh, ">>$outputfile") or die "Can't append to $outputfile";
print $fh strftime(" %Y/%m/%d-%H:%M:%S\n Statistic: $count\n", localtime);
close $fh;

クローンでは次のようになります

*/5 * * * * root perl /filepath/test.pl username /filepath/test.txt

あなたの場合にはどんな問題がありますか?

  • rootcronにユーザー名フィールドがありません(昇格された権限を使用する必要がないように使用しますsudo
  • ユーザー名があってもsudoパスワードの欠落により失敗します。
  • echo $?echoコマンドの戻りコードになり、他のすべてのコマンドは無視されます。
  • 正確に間違っているわけではありませんが、お勧めできません。 Perlscriptにシェルコードが多すぎます。
  • おそらく間違っていませんが、私はあなたがそれをしたくないと思います。 lsofのすべての警告はフィルタリングされません。

それでも機能しない場合は、lsofフルパスに切り替えてみてください(ほとんど/usr/bin/lsof)。

編集する:もう一つの質問:あなたと私の正規表現は、ユーザー名ではなく対応する文字列をgrep含む行も見つけるでしょう。このコードは良いです:username

#!/usr/bin/perl
use POSIX qw(strftime);
$user = shift; $outputfile = shift;
$count=split(/n/,`lsof -u $user 2> /dev/null`);
exit $? unless($?==0);
open($fh, ">>$outputfile") or die "Can't append to $outputfile";
print $fh strftime(" %Y/%m/%d-%H:%M:%S\n Statistic: $count\n", localtime);
close $fh;

おすすめ記事