일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 코딩
- 데이터베이스
- 컴퓨터과학
- 딥러닝
- 프로그래밍언어
- 웹개발
- 데이터과학
- 사이버보안
- 클라우드컴퓨팅
- 보안
- 2
- I'm Sorry
- 네트워크보안
- 자료구조
- 알고리즘
- 버전관리
- 컴퓨터공학
- 데이터구조
- 컴퓨터비전
- 인공지능
- 머신러닝
- 빅데이터
- 소프트웨어
- 데이터분석
- 파이썬
- 자바스크립트
- 네트워크
- 소프트웨어공학
- 프로그래밍
- Yes
- Today
- Total
스택큐힙리스트
shell=True로 시작된 Python 하위 프로세스를 종료하는 방법 본문
다음 명령으로 하위 프로세스를 시작합니다.
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)
그러나, 나는 죽이려고 시도할 때:
p.terminate()
또는
p.kill()
명령어는 백그라운드에서 계속 실행되므로, 프로세스를 실제로 종료하는 방법이 궁금합니다.
참고로, 해당 명령을 다음과 같이 실행합니다:
p = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE)
p.terminate()를 발행할 경우 성공적으로 종료됩니다.
답변 1
그룹 내 모든 프로세스에 신호를 전송할 수 있도록 process group 를 사용하세요. 이를 위해 생성된/자식 프로세스의 부모 프로세스에 session id 를 연결해야 합니다. 이 경우, 이 쉘은 그룹의 그룹 리더가 됩니다. 따라서 이제 프로세스 그룹 리더에게 신호가 전송되면 이 그룹의 모든 자식 프로세스로 전송됩니다.
여기 코드입니다:
import os
import signal
import subprocess
# The os.setsid() is passed in the argument preexec_fn so
# it's run after the fork() and before exec() to run the shell.
pro = subprocess.Popen(cmd, stdout=subprocess.PIPE,
shell=True, preexec_fn=os.setsid)
os.killpg(os.getpgid(pro.pid), signal.SIGTERM) # Send the signal to all the process groups
답변 2
파이썬에서 서브프로세스를 실행할 때, shell=True 옵션을 사용하여 명령어를 실행할 수 있습니다. 그러나 이 경우, 프로세스를 종료하는 것이 조금 까다로울 수 있습니다. 이번 글에서는 shell=True 옵션을 사용하여 실행한 파이썬 서브프로세스를 종료하는 방법에 대해 알아보겠습니다.파이썬에서 서브프로세스를 실행할 때, 'subprocess' 모듈을 사용합니다. 이 모듈은 'Popen' 함수를 제공합니다. 이 함수를 사용하면 외부 프로그램을 실행할 수 있습니다. 다음은 'Popen' 함수를 사용하여 외부 프로그램을 실행하는 예제 코드입니다.
```python
import subprocess
process = subprocess.Popen([echo, hello], stdout=subprocess.PIPE, shell=True)
output, error = process.communicate()
print(output.decode(utf-8))
```
위 코드에서는 'echo' 명령어를 실행하여 hello를 출력하도록 했습니다. 이때 'shell=True' 옵션을 사용하여 명령어를 실행했습니다.
그러나 서브프로세스를 실행할 때 'shell=True' 옵션을 사용하면, 보안상의 이유로 프로세스를 종료하는 것이 다소 까다롭습니다. 이는 외부 프로그램을 실행하는 동안 쉘 스크립트를 사용할 수 있기 때문입니다. 이러한 경우에는 쉘 스크립트가 실행된 프로세스를 강제로 종료해야 합니다.
서브프로세스를 종료하는 가장 간단한 방법은 'kill' 메서드를 호출하는 것입니다. 다음은 'kill' 메서드를 사용하여 서브프로세스를 강제 종료하는 코드입니다.
```python
import subprocess
import time
process = subprocess.Popen([sleep, 10], shell=True)
# 5초 후 강제 종료
time.sleep(5)
process.kill()
```
위 예제 코드에서는 'sleep' 명령어를 실행하여 10초 동안 대기하도록 했습니다. 이때 5초 후 'kill' 메서드를 호출하여 프로세스를 강제 종료합니다.
또 다른 방법으로는 'terminate' 메서드를 사용하는 것입니다. 이 메서드는 프로세스를 강제 종료하는 것이 아니라 종료 신호를 보내는 것입니다. 종료 신호를 받은 프로세스는 종료되도록 설정되어 있어야 합니다.
```python
import subprocess
import time
process = subprocess.Popen(['sleep', '10'], shell=True)
# 5초 후 종료 신호 전송
time.sleep(5)
process.terminate()
```
위 예제 코드에서는 마찬가지로 'sleep' 명령어를 실행하여 10초 동안 대기하도록 했습니다. 이때 5초 후 'terminate' 메서드를 호출하여 종료 신호를 보냅니다.
이상으로 'shell=True' 옵션을 사용하여 파이썬에서 실행한 서브프로세스를 종료하는 방법에 대해 알아보았습니다. 많은 파이썬 개발자들이 이 옵션을 사용하기 때문에, 이러한 문제를 미리 고려하고 적절한 종료 방법을 사용하는 것이 중요합니다. 이를 통해 안전한 소프트웨어 개발을 할 수 있습니다.