기간을 하드 코딩하지 않고 Perl 처리를 일시 중지하려면 어떻게 해야 합니까?

StackOverflow https://stackoverflow.com/questions/884668

  •  23-08-2019
  •  | 
  •  

문제

시스템 셸을 호출하여 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를 사용하는 이유는 무엇입니까?)

네 가지 옵션을 생각해 볼 수 있습니다.

  1. Perl 스크립트는 CPAN과 같은 것을 사용하여 SFTP 전송 자체를 수행할 수 있습니다. 순::SFTP 상태를 추적할 수 없는 외부 작업을 생성하는 대신 모듈을 사용합니다.
  2. Perl 스크립트는 명령줄 SFTP 유틸리티(예: PSFTP)는 전송이 완료될 때까지 반환되지 않습니다.
  3. 또는 전송이 완료될 때까지 반환되지 않도록 exec_SFTP.vbs 스크립트를 변경하세요.
  4. 현재 그래픽 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 ()를 사용하여 읽기, 쓰기 및 오류 처리를위한 프로세스를 엽니 다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top