프로세스가 백그라운드에서 시작되었는지 또는 실행 중에 백그라운드로 진입했는지 확인

프로세스가 백그라운드에서 시작되었는지 또는 실행 중에 백그라운드로 진입했는지 확인

저는 특히 Linux에 관심이 있지만 다른 Unices의 답변도 좋습니다. 시스템이 백그라운드에서 시작된 프로세스에 신호를 보내는 방법이 있습니까? 즉, 스크립트가 시작될 때 백그라운드에 있는지 알려주기 위해 내가 포착할 수 있는 신호 또는 Bash/Perl/Python 스크립트 또는 유사한 스크립트에서 확인할 수 있는 신호가 있습니까?

답변1

이러한 맥락에서 "배경"은 여러 가지 의미를 가질 수 있습니다.

이는 아마도 제어 터미널이 없다는 것을 의미합니다. (예를 들어 cron, systemd 또는 init에서 무언가가 시작됩니다.)

백그라운드로 들어갈 뿐만 아니라 getppid상위 프로세스( )로부터 격리되면 상위 프로세스의 pid는 1이 됩니다. 이는 제어 터미널이 있든 없든 발생할 수 있습니다.

프로세스에 제어 터미널이 있으면 포그라운드나 백그라운드에 있을 수 있습니다.

프로세스가 포그라운드에 있으면 getpgrptcgetpgrp함수는 동일한 값을 반환합니다(tcgetpgrp에 제어 터미널의 파일 설명자가 할당되었다고 가정합니다(예: 2=stderr).

프로세스가 백그라운드에 있으면 다른 번호가 반환 getpgrp됩니다 .tcgetpgrp

프로세스가 포그라운드에 있고 중지된 경우 SIGSTOP 또는 SIGTSTP 신호 중 하나를 수신합니다. SIGSTOP은 포착할 수 없으며 SIGTSTP를 포착하면 작업이 중지되지 않습니다.

프로세스가 중지된 상태에서 다시 시작되면 SIGCONT 신호를 수신한 후 포그라운드에 있는지 아니면 백그라운드에 있는지 확인할 수 있습니다.

프로세스가 백그라운드에 있다가 포그라운드로 가져오면 아무런 신호도 받지 못할 것 같지만 위의 확인은 계속 작동합니다.

프로세스가 백그라운드에 있고 입력 또는 (아마도) 출력을 시도하면 포착할 수 있는 SIGTTIN 또는 SIGTTOU(각각)를 받게 됩니다.

위의 내용은 Linux 및 대부분의 Unix 시스템을 포괄하는 POSIX 시스템에 해당됩니다.

프로그램이 파이프 중간에 있으면 stdin 및 stdout은 제어 터미널이 아닙니다(또는 둘 중 하나가 파이프의 양쪽 끝에 있으면 제어 터미널이 아닙니다). 또는 stderr을 리디렉션할 수도 있습니다(그러나 그럴 가능성은 낮습니다). 제어 터미널을 열어서 얻을 수 있지만 /dev/tty(없으면 실패합니다) 이식성이 없습니다. (더 좋은 방법이 있는지는 모르겠습니다.)

관련 정보