배열의 출력을 가져와 새 배열에 넣습니다(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"`
}

관련 정보