스택큐힙리스트

shell=True로 시작된 Python 하위 프로세스를 종료하는 방법 본문

카테고리 없음

shell=True로 시작된 Python 하위 프로세스를 종료하는 방법

스택큐힙리스트 2023. 4. 3. 06:40
반응형

다음 명령으로 하위 프로세스를 시작합니다.

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' 옵션을 사용하여 파이썬에서 실행한 서브프로세스를 종료하는 방법에 대해 알아보았습니다. 많은 파이썬 개발자들이 이 옵션을 사용하기 때문에, 이러한 문제를 미리 고려하고 적절한 종료 방법을 사용하는 것이 중요합니다. 이를 통해 안전한 소프트웨어 개발을 할 수 있습니다.

반응형
Comments