`watch -n 100 'sh script.sh >> /path/to/output/output.txt`가 output.txt를 쓰지 않습니까?

`watch -n 100 'sh script.sh >> /path/to/output/output.txt`가 output.txt를 쓰지 않습니까?

현재 다음을 수행하고 있습니다.

watch -n 100 'sh script.sh >> /path/to/output/output.txt' &

30분 동안 실행되었지만(을 사용하여 확인할 수 있음 ps -ef | grep watch) 아무 것도 기록되지 않습니다 /path/to/output/output.txt(파일이 존재하지 않음). script.sh터미널에 인쇄하는 명령을 실행하면 >>모든 것이 터미널로 전달되어서 는 안 될까요 output.txt?

답변1

가설

당신의 것이 watch멈췄습니다. 해석된 쉘을 시작하기 전에 중지됩니다 sh script.sh >> /path/to/output/output.txt. 리디렉션이 아직 발생하지 않았으므로 파일이 존재하지 않습니다. sh script.sh아직 시작되지 않았습니다.


확인하다

대화형 쉘에서 작업이 중지되었음을 알렸을 수 있습니다. 아마도 메시지를 놓쳤을 것입니다. 전화 jobs하면 귀하의 watchis 이 표시되어야 합니다 Stopped.


설명하다

중지된 이유는 watchSIGTTOU를 수신했기 때문입니다. SIGTTIN 및 SIGTTOU는 기본적으로 터미널에서 읽거나 터미널에 쓰려고 하는 백그라운드 프로세스(즉, 포그라운드 프로세스 그룹에 속하지 않은 프로세스)를 중지하는 신호입니다. 일반적으로 터미널은 쓰기를 시도하는 백그라운드 프로세스에 SIGTTOU를 보내지 않도록 구성되어 있지만(예: 작동함 date &)백그라운드 프로세스가 터미널을 구성하려고 시도하면 어쨌든 SIGTTOU를 받게 됩니다.. 전체 메커니즘은 백그라운드 프로세스가 터미널 입력을 훔치거나 변조하는 것을 방지합니다.

watch아주 일찍 터미널 구성을 시도했습니다 . watch백그라운드에서 실행 하면 ( watch … &원하는 대로) SIGTTOU를 수신하고 중지됩니다. 이 작업을 시도하면 bg다시 차단됩니다. 이것을 시도하면 fg포그라운드로 가져오고 터미널과 상호 작용할 수 있으며 SIGTTOU를 수신하지 않고 작동합니다.


결론적으로

watch백그라운드에서 실행되는 것은 아닙니다.


작업 대안

간단한 루프를 사용하십시오.

while sleep 100; do … done > … &

관련 정보