less(1)
우리 회사의 프로덕션 서버에서 명령에 대한 시간 제한을 설정 하고 싶습니다 . 우리는 매일 큰 로그 파일을 생성하고 매일 밤 이를 보관/삭제하는 일괄 작업이 있지만 (장기) 실행 프로세스가 차단될 수 있으므로 디스크 사용량이 높다는 경고를 받는 경우가 있습니다. 파일은 unlink(2)
참조에 의해 물리적으로 -ed - POSIX 파일 시스템의 의미론적 개수.
이러한 성가심의 가장 일반적인 경우를 피하기 위해 나는 less
이를 실행하는 래퍼를 작성했습니다.timeout(1)
less
파일 시스템에 열린 파일을 남기지 않고 몇 시간 후에 유휴 프로세스가 자동으로 종료됩니다.
그러나 결과는 잘못 작동합니다. 명령이 man(1)
환경 변수를 통해 래퍼를 시작하면 키보드 입력에 대한 응답이 중지됩니다. 다음은 재현 가능한 최소 테스트 사례입니다.man
PAGER
$ PAGER='timeout 12h /bin/less' man man
실행 후 ps fx
출력은 다음과 같습니다.
19415 pts/1 SNs 0:00 \_ -bash
19854 pts/1 SN+ 0:00 \_ man man
19867 pts/1 SN 0:00 \_ timeout 12h /bin/less
19869 pts/1 TN 0:00 \_ /bin/less
나는 단지 kill -KILL 19869
터미널에 다시 접근할 수 있었다.
내가 여기서 뭘 잘못하고 있는 걸까? less
프로세스가 T
상태가 아닌 이유는 무엇 입니까 S
?
답변1
인터넷 검색으로 어떤 팁도 찾을 수 없기 때문에 내 자신의 질문에 대답합니다.
strace(1)
실제로 프로세스 SIGTTOU
에 전송된 정보를 표시하는 것이 가능합니다 .less
이는 와 유사
SIGTTIN
하지만 백그라운드 작업의 프로세스가 터미널에 쓰거나 해당 모드를 설정하려고 할 때 생성됩니다. ...전단...
분명히 timeout(1)
관리되는 프로세스는 기본적으로 백그라운드에 배치됩니다.
--foreground
관리되는 명령이 전면 TTY를 올바르게 사용할 수 있도록 별도의 백그라운드 프로그램 그룹을 생성하지 마십시오. ...전단...
그래서 내 문제에 대한 해결책은
$ PAGER='/bin/timeout --foreground 12h /bin/less' man man
(그리고 내 패키지의 이에 상응하는 것)