2012-02-28 1 views
0

매우 이상한 오류가 발생했습니다.Linux 명령 (cp, rm)은 perl 스크립트에서 실행되지 않습니다. 어떤 작품들. 그러나 오류가 반환되지 않습니다.

저는 리눅스 명령을 실행하는 perl 스크립트를 실행합니다. 그들은 다음과 같이 실행됩니다

my $err = `cp -r $HTML /tssobe/www/tstweb/$subpath/$HTMLDIR1`; 
myLog("$err"); 

그리고 $ 잘못을 반환하고 에러하지 않은 명령을 의미하는 비어 있습니다. (오른쪽?)

나는 exec ""또는 system()을 사용하여 linux 명령을 실행하려했지만 성공하지 못했습니다. 경로를 변경하려고했습니다. 같은.

또한 새로운 펄 스크립트에서 cp 명령 만 실행하려고했습니다. 그것은 작동합니다. 하지만 내 전체 펄 스크립트 아닙니다.

이 perl 스크립트에서 일부 명령이 작동하지만 일부 명령은 작동하지 않습니다.

어제 스크립트가 작동했는데, 더 이상 오늘 아침에 작동하지 않았습니다. 그 동안에는 변경된 사항이 없습니다.

나는 많은 것을 시도해 보았다. 아무도 아이디어가 있으면 기쁠 것이다.

편집 : 서버에서 많은 프로세스가 종결되지 않았습니다. 문제를 해결 한 이들을 청소하십시오. 문제는 다른 응용 프로그램과 관련되어 있지만 사용자 의견에 따라 로깅 기능을 향상시킬 것입니다.

+3

오류보고가 부족합니다. 스크립트 상단 부근에''autodie qw (: all); '을 추가하면, 문제가 생길 때 유용한 에러 메시지로 중단됩니다. – daxim

+1

'$ HTML' 또는'$ subpath' 또는'$ HTMLDIR1' 변수에 사용하는 입력에주의하십시오 - 쉘 메타 문자 (shell metacharacters)를 통해 허용하는 경우 (http://cwe.mitre.org/data /definitions/78.html), 당신은 비보안 도구를 작성했습니다. 셸 사용을 피하기 위해 ['File :: Copy :: Recursive'] (http://search.cpan.org/~dmuey/File-Copy-Recursive-0.38/Recursive.pm) 또는 유사한 도구를 사용하는 것이 더 좋습니다 완전히. – sarnold

답변

5

작은 문제 : 오류를 (당신은 또한 $? 반환 코드를 검사하지 않음)이 표시되지 않습니다 있도록, STDERR 캡처되지 않습니다.

당신은

my $err = `cp -r $HTML /tssobe/www/tstweb/$subpath/$HTMLDIR1 2>&1`; 

가 STDOUT에 STDERR 리디렉션 또는 명령을 실행하기위한 모듈 중 하나를 사용하도록해야한다.


큰 문제 :

당신은 펄 - 네이티브 모듈이 존재하는 펄에서 시스템 명령을 실행하지 않아야합니다. 이 경우 : File::Copy::Recursive 모듈.

roll your ownFile::Copy의 디렉토리를 복사 할 수도 있습니다.

1

백틱을 사용하고 있습니까? cp 명령에 -v를 추가하여 STDOUT에서 내용을보고 STDERR을 STDOUT으로 재 지정하고 STDERR의 오류 메시지가 아닌 cmd exitcode를 확인하십시오.

실행 직후 명령 출력을 인쇄하는 방법은 무엇입니까?

my $err = `cp -rv $HTML /tssobe/www/tstweb/$subpath/$HTMLDIR1 2>&1`; 
my $exitcode = $? >> 8; 
warn "Output: $err\nexitcode: $exitcode\n"; 

qx를 사용하는 것이 좋습니다. 이 옵션을 선택합니다 : http://www.perlmonks.org/?node_id=454715

+0

qx //가 왜 더 좋을 것이라고 생각하십니까? –

0

공백을 포함하여 쉘 특수 문자가 포함될 수있는 인수를 인용 할 수도 있습니다. 쉘이 주어진 문자열에서 단어 분리를 수행하므로 $HTML에 공백이 있으면 cp은 예상보다 많은 인수를 얻습니다.Perl은 매우 간단한 메커니즘을 가지고 있습니다 : \Q\E. 여기에 어떻게 하시겠습니까?

my $err = `cp -r \Q$HTML\E \Q/tssobe/www/tstweb/$subpath/$HTMLDIR1\E 2>&1`; 

영숫자를 제외하고는 쉘에 전달하기 전에 백 슬래시가 이스케이프 처리됩니다. 그리고 변수에 무엇이 있는지에 관계없이 cp에 정확히 2 개의 인수를 제공합니다.