2017-12-21 23 views
1

Perl에 처음 접했습니다. 리눅스 컴퓨터에 Perl 스크립트가 있습니다.이 스크립트는 자체 로그 파일을 가지고 있습니다. 로그 파일 이름은 스크립트가 작동하는 데이터 (날짜, 파일 이름, 데이터 유형 등)에 따라 달라질 수 있습니다.Perl 스크립트는 cron에서 실행할 때 파일에 STDOUT을 출력하지 않습니다.

일부 pionts의 스크립트는 일부 정보를 STDOUT에 제공하는 system() 호출로 원시 실행 파일을 호출합니다. STDERR - 몇 분에 걸쳐 수십에서 수 백 라인. 실행 파일이 완료되면 스크립트는 계속 진행하고 로그 파일에 다른 정보를 기록합니다.

지금까지 스크립트는 고유 한 실행 파일 출력없이 Perl 스크립트 로그와 동일한 파일에 로그인하기 위해 자체 출력 만 기록했습니다.

#!/usr/bin/perl 
#some other code 
@array_executable_and_parameters = qw/echo foo/ ; 
open $log_fh, '>>', 'log/logfile1.txt'; 
*STDOUT = $log_fh; 
*STDERR = $log_fh; 
print "log_fh=$log_fh\n"; 
system(@array_executable_and_parameters); 

$logfilename='log/logfile2.txt'; 
open(LOGFILEHANDLE, ">>$logfilename"); 
*STDOUT = LOGFILEHANDLE; 
*STDERR = LOGFILEHANDLE; 
print LOGFILEHANDLE "Somethinglogged\n"; 
system(@array_executable_and_parameters); 

이 스크립트는 수동으로 실행할 때 작동하지만 cron을 실행할 때는 작동하지 않습니다.

리눅스에서 crontab을 리다이렉트하는 것이 가능하다는 것을 알고 있지만, 로그 할 파일 이름을 알아야합니다. 일부 데이터가 도착할 때만 알려 지므로 필자에게 적합하지 않은 것으로 보입니다. 필자는 스크립트 내에서 최대한 많은 것을 가지고 싶습니다. Linux 등등에 많은 의존성이 없기 때문에, Perl을 사용하기위한 라이브러리를 추가로 설치할 필요가 없습니다. 최소한의 설치라고 가정하십시오.

어떻게하면 STDOUT 및 STDERR을 Perl 스크립트 내부에서 특정 파일로 리디렉션합니까?

그리고 가능한 경우 현재 STDOUT이 (가)가는 파일 이름을 어떻게 감지합니까?

+0

방법이있다 Perl 스크립트가 호출되었고'system()'을 얼마나 정확하게 호출하고 있습니까? * * * * * /home/username/perl/myscript.pl 수동 : 실행 파일과 같은 스크립트 내부에서 호출 ./home/username/perl/myscript.pl : crontab을에서 – tripleee

+0

시스템 (@array_executable_and_parameters); – uldics

+0

당신의 대화식 예제는'/ home' 앞에 점을 가지고있어서 당신이 루트 디렉토리에 있지 않으면 그것들은 동일하지 않습니다; 그러나 나는 그것이 거짓 정보라고 생각합니다. 데모 스크립트에서 간단한'system()'호출로 질문을 편집 할 수 있습니까? – tripleee

답변

4

재 할당 *STDOUT은 Perl 내부 STDOUT 스칼라 바인딩에만 영향을줍니다. 시스템 수준에서 표준 출력을 리디렉션 할 수있는 적절한 방법은 실패 할 수 있습니다 당신은 유사하게 다른 시스템 호출에서 오류를보고한다

open (STDOUT, '>&', $log_fh) or die "$0: could not: $!"; 

같은 (그리고 use strict 등)입니다.

cron

홈 디렉토리에 작업을 실행하므로 경로 $HOME/log이 존재하지 않는 경우, 스크립트는 로그 파일 핸들을 여는 데 실패합니다 (당신이 open 오류를 기록하지 않기 때문에, 조용히!)

+0

'선택 '은 어떨까요? – simbabque

+1

구체적으로 테스트하지는 않았지만, TMTOWTDI. – tripleee

+3

@simbabque,'select'도'system'에 영향을 미치지 않습니다. 'open (STDOUT,'> ','... ')'만이 fd 1을 변경합니다. – ikegami