소개
여러분이 잠든 동안 집을 청소하는 로봇이 있다고 상상해 보세요. 잠들어 있으므로 로봇이 작업하는 모습을 볼 수 없습니다. 아침에 일어났을 때 로봇이 실제로 청소를 끝냈는지, 아니면 소파 밑에 걸려 멈췄는지 어떻게 알 수 있을까요?
방법은 간단합니다. 로봇에게 일지를 작성하게 하면 됩니다.
Linux 에서 자동화 스크립트는 백그라운드에서 실행되거나, 아무도 터미널을 지켜보지 않는 스케줄러에서 실행되는 경우가 많습니다. 따라서 화면 출력만으로는 충분하지 않습니다. 어떤 일이 발생했는지 추적하려면 출력을 로그 파일에 기록합니다.
로그를 남기는 것은 가장 단순하면서도 매우 중요한 자동화 습관 중 하나입니다. 로그가 없는 스크립트는 아무런 표시 없이 실패할 수 있습니다. 로그가 있는 스크립트는 실행 결과를 확인할 수 있는 증거를 남깁니다.
이 실습에서는 다음 작업을 수행합니다.
- 출력 전환: 스크립트가 화면 대신 파일에 쓰도록 설정합니다.
- 기존 기록 보존: Append 연산자를 사용하여 기존 내용을 삭제하지 않고 새 항목을 추가합니다.
- 타임스탬프 추가: 모든 일지 항목에 날짜와 시간이 포함되도록 설정합니다.
출력을 로그 파일에 추가하기
일반적인 스크립트는 출력을 즉시 화면에 표시합니다. 이는 사람과 직접 대화하는 것과 같습니다. 하지만 자동화 스크립트처럼 아무도 듣고 있지 않다면 출력 내용은 영원히 사라집니다.
이 내용을 파일에 저장해야 합니다. 이를 위해 리디렉션 연산자를 사용합니다.
이는 앞에서 배운 셸의 개념과 직접 연결됩니다. 명령은 일반적으로 표준 출력에 내용을 쓰며, 리디렉션을 사용하면 출력 대상이 바뀝니다. 로깅은 이 기능을 자동화에 실용적으로 적용한 것입니다.
>(덮어쓰기): "일지를 지우고 새 페이지를 시작합니다." (이력 보존에 부적합)>>(추가): "다음 빈 줄로 이동하여 내용을 기록합니다." (이력 보존에 적합)
준비된 간단한 스크립트를 확인합니다.
cat myscript.sh
스크립트에는 "The script is running"이라는 내용만 있습니다. 지금 ./myscript.sh를 실행하면 이 문장이 화면에 표시됩니다.
이제 스크립트가 script.log라는 일지 파일에 내용을 쓰도록 수정합니다.
스크립트를 엽니다.
nano myscript.sh
해당 줄에서 >> 연산자를 사용하도록 수정합니다.
전문가 팁: 로그를 기록할 때는 /home/labex/project/script.log처럼 항상 절대 경로(전체 경로) 를 사용합니다. 그러면 스크립트가 다른 위치에서 실행되더라도 일지가 임의의 폴더에 저장되지 않습니다.
이 습관이 중요한 이유는 예약 작업이 대화형 셸에서 예상한 위치와 다른 작업 디렉터리에서 실행되는 경우가 많기 때문입니다. 경로 없이 script.log에 쓰는 스크립트는 파일을 잘못된 위치에 만들 수 있습니다.
파일은 다음과 같아야 합니다.
#!/bin/bash
echo "The script is running" >> /home/labex/project/script.log
파일을 저장하고 종료합니다.
이제 스크립트를 실행합니다.
./myscript.sh
아무 출력도 표시되지 않습니다.
스크립트는 실행되었지만 화면에 아무것도 표시하지 않았습니다. 대신 일지에 조용히 내용을 기록했습니다.
일지를 확인합니다.
cat script.log
메시지가 파일에 정상적으로 저장된 것을 확인할 수 있습니다.
타임스탬프 추가하기
"무슨 일이 발생했는가"를 기록한 일지 항목에 "언제 발생했는가"가 없다면 유용하지 않습니다. 스크립트가 1 년 동안 매일 실행된다면 로그 파일에는 "The script is running"이라는 동일한 줄이 365 개만 쌓이게 됩니다.
타임스탬프를 추가해야 합니다. Linux 에는 현재 시간을 출력하는 date 명령이 있습니다. 이 명령의 출력도 로그 파일에 리디렉션합니다.
이는 **관측 가능성 (observability)**의 시작입니다. 나중에 사람이 어떤 일이 발생했는지 재구성할 수 있도록 충분한 증거를 남기는 것입니다. 아주 간단한 타임스탬프만으로도 자동화 작업의 문제를 해결하는 능력이 크게 향상됩니다.
myscript.sh를 엽니다.
nano myscript.sh
메시지보다 먼저 date 명령을 추가합니다. 그러면 로그에 시간이 먼저 기록되고, 그다음에 작업 내용이 기록됩니다.
#!/bin/bash
date >> /home/labex/project/script.log
echo "The script is running" >> /home/labex/project/script.log
파일을 저장하고 종료합니다.
스크립트를 다시 실행합니다.
./myscript.sh
로그를 확인합니다.
cat script.log
이제 다음과 비슷한 내용이 표시됩니다.
The script is running
Fri Oct 27 10:00:00 UTC 2023
The script is running
(첫 번째 줄은 이전 테스트에서 기록된 내용입니다.)
이제 모든 작업에 정확한 시간이 기록됩니다. 이렇게 하면 자동화된 백업이 실제로 새벽 3 시에 실행되었다는 사실을 상사에게 증명할 수 있습니다.
대규모 시스템에서는 로그를 사용하여 스크립트가 두 번 실행되었는지, 중간에 중지되었는지, 실행 사이에 얼마나 시간이 걸렸는지와 같은 더 복잡한 질문에도 답할 수 있습니다. 좋은 로그는 보이지 않던 자동화 작업을 직접 확인할 수 있는 정보로 바꿔 줍니다.
로그 이력 확인하기
"추가" 이론을 테스트해 보겠습니다. >>(추가) 대신 >(덮어쓰기) 를 사용했다면 로그 파일은 커지지 않고 사실상 마지막 실행 결과만 표시했을 것입니다.
이 차이는 스크립트가 반복해서 실행될 때 중요합니다. 덮어쓰기는 현재 상태를 보여 주는 용도로 유용하지만, 이벤트 순서를 보존해야 하는 이력 기록에는 일반적으로 추가 방식이 더 적합합니다.
스크립트가 여러 번 실행되는 바쁜 하루를 시뮬레이션합니다.
다음 명령을 연속해서 세 번 실행합니다.
./myscript.sh
./myscript.sh
./myscript.sh
이제 일지를 읽습니다.
cat script.log
각 항목에 타임스탬프가 포함되고 목록이 계속 늘어난 것을 확인할 수 있습니다. 이 이력은 문제를 해결할 때 매우 중요합니다. 예를 들어 어제 서버가 중단되었다면 로그에서 어제의 타임스탬프를 찾아 해당 시점에 스크립트가 정확히 무엇을 하고 있었는지 확인할 수 있습니다.
요약
이제 스크립트가 일지를 기록하도록 설정했습니다.
이 실습에서는 다음 내용을 배웠습니다.
- 리디렉션 (
>>): "말한 내용"을 파일로 보내어 사라지지 않게 하는 방법 - 추가: 기존 기록을 지우지 않고 이력을 계속 쌓는 방법
- 타임스탬프 기록:
date를 추가하여 작업이 언제 발생했는지 확인하는 방법
Linux 에서 전문적인 서비스를 운영할 때는 이 방식을 표준으로 사용합니다. 웹 서버든 데이터베이스든, 방금 작성한 것처럼 로그 파일에 내용을 기록합니다.



