2014-12-10 9 views
0

Python 스크립트에서 새 스레드에서 vlc를 열고 사용자가이 스크립트에서 깨끗하게 닫을 수있게하려고합니다. send_signal() 명령이 실제로 vlc를 닫지 않는 것처럼 보입니다. 무엇이 잘못 되었습니까?subprocess.Popen이 SIGINT/SIGKILL을받지 못합니다.

import subprocess 
import signal 

s = subprocess.Popen("vlc", shell=True) 
raw_input("Press Enter to stop vlc...") 
s.send_signal(signal.SIGINT) 
print "waiting for vlc to exit..." 
s.wait() 

편집 : 나는 목적을 설명/테스트를 위해 VLC를 대체하지만 내 실제 필요 스트림을 종료하는 것이 일반적이 종료 표준 신호 (이것은 "보도 Ctrl 키를 말한다이기 때문에 SIGINT를 듣고는 FFmpeg에 의해 기록되는 -c 인코딩 중지 ").

+0

's.kill()'은 프로세스 또는's.send_signal (signal.SIGKILL)'을 죽일 것입니다. –

답변

0

이 좋아 드디어 지름길

s = subprocess.Popen(["vlc"]) 

그리고 SIGINT를 보내와 쉘/SIGKILL 이제 실제로 프로세스를 닫습니다. 나는 왜 쉘을 사용하는 첫 번째 옵션이 작동하지 않는 지에 대한 설명이 없다.

+1

을 받았을 때 실제로 닫혔습니다. SIGINT는 자식을 여전히 실행하고 있지만 (이 경우 "vlc") 의도 한 대상에 전달하지 않습니다. – KingRadical

0

vlc이 신호를 무시하고있는 것 같습니다. SIGTERM 또는 SIGKILL을 보내보십시오.

Unix 종료 신호에 대한 자세한 내용은 this link을 참조하십시오 (Unix/Linux에서 실행 중이라고 가정). 신호를 차단하거나 무시할 수있는 메모를 참조하십시오.

1

SIGINT는 일반적으로 Ctrl-C 인터럽트를 위해 예약되어 있습니다. GUI 응용 프로그램에서는 무시 될 수 있습니다. 응용 프로그램을 정상적으로 종료하기 위해 보낼 올바른 신호는 SIGTERM 또는 SIGKILL이며 갑자기 종료됩니다.

그러나 하위 프로세스 모듈을 사용하면 하위 프로세스 개체의 terminate 또는 kill 메서드를 직접 호출 할 수 있습니다.

+0

kill()이나 terminate()도 리눅스에서 위의 코드로 vlc를 닫지 않았으며 vlc는 쉘을 열길 원했던 프로세스가 아니라'shell = True'가 쉘일 때 서브 프로세스를 사용하기 때문에 SIGINT (kill -) – myoan