Coreutils timeout(1)은 man/less에서는 잘 작동하지 않습니다.

Coreutils timeout(1)은 man/less에서는 잘 작동하지 않습니다.

less(1)우리 회사의 프로덕션 서버에서 명령에 대한 시간 제한을 설정 하고 싶습니다 . 우리는 매일 큰 로그 파일을 생성하고 매일 밤 이를 보관/삭제하는 일괄 작업이 있지만 (장기) 실행 프로세스가 차단될 수 있으므로 디스크 사용량이 높다는 경고를 받는 경우가 있습니다. 파일은 unlink(2)참조에 의해 물리적으로 -ed - POSIX 파일 시스템의 의미론적 개수.

이러한 성가심의 가장 일반적인 경우를 피하기 위해 나는 less이를 실행하는 래퍼를 작성했습니다.timeout(1)less파일 시스템에 열린 파일을 남기지 않고 몇 시간 후에 유휴 프로세스가 자동으로 종료됩니다.

그러나 결과는 잘못 작동합니다. 명령이 man(1)환경 변수를 통해 래퍼를 시작하면 키보드 입력에 대한 응답이 중지됩니다. 다음은 재현 가능한 최소 테스트 사례입니다.manPAGER

$ 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

(그리고 내 패키지의 이에 상응하는 것)

관련 정보