파일 계산을 위해 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;