配列の出力を取得し、新しい配列に入れます(perlスクリプト)。

配列の出力を取得し、新しい配列に入れます(perlスクリプト)。

別のワークステーションを調べてログがあることを確認している場合は、削除するように配列を設定しました。問題は、スクリプトを実行するたびにすべてのワークステーションを毎回クロールする必要があることです(ログ削除コマンドは一度に一度だけ実行できます)。最初にすべてのワークステーションを確認し、ログがある場合は、ログがあるワークステーションのみを確認するように次のアレイを設定する方法はありますか?そして、誰も残らなくなるまで続けますか? 100台のワークステーションにのみログがある場合は、100の異なるワークステーションを確認するのに時間がかかります。これまでの内容は次のとおりです(Unix AIXおよびPerl v5.6.1)。

my @workstation = qw(ws1 ws2 ws3 ws4 ws5 ws6 ws7 ws8 ws9 ws10 ws11 ws12);

foreach my $workstation (@workstation){
$logcount = `ssh -q $workstation "ls /logs/$workstation | wc -l"`;
chomp $logcount;

if($logcount == 0){
print "";
}

if($logcount > 0){
print "$workstation: $count\n";
`ssh -q $workstation "/tools/log_remover /logs/$workstation"`
}

答え1

ただ削除したいのですが、なぜ数を確認しますか?ファイルを直接削除してください。 7日前のログを削除する単純なbashバージョン:

#!/bin/bash

HOSTS=( ws1 ws2 ws3 ws4 ws5 ws6 ws7 ws8 ws9 ws10 ws11 ws12 )

for CURRHOST in ${HOSTS[@]}
do
    ssh -q $CURRHOST "find /logs/$CURRHOST -type f -mtime +7 -exec rm -v {} \;"
done

Perlの使用に固執し、ホストを含​​む配列をログファイルで埋めたい場合は、次のようにします。

my @workstation = qw(ws1 ws2 ws3 ws4 ws5 ws6 ws7 ws8 ws9 ws10 ws11 ws12);
my %wscount;

foreach my $workstation (@workstation){
  $logcount = `ssh -q $workstation "ls /logs/$workstation | wc -l"`;
  chomp $logcount;
  if ( $logcount > 0 )
  {
    $wscount{$workstation}=$logcount;
  }
}

foreach my $wswithlog (keys %wscount){
  printf "host $wswithlog: $wscount{$wswithlog}\n";
  `ssh -q $wswithlog "/tools/log_remover /logs/$wswithlog"`
}

関連情報