ファイルを計算するために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.txt
0が出力されます。
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
あなたの場合にはどんな問題がありますか?
root
cronにユーザー名フィールドがありません(昇格された権限を使用する必要がないように使用します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;