2009-06-03 2 views
3

Perl에서 스크립트가 다른 스크립트 (예 : system 또는 qx을 통해 실행되고 있는지를 판단 할 수 있습니까? Perl에서 시스템 또는 qx 호출 내에서 스크립트가 실행되고 있는지 어떻게 알 수 있습니까?

$ cat foo.pl 
print "foo"; 
print "\n" if not $in_qx; # or the like. 

나는 스크립트가 exec를 통해 실행중인 경우이 적용되지 않습니다 알고 있습니다.

나는 systemfork으로 프로세스를 실행 것을 확실히 알고 나는 fork 당신이 부모 나 자식 프로세스에 여부에 따라 변수 값을 반환 할 수 있습니다 알고 있습니다. qx에 대해 확실하지 않습니다.

fork을 실제로 수행하지 않고 fork 처리 중에 있는지 확인하는 방법에 관계없이 확실하지 않습니다.

+0

실행중인 플랫폼은 무엇입니까? –

+0

"표준"리눅스, 특별히 특별한 것은 없습니다. – Danny

+0

내가 생각한 것은 포크가 부모 나 자식인지에 따라 0 또는 $ PID를 제공한다는 것입니다. 나는 이것을 볼 수있는 쉬운 방법이 있기를 희망했다. 그러나 지금까지 가장 좋은 대답은 괴롭힘처럼 보입니다. Unforunate, Owens는 모든 프로세스가 분기되고 나무를 걷는 재미있는 점을 가지고 있지만, 괴롭힐 수 있습니다. – Danny

답변

6

모든 프로세스는 다른 프로세스 (init 제외)에서 분기됩니다. 프로그램이 open, qx//, open2 또는 open3에서 POSIXisatty 함수를 사용하여 실행 되었더라도 프로세스 트리를 보지 않고 system으로 실행 중인지 확인하는 좋은 방법은 없습니다. 그럼에도 불구하고 그것은 어색해 질 수 있습니다 (예를 들어, system "nohup", "./foo.pl"은 부모로서 호출하는 perl 프로세스를 갖지 않습니다).

2

발신자를 제어합니까? 가장 간단한 방법은 인수를 전달하는 것입니다. --isforked.

+0

아니요. 내 스크립트는 다른 스크립트에 대한 래퍼 역할을하지만 실제로 인수를 수정할 수있는 기능이 없습니다. – Danny

5

"getppid"(상위 ID 가져 오기)를 사용하여 "누가 아빠인지"를 확인할 수 있습니다. 그런 다음 상위 ID가 pgrep 또는 이와 유사한 perl 스크립트인지 확인하십시오.

+0

getppid (및 대부분의 get * 함수)는 모든 플랫폼에서 구현되지 않습니다. PID가 어디에 있더라도, PID가 펄, 쉘 또는 다른 것의 인스턴스에 속하는지 여부를 판별해야합니다. –

+0

그는 약간의 표준 리눅스에서 실행 중이므로 아마도 여기에는 아무런 문제가 없을 것입니다. 어쨌든 그것은 일종의 진흙탕입니다. 확실하고 깨끗한 접근법은 없습니다. – wazoox

관련 문제