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

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

Ubuntu 20에서 배치 작업을 제출합니다.

at now -f myscript.sh

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

답변1

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

예: #!/bin/sh 대신 #!/bin/sh -x

작업이 진행되는 동안 cron 로그를 tail -f하면 진행 상황을 볼 수 있습니다. 알림, 이로 인해 많은 로그 데이터가 생성됩니다! 어떻게든 진행 상황을 표시하도록 스크립트를 수정하도록 선택할 수 있습니까? echo "해체 완료, xxx 설정 시작"

답변2

at도구는 프로세스의 stdout을 캡처한 다음 이를 로그로 보냅니다. 따라서 크게 변경하지 않으면 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. stdout을 파일에 복제할 수 있습니다. 그러면 스크립트에서 로그 메시지 인쇄가 중복되는 데 도움이 될 수 있습니다.

#!/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

관련 정보