"sudo lsof | grep 사용자 이름 | wc -l"을 호출하는 Perl 스크립트의 출력은 cron과 수동에서 다릅니다.

"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;

관련 정보