2012-12-21 3 views
0

논리 검사를 수행하고 특정 조건이 충족되는 경우 펄 스크립트를 실행 중입니다. 예 : 특정 시간이 지났다면, 그 데이터를 업데이트하는 다른 스크립트를 실행하는 리눅스 서버에서 system() 명령을 실행하고 싶습니다. 파일을 업데이트하는 스크립트는 현재 진행해야하는 파일의 양과 함께 10-15 초 걸리지 만 해당 달의 최고 시간대에는 최대 30 초가 될 수 있습니다.Perl이 시스템 명령을 호출하고 동시에 스크립트를 실행합니다.

나는 perl 스크립트를 실행하고 system() 명령을 실행해야한다면 나머지 스크립트를 완료하기 전에 system()이 끝날 때까지 기다리지 않기를 바란다. 이 문제를 해결하는 가장 좋은 방법은 무엇입니까?

는 작업 제어를 포함하여 쉘의 모든 기능을 사용할 수 있도록

+0

에서 (실행 백그라운드 프로세스 포함) 펄에서 외부 프로그램을 실행하는 방법에 대한 좋은 튜토리얼이있다? 특정 질문에 대해 최대한 많은 정보를 제공하는 것이 도움이되며, 질문을하기 전에 실사를했는지 다른 사람들에게 보여주는 것이 좋습니다. – slm

답변

4

시스템, 쉘에서 명령을 실행 해 주셔서 감사합니다. 그러니 그냥 이렇게 명령의 끝에서 & 스틱 :

system "sleep 30 &"; 
2

사용 fork가 자식 프로세스를 생성 한 후 아이에, 대신 시스템의 exec을 사용하여 다른 스크립트를 호출 할 수 있습니다. exec은 다른 스크립트를 별도의 프로세스에서 실행하고 즉시 반환하므로 하위 작업이 완료 될 수 있습니다. 그 사이에 부모 스크립트는 필요한 작업을 마치고 종료 할 수 있습니다.

this을 확인하십시오. 그것은 당신을 도울 수 있습니다.

this 페이지에서 fork를 사용하는 다른 좋은 예가 있습니다.

+0

링크를 가져 주셔서 감사합니다. 나는 이것이 도움이 될 것 같아! – Sandeme

1

게시 날짜로 인한 장난이 아니며, 좀비를 조심하십시오! 약간 까다 롭습니다. 자세한 내용은 perlipc을 참조하십시오. 그러나 귀하의 문제를 이해하는 한, 업데이터와 호출자 프로세스 사이의 관계를 유지할 필요가 없습니다. 이 경우, 그냥 "화재와 잊지"에 쉽게 :

이 예에서
use strict; 
use warnings qw(all); 
use POSIX; 

# fork child 
unless (fork) { 
    # create a new session 
    POSIX::setsid(); 

    # fork grandchild 
    unless (fork) { 

     # close standard descriptors 
     open STDIN, '<', '/dev/null'; 
     open STDOUT, '>', '/dev/null'; 
     open STDERR, '>', '/dev/null'; 

     # run another process 
     exec qw(sleep 10); 
    } 

    # terminate child 
    exit; 
} 

sleep 10 너무도 아이에 영향을주지 않습니다 부모 프로세스를 죽이고, 더 이상 프로세스의 그룹에 속하지 않는 .

관련 문제