나는 python 스크립트를 가지고 af_audit_run.py
있으며을 request_audit.py
통해 다른 python 스크립트 를 호출합니다 subprocess
.
두 번째 스크립트 request_audit.py
는 백그라운드에서 다른 하위 프로세스를 호출하고 요청 ID를 반환합니다.
문제는 af_audit_run.py
두 번째 스크립트가 요청 ID를 반환 한 후 곧 종료되어야 하는 첫 번째 스크립트가 전체 백그라운드 프로세스가 완료되기를 기다리고 있다는 것입니다. 요청 ID가 반환되는 즉시 첫 번째 스크립트를 강제로 종료 할 수있는 방법이 있습니까?
af_audit_run.py
- communicate
방법을 사용하여 결과를 기다립니다 :
p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
result, error = p.communicate()
print(result.decode('utf-8'))
print(error.decode('utf-8'))
request_audit.py
-기다리지 않고 하위 프로세스 (세 번째 Python 스크립트)를 분리하고 요청 ID를 반환합니다.
subprocess.Popen(cmd, shell=True, stdout=None, stderr=None, close_fds=True)
print(request_id)
환경 : Linux
세 번째 프로세스의 표준 출력과 표준 오류가에서 af_audit_run.py
출력을 읽는 파이프가 아닌 다른 곳 으로 향하도록해야합니다.
기존 코드에서 잘못된 점 stdout=None, stderr=None
은를 사용하여 기본 작업을 요청한다는 것입니다 (해당 키워드를 전혀 사용하지 않은 것처럼). 이것은 request_audit.py
하위 프로세스가 분기 될 때 상속되는 파일 설명자를 사용하여 상위 프로세스 (이 경우)와 동일한 출력 스트림에 기록하는 것 입니다. 즉, 최상위 수준 af_audit_run.py
은 세 번째 프로세스가 완료 될 때까지 해당 출력 스트림에서 파일 끝을 보지 않으므로 출력을 기다립니다.
이는 출력에서 볼 수있다 lsof
- 아래의 예에서, 세 번째 방법은 명령이다 /bin/sleep 600
(마지막에 테스트 코드를 참조).
다음은 lsof
세 번째 프로세스 에 대한 출력의 일부입니다 .
sleep 3057 myuser 0u CHR 136,20 0t0 23 /dev/pts/20
sleep 3057 myuser 1w FIFO 0,13 0t0 9441062 pipe
sleep 3057 myuser 2w FIFO 0,13 0t0 9441063 pipe
다음은 lsof
최상위 수준 에 대한 출력의 일부입니다 af_audit_run.py
.
python3 3053 myuser 0u CHR 136,20 0t0 23 /dev/pts/20
python3 3053 myuser 1u CHR 136,20 0t0 23 /dev/pts/20
python3 3053 myuser 2u CHR 136,20 0t0 23 /dev/pts/20
python3 3053 myuser 3r FIFO 0,13 0t0 9441062 pipe
python3 3053 myuser 5r FIFO 0,13 0t0 9441063 pipe
보시 sleep
다시피이 예제 의 프로세스 (pid 3057)에는 최상위 프로세스 (pid 3053)가 읽는 파이프의 끝을 쓰기 위해 연결된 stdout (fd 1) 및 stderr (fd 2) 스트림이 있습니다. 두 번째 마지막 열의 파이프 번호는 해당 프로세스의 직접 부모가 아니더라도 유의하십시오.
을 지정하고 close_fds=True
있지만 다음과 같이 설명 되어 있습니다.
" close_fds 가 true이면 0, 1 및 2를 제외한 모든 파일 설명자가 자식 프로세스가 실행되기 전에 닫힙니다." (강조 광산)
따라서 다른 열린 파일 설명자가 자식에서 닫히 더라도 stdin, stdout 또는 stderr 스트림에는 영향을 미치지 않습니다 .
stdout=None, stderr=None
를 사용하는 대신 을 사용하는 stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL
경우이 스트림을 명시 적으로 null 장치 ( /dev/null
Linux의 경우) af_audit_run.py
로 보내면에서 기다릴 필요가 없습니다.
lsof
이 경우의 일부 출력 :
sleep 3318 myuser 0u CHR 136,20 0t0 23 /dev/pts/20
sleep 3318 myuser 1u CHR 1,3 0t0 6 /dev/null
sleep 3318 myuser 2u CHR 1,3 0t0 6 /dev/null
stdin=subprocess.DEVNULL
프로세스가 읽기를 시도하면 파일 끝을 볼 수 있도록 사용할 수도 있습니다. 이 예에서는 그렇게하지 않았으며 입력은 여전히 터미널 장치에 연결되어 있지만 af_audit_run.py
대기 여부에는 영향을주지 않습니다 .
af_audit_run.py
import subprocess
cmd = "python3 request_audit.py"
p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
result, error = p.communicate()
print(result.decode('utf-8'))
print(error.decode('utf-8'))
request_audit.py
import subprocess
cmd = "/bin/sleep 600"
subprocess.Popen(cmd, shell=True,
stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
print(5)
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다