파이썬 하위 프로세스-프로세스 분리

Raveendra

나는 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/nullLinux의 경우) 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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

파이썬 하위 프로세스 : FileNotFoundError

분류에서Dev

파이썬 하위 프로세스에서 변수 구문 분석

분류에서Dev

다중 프로세스 방법을 사용할 때 파이썬 프로세스를 관리하는 방법

분류에서Dev

파이썬 다중 처리-부모 프로세스를 차단하는 자식 프로세스

분류에서Dev

파이썬 하위 프로세스에서 무한 프로세스 종료

분류에서Dev

하위 프로세스 관리-하위 프로세스 종료

분류에서Dev

파이썬 하위 프로세스로서의 mysql 명령

분류에서Dev

파이썬에서 작동하지 않는 형태소 분석 프로세스

분류에서Dev

파이썬-하위 프로세스 길이 제한

분류에서Dev

파이썬의 하위 프로세스 : "찾을 수 없음"

분류에서Dev

파이썬의 하위 프로세스 모듈

분류에서Dev

파이썬 하위 프로세스에서 출력 포착

분류에서Dev

파이썬 FileNotFoundError의 하위 프로세스 모듈

분류에서Dev

하위 프로세스의 파이썬 종료 코드

분류에서Dev

파이프 및 프로세스 관리

분류에서Dev

파이썬 "하위 프로세스"모듈과 함께 파이프 사용

분류에서Dev

하위 프로세스 창이있는 특정 프로세스의 작업 목록 총 메모리

분류에서Dev

백그라운드 프로세스를 위해 파이썬 하위 프로세스에서 '&'사용

분류에서Dev

하위 프로세스로 자바에서 실행 파이썬 스크립트

분류에서Dev

파이썬에서 하위 프로세스에 의해 생성 된 프로세스 수 모니터링

분류에서Dev

파티션 처리에 프로세스 데이터와 프로세스 전체를 사용하려는 이유

분류에서Dev

파이썬의 다중 처리 풀에서 프로세스의 프로세스 이름을 인쇄하는 방법

분류에서Dev

파이썬 다중 처리를 사용하면 자식 프로세스가 다른 자식 프로세스를 어떻게 종료 할 수 있습니까?

분류에서Dev

파이썬에서 다중 처리를 사용하여 프로세스 내부에 프로세스를 만드는 방법은 무엇입니까?

분류에서Dev

파이썬에서 다중 처리를 사용하여 프로세스 내부에 프로세스를 만드는 방법은 무엇입니까?

분류에서Dev

파이썬 다중 처리 풀 대 프로세스?

분류에서Dev

파이썬에서 메모리에 파일을 mmap /로드하고 다른 프로세스에서 액세스하는 방법은 무엇입니까?

분류에서Dev

한 번에 256 바이트를 처리하는 파이프의 프로세스

분류에서Dev

Bash : 하위 프로세스 및 파이프 라이닝

Related 관련 기사

  1. 1

    파이썬 하위 프로세스 : FileNotFoundError

  2. 2

    파이썬 하위 프로세스에서 변수 구문 분석

  3. 3

    다중 프로세스 방법을 사용할 때 파이썬 프로세스를 관리하는 방법

  4. 4

    파이썬 다중 처리-부모 프로세스를 차단하는 자식 프로세스

  5. 5

    파이썬 하위 프로세스에서 무한 프로세스 종료

  6. 6

    하위 프로세스 관리-하위 프로세스 종료

  7. 7

    파이썬 하위 프로세스로서의 mysql 명령

  8. 8

    파이썬에서 작동하지 않는 형태소 분석 프로세스

  9. 9

    파이썬-하위 프로세스 길이 제한

  10. 10

    파이썬의 하위 프로세스 : "찾을 수 없음"

  11. 11

    파이썬의 하위 프로세스 모듈

  12. 12

    파이썬 하위 프로세스에서 출력 포착

  13. 13

    파이썬 FileNotFoundError의 하위 프로세스 모듈

  14. 14

    하위 프로세스의 파이썬 종료 코드

  15. 15

    파이프 및 프로세스 관리

  16. 16

    파이썬 "하위 프로세스"모듈과 함께 파이프 사용

  17. 17

    하위 프로세스 창이있는 특정 프로세스의 작업 목록 총 메모리

  18. 18

    백그라운드 프로세스를 위해 파이썬 하위 프로세스에서 '&'사용

  19. 19

    하위 프로세스로 자바에서 실행 파이썬 스크립트

  20. 20

    파이썬에서 하위 프로세스에 의해 생성 된 프로세스 수 모니터링

  21. 21

    파티션 처리에 프로세스 데이터와 프로세스 전체를 사용하려는 이유

  22. 22

    파이썬의 다중 처리 풀에서 프로세스의 프로세스 이름을 인쇄하는 방법

  23. 23

    파이썬 다중 처리를 사용하면 자식 프로세스가 다른 자식 프로세스를 어떻게 종료 할 수 있습니까?

  24. 24

    파이썬에서 다중 처리를 사용하여 프로세스 내부에 프로세스를 만드는 방법은 무엇입니까?

  25. 25

    파이썬에서 다중 처리를 사용하여 프로세스 내부에 프로세스를 만드는 방법은 무엇입니까?

  26. 26

    파이썬 다중 처리 풀 대 프로세스?

  27. 27

    파이썬에서 메모리에 파일을 mmap /로드하고 다른 프로세스에서 액세스하는 방법은 무엇입니까?

  28. 28

    한 번에 256 바이트를 처리하는 파이프의 프로세스

  29. 29

    Bash : 하위 프로세스 및 파이프 라이닝

뜨겁다태그

보관