2012-02-22 3 views
6

다른 스크립트 newscript.pl을 호출하는 Perl 스크립트 (예 : script.pl)를 작성하고 있습니다. 두 스크립트의 PID를 script.pl에만 가져오고 싶습니다. 본인은 PID가 script.plnewscript.pl에 의해 생성 된 캡처 할 newscript.plPerl의 시스템 기능으로 생성 된 프로세스의 PID를 얻으려면 어떻게해야합니까?

system("perl newscript.pl"); 

실행 내가 system를 호출이 후 다음 코드

my $pid = Unix::PID->new(); 
my @p = $pid->get_pidof($pid->get_command($$), 1); 

를 사용하여 script.pl의 PID를 얻을 수 있습니다.

답변

5

system이 반환 될 때 생성 된 프로세스는 이미 종료되어 로그 분석에 유용한 흥미로운 기록 참조 —으로 유지됩니다. fork 먼저 수행하고 부모 프로세스가 중 & hellip를 종료하는 자식 프로세스를 기다린다 것을 제외하고

system LIST
system PROGRAM LISTexec LIST 정확히 같은 일을;

당신은 모두 script.plnewscript.pl, fork의 PID를 원하고 자신의 수명을 직접 관리하는 경우. 문제에 대한 구체적인 정보가 있으면 ’ 다시 태클에 대해보다 구체적인 제안을 할 수 있습니다. 프로그램의 다른 인스턴스를 차단하려면


은 일반적인 기술 협력 잠금에 운영 체제 ’의 시설을 사용하는 것입니다 : 시작시, 시도가 특정 파일을 잠글 수 있습니다. 성공할 경우, 프로그램은 ’을 알고 있습니다. 그렇지 않으면 다른 프로세스에 이미 잠금이 설정되어 있으므로 새 프로세스가 종료됩니다. 아래 예제를 참조하십시오. 컨트롤이 critical section 안에있는 상태에서 핸들을 유지해야

#! /usr/bin/env perl 

use strict; 
use warnings; 

use Fcntl qw/ :flock /; 
use File::Basename; 
use POSIX qw/ strftime /; 

$0 = basename $0; 

my $LOCK = "$ENV{HOME}/.lock-$0"; 

sub logmsg { 
    my($msg) = @_; 
    my $t = strftime "%F %T", localtime time; 
    warn "$0: $t - $$ - $msg\n"; 
} 

sub take_lock { 
    open my $fh, ">", $LOCK or die "$0: open $LOCK: $!"; 

    unless (flock $fh, LOCK_EX | LOCK_NB) { 
    logmsg "failed to lock $LOCK; exiting."; 
    exit 1; 
    } 

    $fh; 
} 

my $token = take_lock; 
logmsg "processing..."; 
sleep 2 * 60; 
logmsg "done."; 

주 오픈 take_lock에서 돌아왔다. 위의 코드는 그것을 불투명 한 토큰으로 취급합니다. 프로그램이 종료되면 Perl은 자동으로 잠금을 해제하는 파일 핸들을 닫습니다. ’을 사용하지 않으려면 자물쇠를 버리기 때문에 무효화 문맥에서 take_lock으로 전화하십시오.

+0

내 script.pl은 newscript.pl 및 기타 많은 스크립트와 같은 다른 스크립트를 예약하는 작업을 수행합니다. 나는 cron에서 직접 스케쥴링을 할 수 없으므로 스케줄러 역할을하는이 상위 스크립트를 작성하려고 생각했다. 자, MySql 데이터베이스에서 스크립트 이름을 얻는 동안 예약 된 스크립트가 반복되는 경우가있을 수 있습니다. 이미 실행중인 스크립트를 원하지 않습니다. 따라서 예약 된 스크립트의 PID를 캡처 할 수 있다면 생각하고있었습니다. 나는이 Pids의 기초를 검사하고 동일한 원본의 동시 실행을 피할 수있다.당신의 도움에 감사드립니다. – Deepak

+0

포크를 사용하지 않고 다른 방법이 있습니까? – Deepak

+0

배타성이 필요하면'flock()'을 사용하십시오. 'Fcntl qw (: flock) 사용; flock ($ lockfd, LOCK_NB | LOCK_EX) 또는 "같은 스크립트가 이미 실행 중입니다"; # ...'$ lockfd는 filename이 아닌 파일 설명자입니다 (flock하기 전에 열어야 함). – Dallaylaen

9

현재 프로세스의 프로세스 번호는 $$입니다. 하위 프로세스의 프로세스 번호를 받으려면 system 대신 open3을 사용하십시오.

관련 문제