다른 터미널 창이 열려 있으면 프로그램을 종료/종료할 수 없습니다.

다른 터미널 창이 열려 있으면 프로그램을 종료/종료할 수 없습니다.

저는 일정 시간 동안 다른 여러 Python 프로그램을 연 다음 닫는 프로그램을 Raspberry Pi에서 실행하고 있습니다. 뭐가 문제 야:

  • Python 3 IDE, Thonny Python 또는 기타 IDE에서 기본 프로그램을 실행하면 모든 것이 잘 작동하고 모든 프로그램이 예상대로 열리고 닫힙니다.
  • Python 3 IDE, Thonny Python 또는 기타 IDE에서 기본 프로그램을 실행하지만 다른 터미널 창이 열려 있는 경우(아무 것도 실행하지 않고 단지 열려 있고 유휴 상태일 뿐임) 모든 프로그램이 열리지만 닫을 수는 없습니다. 나중에 .
  • 터미널 창에서 기본 프로그램을 실행하면 모든 프로그램이 열리지만 나중에는 닫을 수 없습니다.

코드 예시

while True:
    proc = subprocess.Popen(['lxterminal', '-e', ' test_aa.py'])
    proc_bb = subprocess.Popen(['lxterminal', '-e', 'test_bb.py'])
    time.sleep(5)
    proc.terminate()
    proc_bb.kill()
    time.sleep(200)

다른 예시

while True:
    print("opening")
    proc = subprocess.Popen(['lxterminal', '-e', ' test_aa.py'])
    c = proc.pid 
    print(c)
    time.sleep(3)
    os.kill(c, signal.SIGTERM)
    time.sleep(700)

이는 다른 터미널 창을 수동으로 열지 않고도 작동합니다.

프로그램을 시작하기 위해 나는 또한 Popen과 os.system의 다양한 변형을 시도했고 매번 잘 작동했습니다.

종료/종료하려면 os.system, os.kill(pid, signal.SIGTERM), os.kill(pid, signal.SIGINT) 등을 시도했습니다. -9 PID, subprocess.Popen으로 종료한 다음 종료() 또는 종료()

업데이트 1

위의 질문에 따르면 부분적으로 답변할 수 있을 것 같지만 동시에 더 많은 질문이 제기됩니다.

다음 코드를 고려해보세요:

while True:
    print("opening")
    proc = subprocess.Popen(['lxterminal', '-e', ' test_aa.py'])
    c = proc.pid 
    print(c)
    time.sleep(3)
    os.kill(c, signal.SIGTERM)
    time.sleep(700)

사용

  ps aux 

나는 찾았다

   ['lxterminal'] 

그리고

   ['test_aa.py']

다른 PID 번호로 실행 중입니다. 그래서

    c = proc.pid 

['lxterminal']을 종료할 수 없는 이유를 설명할 수 있는 ['test_aa.py']의 pid를 제공합니다.

내가 맞나요?

다른 터미널 창에서 Python 프로그램을 시작하지만 동일한 PID 번호를 갖는지 확인하는 다른 옵션은 무엇입니까?

업데이트 2

나는 pid 번호로 새 터미널 창을 실행하고 있습니다. 그래서 정렬되었습니다. 또한 좀비 프로세스가 실행되고 있지 않은지 확인하기 위해 코드를 사용합니다.

stdout, stderr = proc.communicate()
proc.wait()

작동하며 좀비 프로세스가 실행되고 있지 않습니다.

그러나 불행하게도 같은 이야기가 다시 발생합니다. 터미널 창을 열고 프로그램을 실행하면 프로그램에서 시작한 터미널이 종료되지 않습니다. 나는 두 가지 다른 라즈베리 파이를 시험해 보았습니다. 같은.

다른 터미널 창을 열면 갑자기 프로그램이 닫히지 않는 이유는 무엇입니까?

최종 업데이트

내 질문에 부분적으로 답변했습니다.

일부 터미널 창이 열려 있는 경우 내 프로그램이 다른 프로그램을 종료하지 않는 이유를 여전히 이해하지 못하지만 해결 방법을 찾았습니다. 바꾸다

 lxterminal, 

나는 사용하고있다

 uxterm #uterm can also be used 

내 코드는 이제 다음과 같습니다.

proc = subprocess.Popen([‘uxterm’, ‘-e’, ‘test_aa.py’], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, preexec_fn=os.setsid) 

완벽하게 작동합니다. 터미널 창에서 다른 프로그램을 실행할 수 있고, 재부팅한 후 .sh 파일을 사용하여 모든 것을 다시 활성화할 수 있습니다.

이것이 바로 제가 찾던 것입니다 :-)

도움을 주셔서 감사합니다.

관련 정보