Perl을 사용하고 Linux 또는 Solaris 환경에서 다른 프로세스의 환경 변수를 읽는 방법이 있습니까?

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

문제

Perl에서는 다른 프로세스의 환경을 읽어야 합니다.

  • 스크립트가 루트로 실행 중입니다. 권한을.
  • 스크립트는 다음과 같습니다. Linux와 Solaris 모두에서 실행됩니다.
  • 나는 적어도 Linux와 Solaris 사이에서 플랫폼에 구애받지 않는 솔루션을 원합니다.Linux에서는 /env/<proc_id>/environ을 조사하면 답을 얻을 수 있습니다.
  • 나는 포크하는 것을 피하고 싶습니다.이미 "/usr/ucb/ps -auxwwwe $pid"를 분기하는 솔루션이 있습니다.

어떤 아이디어가 있나요?

도움이 되었습니까?

해결책

Solaris의 경우 다음을 시도해 볼 수 있습니다. CPAN의 procfs 모듈.이 모듈이 아직 꽤 초기 단계인 것처럼 보이지만 다음 인용문은 희망적으로 들립니다.

Brian Farrell은 다음을 처리하는 매우 유용한 패치를 보냈습니다. ARGV 및 공정 환경 검사 현재 실행 중인 프로세스 외에.

나는 이것이 아마도 초기 환경일 뿐이라고 생각합니다. environ linux 아래의 파일), 하지만 그게 당신이 원하는 것 같나요?

그렇지 않으면, 포크하고 싶지 않다고 말씀하시겠지만, 간단한 해결책은 아마도 ~20줄의 C를 크랭크하여 Linux와 정확히 동등한 Solaris 환경을 생성하는 작은 프로그램을 생성하는 것입니다. environ 파일.이미 C에도 비슷한 것이 있습니다.관심이 있으시면 게시해 드릴 수 있습니다.

편집(OpenSolaris pargs.c를 읽은 후):환경이 변경되면 Solaris에서 환경 버퍼가 재할당되므로 psinfo 포인터가 유효하지 않을 수 있습니다.방탄 솔루션을 위해서는 _environ을 찾아야 합니다.아마도 필요한 것보다 더 번거로울 것입니다 ... pargs -e <pid> UCB에 대한 더 좋은 대안이 될 수 있습니다 ps(1) 그래도 포크 루트로 가면.

다른 팁

Linux에서는처럼 보입니다 /proc/<pid>/environ psuedofiles에는 프로세스가 생성 될 때 통과 된 환경 변수가 포함되어 있습니다. 충분한 허가가 있으면 읽을 수 있습니다.

출시 후 프로세스 환경의 변화를 추적하지 않는 것처럼 보이지 않습니다.

그것은 당신이 요구하는 것을 얻기 위해 프로세스 메모리 덤프를 기각해야한다는 것을 암시합니다.

교활한.

GNU 'Binutils'패키지에는 CLI 유틸리티가 포함되어 있습니다. strings. 보다 http://www.gnu.org/software/binutils/ 더 많은 정보를 위해서.

strings /proc/pid/environ - 매우 좋은 환경 변수 목록을 인쇄합니다. env.

내 마음에 가장 먼저 오는 것은 GDB를 사용하여 문제의 프로세스에 첨부 한 다음 GDB에 환경을 얻도록 요청하는 것입니다. GDB 쉘의 "Show Environment"명령으로이를 수행 할 수 있습니다.

당신을 위해 이것을 할 수있는 perl 모듈이있는 것 같습니다.개발 :: GDB. 아직 시도하지는 않았지만 Devel :: GDB 객체를 만들고 검사하려는 프로세스에 연결하고 "Show Environment"명령을 보내고 결과를 구문 분석하는 간단한 프로그래밍 문제처럼 보입니다.

그래도 말해야합니다 ... 해결책이 복잡 할 때, 당신은 아마도 다른 일을하고있을 것입니다. 어쨌든 무작위 프로세스를 위해 환경이 필요한 이유는 무엇입니까?

PS가 할 수 있다면, 당신이 말하는 것처럼, 당신의 대답은 ps의 소스 코드 어딘가에서 찾을 수 있습니다. 그것은 새로운 과정의 산란을 피할 것입니다.

Linux에서는 해결하기에 충분할 수 있습니다 /proc/[pid]/cwd Symlink, 참조 Procfs (5).

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