2010-01-13 3 views
1

나는 subprocess.Popen을 사용하여 다른 프로세스 (파이썬 프로세스 또는 기타)를 시작하는 파이썬 프로그램을 가지고 있으며이를 실행 한 후 자식 PID를 파일에 저장합니다. 부모 프로세스가 갑자기 (예외 또는 기타로 인해) 죽었다고 가정 해 봅시다. Popen에 의해 반환 된 개체에 다시 액세스 할 수있는 방법이 있습니까?하위 프로세스로 프로세스를 복구합니다 .Popen?

기본적으로 파일을 읽는 것이 기본 개념이며, 파일이 존재하고 PID가 기록되어 있으면 반환 코드 등을 알기 위해 그 프로세스에 액세스 할 수 있습니다. PID가 없으면 Popen으로 프로세스를 시작하십시오.

감사합니다.

+0

Popen 객체가 필요한 이유, Popen의 어떤 메소드를 호출 할 것인지, 부모 프로세스가 자식 프로세스에서 수행하는 작업 (stdin에 쓰기, 죽이기, 죽이기, 아직 상태 확인 중) 살아 있는?)? – liwp

답변

2

는 popen 개체입니다 효과적으로 그냥 아이의 래퍼가 PID, 표준 입력, 표준 출력 및 표준 오류, 게다가 그 사용에 대한 몇 가지 편의 기능을 처리합니다.

그래서 Popen 개체에 액세스해야하는 이유는 무엇입니까? 자녀와 의사 소통을하거나, 자녀를 퇴학 시키거나, 자녀가 아직 운영 중인지 여부를 확인하고 싶습니까?

어쨌든 이미 실행중인 프로세스에 대한 Popen 개체를 다시 얻는 방법은 없습니다.

올바른 접근 방법은 Tobu가 제안한 것처럼 데몬으로 아이를 시작하는 것입니다. 프로세스를 daemonising하기위한 절차의 일부는 stdin과 stdout을 닫는 것이므로 자식 프로세스와 대화하는 데 사용할 수 없습니다. 대신 대부분의 데몬은 클라이언트가 연결하여 메시지를 보낼 수 있도록 파이프 나 소켓을 사용합니다.

하위 프로세스에서 명명 된 파이프를 여는 것이 가장 쉽습니다./etc/my_pipe, 부모 프로세스/제어 프로세스에서 해당 명명 된 파이프를 열고, 그/그녀에게 쓰기/읽기를 수행합니다.

python-daemon을 간략하게 살펴보면 python-daemon이 자식 프로세스를 데몬 레이션하는 데 도움이되는 것처럼 보입니다.이 과정은 어렵습니다.하지만 메시징 측면에서는 도움이되지 않습니다.

하지만 제가 말씀 드렸듯이 우리가 더 이상 당신을 도울 수 있기 전에 왜 당신이 아이를위한 Popen 객체를 필요로하는지 말해야한다고 생각합니다.

0

데몬을 작성하려는 것처럼 보이고 pidfile 지원이 필요합니다. python-daemon으로 잘못 갈 수는 없습니다. 예를 들어

:

import daemon 
import lockfile 
import os 

with daemon.DaemonContext(pidfile=lockfile.FileLock('/var/run/spam.pid')): 
    os.execl('/path/to/prog', args…) 
1

프로세스가 종료되면 열린 파일 핸들이 모두 닫힙니다. 여기에는 popen()으로 생성 된 명명되지 않은 파이프가 포함됩니다. 따라서 PID만으로 Popen 개체를 복구 할 방법이 없습니다. 운영체제는 새로운 프로세스를 상위 프로세스로 간주하지 않으므로 SIGCHLD 시그널도 얻지 못합니다 (그래도 waitpid()가 작동 할 수도 있음).

은 내가 SIGPIPE로 아이를 죽일해야 아이가 (즉, 아이의 stdout 재)없는 리더 파이프에 쓰기 때문에, 중, 생존을 보장 있는지 확실하지 않습니다.

자식 프로세스가 중단 된 부분을 선택하려면 파일을 쓸 파일 (보통 /tmp 또는 /var/log)을 생성하고 현재와 같은 PID를 기록해야합니다 위치는 /var/run입니다. (명명 된 파이프에 쓰면 위와 같이 SIGPIPE으로 죽을 위험이 있습니다.) 파일 이름에 PID를 붙이면 관리자 프로세스가 어떤 파일이 어떤 데몬에 속하는지 쉽게 파악할 수 있습니다.

+0

sighup 설정에 따라 다름 - 아이들은 부모님들에게서 살아남을 수 있습니다. –

+0

설명해 주셔서 감사합니다. –

관련 문제