2012-03-21 4 views
1

파이썬에서 독립 프로세스를 만들려고합니다. 이 프로세스는 여러 인스턴스를 갖고 싶지만 다른 인수로 인스턴스화하려는 파이썬 스크립트입니다. 는 단순히 A로부터 루프, 내가 subprocess.Popen()를 호출하고 있지만 인수에 따라 변화 :동일한 이름의 여러 파이썬 프로세스/데몬을 생성합니다 (다른 args)

subscriber.py에서
for d in mylist: 
    subprocess.Popen(['./subscriber.py', d.arg1, a.arg2, d.arg3]) 

, 나는 코드가 그 "daemonizes"또한 다양한 recipes 에 따라 과정 이를 위해 다음과 같이 내 subscriber.py를 시작하려고 시도했습니다.

for d in mylist: 
    p = multiprocessing.Process(target=subscriber.start, 
           args=(d.arg1, d.arg2, d.arg3)) 
    p.daemon=True 
    p.start() 

또한 내 스크립트는 공용 로그 파일에 쓰기 위해 파이썬 로깅을 사용합니다.

두 방법 중 어떤 것이 발생하는지는 루프의 마지막 반복 과정이 실제로 실행되고 있다는 것입니다. 내가 필요한 것은 이러한 백그라운드 데몬이 "영원히"실행되도록하는 것이지만, 단 1 개의 인스턴스 만 얻을 수 있습니다! [편집] 중요하게, 나는 호출하는 스레드를 종료시키고 실행중인 데몬을 남겨두고 싶다.

나는 stackoverflow와 다른 곳에서 굉장히 많이 봤지만 비슷한 예제를 찾을 수 없다. 아마 내 파이썬 초보자 - 네스 .. 내 접근 방식이 완전히 잘못 되었나요?

환경 : - 파이썬 2.7, 우분투 (위에서 언급 한 목록에 프로세스를 추가 외에)

+0

변수를 재 할당하는 대신 프로세스 목록을 만들려고 했습니까? 예. – Serdalis

+0

좋아요,하지만 호출하는 스레드가 종료되어 많은 데몬을 남겨두고 싶습니다. (p.append (target = subscriber.start, args = (d.arg1, d.arg2, d.arg3))) 뒤에. 이것이 다중 처리가 하위 프로세스 실행을 허용하지 않는 것처럼 Popen()을 향한 이유입니다. – lusito75

답변

0

.

nohup "daemonizes"모든 명령과 &은 백그라운드로 푸시합니다. 즉, 해당 명령을 생성 한 세션이 끝나면 nohup-ed 명령은 init 프로세스의 자식 (PID = 1)이되어 계속 실행됩니다.

+0

도 같은 방식으로 작동합니다. > nohup subscriber.py xyz & 다음에> nohup subscriber.py abc &를 사용하여 command.py에서 수동으로 subscriber.py를 시작하려고하면 ps 명령은 subscriber.py 실행 중 1 인스턴스 만 표시합니다 (abc 버전)! – lusito75

+0

존재하는 인스턴스의 수를 subscriber.py가 제어한다는 것은 의미합니까? 또한'&'가 실행되면 생성 된 프로세스 'pid (예 : nohup sleep 3 & ... [1] 31080')를 표시하고 완료시 메시지를 표시합니다 (예 :지. '[1] + 31080 done nohup sleep 3'). 당신은 'x y z'인스턴스가 빨리 죽는다는 것을 말하고 있습니다. 즉,'[] + done ...'메시지를보아야 함을 의미합니다. – slavos

0

2 일을 리눅스 :

  1. 이 데몬을 설정 = 사실은 실제로 무엇의 반대를 의미한다 배고 있다. 메뉴얼 : When a process exits, it attempts to terminate all of its daemonic child processes.. 예! 또한, deamons는 아이들을 생성 할 수 없습니다. 저를 제공

: 2. 당신이 데몬 = 거짓이 어린이를 생성하면된다해야하고, 그들 각각의 시작에, 포크를 사용하여 디먼 화됩니다(). 같은 : mylist.txt은 별도의 줄에 각 subscriber.py 예를 들어 인수를 포함

while read ARGS; do 
    nohup ./subscriber.py $ARGS & 
done < mylist.txt 

: 당신이 정말 파이썬 전용 솔루션이 필요하지 않은 경우, 작은 쉘 스크립트는 일을 할 수

def daemonize(): 

     pid = os.fork() 
     if pid != 0: 
      sys.exit(0) 


     return pid 
관련 문제