기간을 하드 코딩하지 않고 Perl 처리를 일시 중지하려면 어떻게 해야 합니까?
문제
시스템 셸을 호출하여 SFTP로 일부 파일을 가져오고 WinZip으로 압축을 푸는 다음 코드 조각이 포함된 Perl 스크립트가 있습니다.
# Run script to get files from remote server
system "exec_SFTP.vbs";
# Unzip any files that were retrieved
foreach $zipFile (<*.zip>) {
system "wzunzip $zipFile";
}
일부 파일을 검색하더라도 압축이 풀리지 않습니다. 파일이 검색되고 SFTP 연결이 닫힐 때 Perl 스크립트가 이미 압축 해제 단계를 완료하여 압축을 풀 항목을 찾지 못하기 때문입니다.
나의 단기적인 해결책은 삽입하는 것입니다.
sleep(60);
그러나 이는 SFTP 연결이 60초 이내에 완료된다고 가정합니다. 이는 때로는 과대평가될 수도 있고 과소평가될 수도 있습니다.
압축 해제 단계를 진행하기 전에 SFTP 연결이 닫힐 때까지 Perl을 일시 중지시키는 더 효과적인 방법이 있습니까?
편집하다:응답자들은 Perl이 파일 전송을 수행하도록 하는 대신 VB 스크립트를 사용하는 것에 대해 의문을 제기했습니다(그리고 합리적으로 그렇습니다).이는 보안과 관련이 있습니다. VB 스크립트는 다른 사람이 유지 관리하며 SFTP를 수행할 권한이 있습니다.
해결책
*.vbs 파일에서 코드를 확인하십시오. 그만큼 system
기능은 실행이 계속되기 전에 자식 프로세스가 완료 될 때까지 기다립니다. *.vbs 파일이 FTP를 수행하고 즉시 반환하기 위해 배경 작업을 포킹하는 것으로 보입니다.
다른 팁
완벽한 세상에서 당신의 대본은 사용하기 위해 다시 작성 될 것입니다. net :: sftp :: 외국 그리고 아카이브 :: 추출..
첫 번째 시스템 호출 전에 터치 파일을 생성하는 것일 수 있습니다. 파일이 완료되면 파일을 삭제하고 잠시 시간을 보내십시오.
while(-e 'touch.file') {
sleep 5;
}
# foreach [...]
물론 .VBS가 실패하고 터치 파일을 배출되지 않은 다른 많은 부작용을 떠나면주의를 기울여야합니다. 이것은 System () 호출없이 다시 쓸 시간을 얻을 때까지 빠른 솔루션 (다른 제안 중 어느 것도 작동하지 않는 경우)를위한 것입니다.
SFTP 전송이 완료될 때까지 Perl이 기다릴 수 있는 방법이 필요하지만 현재 스크립트가 작성되어 있으므로 Perl은 이를 알 수 있는 방법이 없습니다.(적어도 두 개의 스크립팅 언어와 (GUI?) SFTP 클라이언트를 결합한 것 같습니다.이는 작동할 수 있지만 정확하게 신뢰할 수 있거나 강력하지는 않습니다.SFTP 전송을 시작하기 위해 VBscript를 사용하는 이유는 무엇입니까?)
네 가지 옵션을 생각해 볼 수 있습니다.
- Perl 스크립트는 CPAN과 같은 것을 사용하여 SFTP 전송 자체를 수행할 수 있습니다. 순::SFTP 상태를 추적할 수 없는 외부 작업을 생성하는 대신 모듈을 사용합니다.
- Perl 스크립트는 명령줄 SFTP 유틸리티(예: PSFTP)는 전송이 완료될 때까지 반환되지 않습니다.
- 또는 전송이 완료될 때까지 반환되지 않도록 exec_SFTP.vbs 스크립트를 변경하세요.
- 현재 그래픽 SFTP 클라이언트를 사용 중이고 어떤 이유로든 전환할 수 없는 경우 다음과 같은 스크립팅 언어를 사용하는 것이 좋습니다. 오토잇 펄 대신.AutoIt에는 창의 상태 변경 등을 기다리는 기능이 있어 활동 완료를 보다 쉽게 모니터링할 수 있습니다.
옵션 1 또는 2가 가장 강력하고 안정적입니다.
제가 제안할 수 있는 최선의 방법은 파일 전송이 완료된 후에만 종료되도록 exec_SFTP.vbs를 수정하는 것입니다. system
호출된 프로그램이 완료될 때까지 기다리면 문제가 해결됩니다.
system LIST system PROGRAM LIST Does exactly the same thing as "exec LIST", except that a fork is done first, 부모 과정은 아동 과정이 완료되기를 기다립니다..
VBS 스크립트가 종료 될 때까지 살아남도록 수정할 수 없다면 하위 프로세스 생성을 추적 할 수 있습니다. 하위 프로세스 ID를 받으면 VBS의 다양한 자손이 종료되는시기를 알 수 있습니다.
Win32 :: 프로세스 :: 정보 실행중인 프로세스에서 하위 프로세스 ID를 얻을 수 있습니다.
어쩌면 이것은 멍청한 질문이지만 왜 net :: sftp 그리고 아카이브 :: 추출 파일을 다운로드하고 압축 할 수있는 Perl 모듈?
system
명령이 실행되는 쉘이 반환 될 때까지 돌아 오지 않습니다. 이는 그래픽 프로그램 및 파일 연결을 시작하는 데 잘못된 것일 수 있습니다.
다음 도움이 있는지 확인하십시오.
system('cscript exec_SFTP.vbs');
use Win32::Process;
use Win32;
Win32::Process::Create(my $proc, 'wscript.exe',
'wscript exec_SFTP.vbs', 0, NORMAL_PRIORITY_CLASS, '.');
$proc->Wait(INFINITE);
살펴보십시오 IPC :: Open3
IPC :: Open3- Open3 ()를 사용하여 읽기, 쓰기 및 오류 처리를위한 프로세스를 엽니 다.