현재 다음을 수행하고 있습니다.
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
하면 귀하의 watch
is 이 표시되어야 합니다 Stopped
.
설명하다
중지된 이유는 watch
SIGTTOU를 수신했기 때문입니다. SIGTTIN 및 SIGTTOU는 기본적으로 터미널에서 읽거나 터미널에 쓰려고 하는 백그라운드 프로세스(즉, 포그라운드 프로세스 그룹에 속하지 않은 프로세스)를 중지하는 신호입니다. 일반적으로 터미널은 쓰기를 시도하는 백그라운드 프로세스에 SIGTTOU를 보내지 않도록 구성되어 있지만(예: 작동함 date &
)백그라운드 프로세스가 터미널을 구성하려고 시도하면 어쨌든 SIGTTOU를 받게 됩니다.. 전체 메커니즘은 백그라운드 프로세스가 터미널 입력을 훔치거나 변조하는 것을 방지합니다.
watch
아주 일찍 터미널 구성을 시도했습니다 . watch
백그라운드에서 실행 하면 ( watch … &
원하는 대로) SIGTTOU를 수신하고 중지됩니다. 이 작업을 시도하면 bg
다시 차단됩니다. 이것을 시도하면 fg
포그라운드로 가져오고 터미널과 상호 작용할 수 있으며 SIGTTOU를 수신하지 않고 작동합니다.
결론적으로
watch
백그라운드에서 실행되는 것은 아닙니다.
작업 대안
간단한 루프를 사용하십시오.
while sleep 100; do … done > … &