"at" 명령을 사용하여 제출된 일괄 작업의 런타임 로그를 확인하는 방법은 무엇입니까?

"at" 명령을 사용하여 제출된 일괄 작업의 런타임 로그를 확인하는 방법은 무엇입니까?

Ubuntu 20에서 일괄 작업을 제출하고 있습니다.

at now -f myscript.sh

작업이 완료되면 로그가 포함된 이메일을 받습니다. 하지만 시간이 많이 걸리는 작업의 경우 실행 진행 상황을 확인하고 싶습니다. 어떻게 해야 하나요?

답변1

이는 매우 장황하지만 myscript.sh의 첫 번째 행에 있는 쉘에 -x를 추가하면 스크립트의 행별 실행이 표시됩니다. 출력은 작업을 제출한 사용자에게 이메일로 전송되고 cron 로그에도 나타납니다.

예를 들어 #!/bin/sh 대신 #!/bin/sh -x를 사용합니다.

작업이 진행되는 동안 tail -f cron log를 실행하여 진행 상황을 확인하세요. 참고로 이렇게 하면 많은 로그 데이터가 생성됩니다! 어떤 방식으로든 진행 상황을 표시하기 위해 스크립트를 수정하도록 선택할 수 있습니까? echo "분해가 완료되었습니다. xxx 설치를 시작하세요."

답변2

at도구는 프로세스의 표준 출력을 캡처한 다음 이를 로그로 보냅니다. 따라서 로그를 크게 변경하지 않고 at기록되는 동안 로그를 읽는 것은 불가능합니다 .

하지만 두 번째 로그를 사용하여 이 문제를 해결할 수 있습니다. 알려진 이름의 파일에 "진행률" 로그를 인쇄하면 됩니다. 그 후에는 tail -f원하는 대로 무시하거나 무시할 수 있습니다.

즉, 실행하는 스크립트는 다음 at과 같습니다.

#!/bin/sh
echo Started at `date` 
echo Started at `date` > /var/myscript.log
some_long_running_process_with_log >> /var/myscript.log
rc=$?
echo Completed at `date` with return code $rc
echo Completed at `date` with return code $rc >> /var/myscript.log

at이 경우 메일로 전송된 내용에 대한 짧은 로그(단 두 줄)와 장기 실행 내부 부분의 모든 로그를 갖게 됩니다 .

이 방법의 확장으로 tee표준 출력을 파일에 복사할 수 있는 . 그러면 스크립트에서 로그 메시지를 반복적으로 인쇄하는 데 도움이 될 수 있습니다.

#!/bin/sh
echo Started at `date` | tee /var/myscript.log
some_long_running_process_with_log >> /var/myscript.log
rc=$?
echo Completed at `date` with return code $rc | tee -a /var/myscript.log

관련 정보