스크립트의 이 부분은 잘 작동하지만:
geany &
pid=$!
...
kill -KILL $pid
반대로, 그렇지 않습니다.
lxterminal &
pid=$!
...
kill -KILL $pid
bash 프로세스가 여전히 백그라운드에 있는 것 같지만 종료되지는 않습니다 $pid
. 나중에 프로세스를 종료할 수 있도록 터미널 창의 PID를 어떻게 얻나요?
참고: 이름으로 종료하려고 시도했지만 해당 --title
옵션으로 인해 PROMPT_COMMAND
.
답변1
물론 lxterminal
하위 프로세스는 분기됩니다. 생각해 보세요. 자식 프로세스는에뮬레이트된 터미널에 연결된 대화형 셸통과 lxterminal
(또는 옵션과 함께 제공되는 대체 프로그램 -e
). 그러면 해당 셸에서 실제로 수행하는 작업에 따라 추가 손자 프로세스가 생성됩니다.
Killing은 lxterminal
사용하는 의사 터미널의 마스터 측을 닫고, 슬레이브 측에서는 터미널이 정지된 것처럼 보입니다. 슬레이브는 대화형 쉘에서 제어 터미널로 간주됩니다. 따라서 SIGHUP
터미널 -hupcl
설정이 켜져 있으면 쉘은 일반적인 터미널 정지를 확인하고 세션 리더를 생성해야 합니다. 세션 리더는 쉘 프로세스입니다.
세션 리더는 세션 내의 작업 제어를 담당하며 모든 작업에 끊기 신호를 전달합니다. 분명히 해당 쉘을 통해 disown
ed 또는 nohup
ped를 실행한 경우 세션 리더는 끊기 신호를 전달하지 않으며 lxterminal
종료되고 의사 터미널의 기본 측면이 닫혀 있어도 무언가가 계속 실행됩니다. 이게 disown
뭐고nohup
하다.
의사 터미널이 중단될 때 대화형 세션에서 실행 중인 모든 항목이 사라지지 않는 이유를 파악해야 합니다. 당신은 그것이 무엇인지 우리에게 말하지 않았으며 우리는 텔레파시를 할 수 없습니다. 그러므로 세션 리더 쉘이 무엇을 하도록 설계되었는지에 대한 일반적인 설명 외에는 제안할 것이 없습니다.
답변2
@9000이 댓글을 달았듯이 lxterminal
또 다른 포크가 있을 수 있습니다. 새 분기의 프로세스 ID를 얻는 것이 더 어렵기 때문에 $!
작동하지 않습니다.
답변3
이것은 효과가 있을 수 있습니다. 그러나 나는 그것을 테스트하지 않았습니다.
lxterminal &
pid=$!
kill -KILL "$(ps -ho ppid,pid | grep ^$pid | cut -d' ' -f2)"
ps -ho ppid,pid
PPID(부모 PID)와 현재 실행 중인 프로세스의 PID를 가져옵니다.- 그런 다음
grep ^$pid
포크로 인해 발생하지 않아 백그라운드에서 포크$pid
로 인해 발생하는 콘텐츠를 필터링합니다.lxterminal
- 마지막으로
cut
손자의 PID를 선택합니다.