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
아하을 얻을, 그 이유는 차단합니다. 파이썬이 명령을 전체적으로 쉘에 보내고 쉘 출력 파이프에 연결한다고 생각했기 때문에 이상합니다. 이제 내가하고 싶은 일은 프로그램이 실행되는 동안 몇 개의 신호를 보내고, 모든 출력 파이프를 리디렉션하고, 잠자기를 즉시 중지하고 백그라운드에서 실행하지 않는 것입니다. 어떻게 든 그것을 달성 할 수 있습니까? – hansaplast
'sleep'은 백그라운드에서 완료까지 실행되었습니다. 잠자는 1 초는 다소 감지하기 어렵습니다. 60 초 만에'ps'를 실행하면 보게 될 것입니다. 출력을 유지하려면 다른 파일로 리디렉션 할 수 있으며'check_output'이 pid를 반환하므로 신호를 보내는 메커니즘이 있습니다. – tdelaney
스크립트 작성 시간을내어 주셔서 감사합니다. 이것은 실제로 이것이 효과가 있음을 보여줍니다. 방금 시작한 프로세스에'SIGINT'를 보내는 일이 막혔지만 (아마 프로세스 그룹 ID 때문에), 문제에 대한 다른 질문을 할 수 있습니다. – hansaplast