2017-05-02 3 views
0

이 프로그램은 즉시 수면의 PID 에코한다 백그라운드에서 프로세스를 시작하고 하나의 호출에 또 다른 시작 : 직접 쉘이 실행서브 프로세스가 :

import subprocess 
subprocess.check_output("sleep 1 & echo $!", shell=True) 

을 즉시 PID를 출력하지만, 파이썬에서 실행 , &은 무시되고 echo이 실행되기 전에 1 초가 걸립니다.

check_output (또는 subprocess의 다른 기능)을 한 번만 실행하면 어떻게 되나요?

닫 출력 파이프

답변

1

check_output 대기 (이것은 내가 내 자신의 실행 파일을 넣어 것입니다 현실 대신 sleep 1에, 단순화 된 예입니다)와 sleep도를 가지고있다. 즉각적인 반품을 위해 /dev/null으로 리디렉션 할 수 있습니다.

subprocess.check_output("sleep 1 >/dev/null 2>&1 & echo $!", shell=True) 

UPDATE

그것 정말 백그라운드에서 실행 않았다 sleep 1 그래서 난 약간 큰 시험을 썼다인지 알 어렵다.

test.py은 - 오초

import time 

for i in range(5): 
    print(time.strftime('%H:%M:%S'), flush=True) 
    time.sleep(1) 
print('done', flush=True) 

runner.py에 대한 stdout 시간을 기록 - 파일에 stdout을 리디렉션 테스트를 실행하고 파일을 모니터링합니다.

import subprocess as subp 
import time 
import os 

# run program in background 
pid = int(subp.check_output("python3 test.py >test.out 2>&1 & echo $!", 
    shell=True)) 
print("pid", pid) 

# monitor output file 
pos = 0 
done = False 
while not done: 
    time.sleep(.1) 
    if os.stat('test.out').st_size > pos: 
     with open('test.out', 'rb') as fp: 
      fp.seek(pos) 
      for line in fp.readlines(): 
       print(line.strip().decode()) 
       done = b'done' in line 
      pos = fp.tell() 
print("test complete") 

그것을 실행, 나는

[email protected] ~/tmp $ python3 runner.py 
pid 24353 
09:32:18 
09:32:19 
09:32:20 
09:32:21 
09:32:22 
done 
test complete 
+0

아하을 얻을, 그 이유는 차단합니다. 파이썬이 명령을 전체적으로 쉘에 보내고 쉘 출력 파이프에 연결한다고 생각했기 때문에 이상합니다. 이제 내가하고 싶은 일은 프로그램이 실행되는 동안 몇 개의 신호를 보내고, 모든 출력 파이프를 리디렉션하고, 잠자기를 즉시 중지하고 백그라운드에서 실행하지 않는 것입니다. 어떻게 든 그것을 달성 할 수 있습니까? – hansaplast

+0

'sleep'은 백그라운드에서 완료까지 실행되었습니다. 잠자는 1 초는 다소 감지하기 어렵습니다. 60 초 만에'ps'를 실행하면 보게 될 것입니다. 출력을 유지하려면 다른 파일로 리디렉션 할 수 있으며'check_output'이 pid를 반환하므로 신호를 보내는 메커니즘이 있습니다. – tdelaney

+0

스크립트 작성 시간을내어 주셔서 감사합니다. 이것은 실제로 이것이 효과가 있음을 보여줍니다. 방금 시작한 프로세스에'SIGINT'를 보내는 일이 막혔지만 (아마 프로세스 그룹 ID 때문에), 문제에 대한 다른 질문을 할 수 있습니다. – hansaplast

관련 문제