고아 프로세스에서 터미널 에뮬레이터가 닫혔는지 감지하는 방법

고아 프로세스에서 터미널 에뮬레이터가 닫혔는지 감지하는 방법

데몬 프로세스를 생성한 후 고아가 되는 명령줄 유틸리티가 있습니다. 터미널 에뮬레이터와 함께 데몬 프로세스를 종료하려면 어떻게 해야 합니까?

답변1

프로세스가 데몬이 되고 SIGHUP을 무시하면(또는 자체 세션 리더가 되어 자체 프로세스 그룹에 속하게 될 가능성이 더 높습니다.)보내다SIGHUP), 터미널 에뮬레이터가 닫힐 때 종료하는 유일한 방법은 해당 PID를 기록하고 치명적인 신호를 보내는 것입니다.

# pid=$(</var/run/some-daemon.pid)
# trap "kill $pid" EXIT

이는 bash 또는 호환 가능한 쉘을 사용한다고 가정합니다. 데몬의 PID를 얻는 방법은 다양할 수 있지만 대부분의 데몬은 PID를 파일에 기록합니다. 진짜 마법은 trap명령이다.


thrig가 지적했듯이 이 기술은 데몬이 PID 파일에 쓰고 사용자가 정상적으로 ( exit, ^D 등을 사용하여) 쉘을 종료한다고 가정합니다. 이 기술은 취약할 수 있지만 간단합니다.

답변2

프로세스 데몬의 목적은 다음과 같습니다.아니요부모에 따라 다릅니다.

임의의 pid에 의존하려면 pidfd를 활성화할 수 있습니다.pidfd_open, 샘플 코드가 있지만 을 epoll선호 할 수도 있습니다 poll.

따라서 데몬 자체가 실행되기 전에 유틸리티는 관심을 갖고 싶은 일부 프로세스를 찾으려고 시도할 수 있습니다. 아마도 해당 프로세스가 분명히 쉘에 의해 시작되었고 쉘의 부모에 종속되어 있는지 확인하고, 그렇지 않으면 pid cmdline 옵션을 사용할 수도 있습니다. 나에게 조부모는 터미널 에뮬레이터가 아닌 내 tmux 서버가 될 것입니다. 무엇이 올바른지 명확하지 않으며 상황에 따라, 아마도 순전히 선호도에 따라 달라질 수 있습니다.

답변3

데몬은 이중 포크를 수행하거나, PID 파일을 지원하지 않거나, 프로세스 목록에서 이름을 무작위로 변경할 수 있습니다. 데몬인 경우하지 마세요이전 상황에서는 $!쉘 변수로 추적할 수 있거나 파일이 있을 수 있으며 cat내용이 정확하기를 기도할 수 있습니다(데몬이 충돌하고 다른 것이 동시에 해당 PID를 가져오면 PID가 올바르지 않습니다). ) 또는 pkill(1)쉘 트랩 EXIT에서 프로세스를 찾아서 종료하는 방법 . (쉘을 다른 프로그램으로 교체하면 쉘 EXIT트랩이 실행되지 않을 수 있으니 exec some-other-program꼭 주의하시기 바랍니다.) 이 말은 믿을 수 없는 것 아닌가요? 그 이유는 신뢰성이 떨어지기 때문입니다.

데몬에는 포그라운드에서 실행할 수 있는 옵션이 있을 수 있습니다. 이 경우 다음과 같이 시작할 수 있으며 your-daemon --with-the-foreground-flag &필요에 따라 데몬의 출력을 리디렉션할 수 있습니다. 이 경우 SIGHUP상위 셸 프로세스가 종료되면 데몬에 적용해야 합니다. (그러나 exec다른 프로그램의 쉘이라면 아닐 수도 있습니다.)

Linux를 사용하는 경우 사람들은 터미널과 데몬 및 기타 모든 것을 사용자 정의 cgroup에 넣고 세션이 끝나면 전체 그룹을 종료할 수 있습니다.systemd가 이 작업을 수행하는 데 문제가 생겼습니다.tmux기본적으로. 이는 이중 포크 이스케이프 $!, PID 파일 없음, 잘못된 PID 파일 또는 프로세스 목록에서 프로세스 이름을 추측하는 것보다 더 안정적입니다. 또한 cgroup은 쉘이 exec다른 프로세스가 될 때 신경 쓰지 않습니다 .

관련 정보