2010-05-28 2 views
2

"신비한 프로덕션 시스템"의 Solaris 상자에서 환경 변수를 참조하는 Perl 스크립트를 실행하고 있습니다. 별거 아니야.내 Perl 스크립트는 "다른 곳"의 환경 변수를 잡아 먹는가?

실행 전후의 쉘 변수의 내용이 예상대로입니다.

그러나 스크립트에 의해보고 될 때 스크립트의 지속 시간 동안 다른 값을 사용하여 내 vars를 clobbering하는 다른 하위 셸에서 실행중인 것처럼 보입니다.

불행히도 코드를 붙여 넣을 수 없습니다. 나는 원자 사건을 얻으려고 노력하고 있지만, 나는 지혜로운 끝에있다.

+3

직접 쉘 스크립트를 실행하고 있습니까? 직접 쉘을 사용하고 있습니까? 또는 cron이나 sudo 또는 nohup 또는 웹 서버와 같은 다른 프로그램을 실행하고 있습니까? – Schwern

답변

0

좋아, 여기에 무슨 일이 있었는지입니다 :

펄 자체는 레드 헤링 (Red Herring)이 완전히이었다.

스크립트가 생성되었을 때 rc 파일을 다시로드하는 자식 셸에서 스크립트가 실행되고있었습니다. 그 rc 파일들은 부모 쉘 중에 수동으로 추가 한 환경 변수를 참조 사본과 함께 날려 버리고있었습니다.

환경을 에코 한 단순한 csh 스크립트로이 사실을 입증 할 수있었습니다.

내 rc 파일 (wonkitude로 덮어 썼음)을 취소하면 신비한 교체가 완료됩니다.

업데이트 : 간단한 "설정"명령이있는 "test.sh"임을 입증하는 테스트. 하위 셸이 상위 환경을 올바르게 상속하지 못했음을 입증했습니다. 이상하게도 부모 대화식 쉘을 ksh로 전환하면 환경이 올바르게 상속 받기 시작했습니다.

0

1) 어떤 버전의 Perl?

2) 일부 환경 변수는 하위 프로세스에서 위태롭게 할 수 있습니다. 추신을 할 수 있습니까?

+0

5.8.4를 사용 중입니다. 나는 불행하게도 그것을 ps 할 수 없다. 1) 너무 빠르다. 2) 읽기 전용 스크립트의 심볼릭 링크이므로 게임 할 수 있도록 잠시 멈출 수는 없습니다. –

+0

심볼릭 링크를 죽이고 해당 위치에서 디버깅을 위해 복사본을 만들 수 있습니까? –

+0

그래, 나도 잘 할 수있을거야. 그것은 "살아있는"목적을위한 하위 프로세스의 실행과 함께 거대한 덩굴손을 가지고 있지만 침착하게 생각하면 격리 된 환경의 문제 영역에 적어도 도달 할 수는 없습니다. –

2

당신이 사용하고있는 스크립트 나 라이브러리가 % ENV 해시로 엉망이 될 가능성이 있습니까?

+0

좋은 생각이지만, 불행히도 아닙니다. Sybase :: DBLIB 및 Net :: FTP 만 사용합니다. –

+12

다른 모듈을 사용하기 전에 스크립트 상단에'BEAIN {Tie :: Trace; Tie :: Trace :: watch % ENV}'를 넣으십시오. 그런 다음 Perl 스크립트에서 환경 변수가 변경 될 때마다 경고 메시지가 표시됩니다. – mob

+0

@mobrule : 위대한 팁! 나는 전에 그것에 대해 몰랐다. –

1

Perl 디버거를 통해 코드를 실행하여 진행 상황을 확인할 수 있습니까? 서브 쉘을 분기하거나 호출 하는지를 확인하기 위해 pid ($$)를 덤프 할 수 있습니까?

또는 코드 전체에 인쇄 문을 뿌리면 환경 변수가 변경 될 때의 범위를 좁히거나 문제 발생 지점과 관련된 것으로 보이지 않는 구성 요소를 스텁으로 시작할 수 있습니다.

+0

나는 perl 디버거 아이디어를 좋아한다. 나는 그곳에 있다는 것을 잊고있다.) 우리는 아주 이상한 환경 문제를 발견했다. 편의를 위해서이 증상보다 훨씬 더 높은 수준이다. 이 문제를 명확히하기 위해 나는 그 물건을 지역적으로 복제하고 설명하는대로 이해할 수 없는지 알아 보겠습니다. 감사합니다. o / –

관련 문제