Skip to content
toylee blog
toylee blog

컴퓨터·IT 문제 해결과 최신 기술 정보

  • 홈
  • 컴퓨터 활용
  • 프로그래밍
    • 파이썬
    • 자바(Java)
    • Flutter
    • HTML
    • Linux
    • 워드프레스
  • 맥북
  • IT 일반
  • 블로그 소개
  • 문의하기
toylee blog

컴퓨터·IT 문제 해결과 최신 기술 정보

리눅스 자동화 스크립트: Bash 안전장치와 systemd timer

toylee, 2026년 02월 17일2026년 08월 27일

리눅스 자동화는 명령을 한 줄로 줄이는 작업이 아니라, 실패를 감지하고 중복 실행을 막으며 누가 언제 실행했는지 확인 가능하게 만드는 일입니다. 먼저 스크립트를 수동으로 반복 실행해도 안전한 형태로 만든 뒤 예약 작업에 연결합니다.

[목차]

  • 안전한 Bash 기본 골격
  • systemd service 만들기
  • systemd timer로 예약하기
  • cron을 쓸 때 주의할 점
  • 운영 전 체크리스트
  • 공식 참고자료
  • 관련 글

안전한 Bash 기본 골격

#!/usr/bin/env bash
set -Eeuo pipefail
umask 077

readonly lock_file="/run/lock/report-job.lock"
readonly output_dir="/srv/reports"

exec 9>"$lock_file"
flock -n 9 || {
  echo "another run is active" >&2
  exit 75
}

mkdir -p "$output_dir"
tmp="$(mktemp "$output_dir/.report.XXXXXX")"
trap 'rm -f "$tmp"' EXIT

generate-report > "$tmp"
test -s "$tmp"
mv "$tmp" "$output_dir/latest.txt"
trap - EXIT
  • set -Eeu는 오류와 미정의 변수 누락을 빨리 드러냅니다.
  • pipefail은 파이프 중간 명령의 실패도 전달합니다.
  • flock은 이전 실행이 끝나기 전에 새 작업이 겹치는 것을 막습니다.
  • 임시 파일을 완성한 뒤 mv하면 불완전한 결과 노출을 줄일 수 있습니다.

systemd service 만들기

# /etc/systemd/system/report-job.service
[Unit]
Description=Generate daily report

[Service]
Type=oneshot
User=reporter
Group=reporter
ExecStart=/usr/local/sbin/report-job
NoNewPrivileges=true
PrivateTmp=true

가능하면 root가 아닌 전용 계정으로 실행하고 필요한 디렉터리에만 쓰기 권한을 줍니다.

systemd timer로 예약하기

# /etc/systemd/system/report-job.timer
[Unit]
Description=Run report job every day

[Timer]
OnCalendar=*-*-* 03:15:00
Persistent=true
RandomizedDelaySec=10m

[Install]
WantedBy=timers.target
sudo systemctl daemon-reload
sudo systemctl enable --now report-job.timer
systemctl list-timers report-job.timer
sudo systemctl start report-job.service
journalctl -u report-job.service --since today

Persistent=true는 예약 시간에 시스템이 꺼져 있었다면 다음 부팅 후 놓친 실행을 보완합니다. 여러 서버가 같은 시각에 작업하지 않도록 RandomizedDelaySec를 사용할 수 있습니다.

cron을 쓸 때 주의할 점

cron 환경은 로그인 셸보다 PATH와 환경 변수가 제한적입니다. 실행 파일은 절대 경로를 사용하고 출력과 오류를 로그 또는 모니터링 시스템으로 보냅니다. 비밀번호를 crontab에 직접 넣지 마세요.

운영 전 체크리스트

  • 같은 작업을 두 번 실행해도 데이터가 깨지지 않는가?
  • 네트워크 오류와 디스크 부족 시 종료 코드가 0이 아닌가?
  • 실패 알림과 마지막 성공 시간을 확인할 수 있는가?
  • 로그에 비밀번호와 토큰이 출력되지 않는가?
  • 삭제 명령은 대상 경로가 비어 있지 않은지 검증하는가?

공식 참고자료

  • GNU Bash Reference Manual
  • systemd.service
  • systemd.timer

관련 글

  • PostgreSQL 백업 자동화: pg_dump와 복구 검증
  • SQLite 데이터 백업과 복구: 안전한 명령과 검증 절차

내용 검토 및 업데이트: 2026년 8월 27일

Linux IT 튜토리얼

글 탐색

Previous post
Next post

Related Posts

Linux

서버 성능 모니터링과 튜닝 방법

2023년 08월 03일

현대 IT 시스템은 기업과 조직에서 매우 중요한 역할을 합니다. 이러한 시스템이 원활하게 작동하려면 서버 성능을 모니터링하고 조정하는 것이 필수적입니다. 서버 성능을 모니터링하고 조정하는 방법에 대해 자세히 살펴보겠습니다. 서버 성능 모니터링 서버 성능 모니터링은 서버가 어떻게 작동하는지 확인하는 것을 포함합니다. 이를 통해 서버의 CPU, 메모리, 디스크, 네트워크 등의 사용률을 파악하고 병목…

Read More
Linux

서버 하드웨어 선정을 위한 가이드

2023년 07월 28일

가장 적합한 서버 하드웨어를 선택하는 것은 어느 회사나 조직에서나 중요한 결정입니다. 시스템의 안정성, 성능 및 확장성에 직접적인 영향을 미칩니다. 이 글에서는 서버 하드웨어를 선택할 때 고려해야 할 몇 가지 중요한 요소에 대해 알아보고 최적의 결정을 내릴 수 있도록 포괄적인 가이드를 제공합니다. 실적 서버 하드웨어와 관련하여 성능은 간과해서는 안 될 중요한…

Read More
Linux

서버 가상화와 클라우드의 차이점

2023년 08월 03일

최근 몇 년간 기업들은 클라우드 서비스를 통해 IT 인프라를 구축하는 것이 인기를 얻고 있습니다. 그러나 서버 가상화와 클라우드 서비스가 무슨 차이가 있는지 헷갈리는 경우가 많습니다. 이번에는 두 기술의 차이점에 대해 자세히 알아보겠습니다. 서버 가상화와 클라우드 서비스는 모두 IT 인프라를 구축하고 운영하는 기술이지만, 그 차이점은 명확합니다. 서버 가상화는 기존의 하드웨어 서버를…

Read More

최신 글

  • 브라우저 캐시 삭제가 필요한 경우와 안전하게 정리하는 방법 정리
  • 맥북 발열 줄이는 기본 설정: 성능과 배터리를 지키는 실천 방법
  • 에러 로그 읽는 습관 만들기: 개발 속도를 높이는 실전 분석 요령
  • HTML 링크 태그 접근성 체크리스트: 누구나 이용하기 쉬운 웹사이트 만드는 방법
  • 워드프레스 글 발행 체크리스트: 놓치기 쉬운 7가지 필수 점검 항목

최신 댓글

보여줄 댓글이 없습니다.

보관함

  • 2026년 9월
  • 2026년 8월
  • 2026년 2월
  • 2025년 7월
  • 2025년 6월
  • 2025년 5월
  • 2025년 4월
  • 2025년 3월
  • 2025년 2월
  • 2025년 1월
  • 2024년 12월
  • 2024년 11월
  • 2024년 8월
  • 2024년 6월
  • 2024년 5월
  • 2024년 3월
  • 2024년 2월
  • 2023년 11월
  • 2023년 9월
  • 2023년 8월
  • 2023년 7월
  • 2023년 6월
  • 2023년 5월
  • 2023년 4월
  • 2023년 3월
  • 2023년 2월

카테고리

  • Flutter
  • HTML
  • IT 일반
  • Linux
  • 맥북
  • 워드프레스
  • 자바(Java)
  • 컴퓨터 활용
  • 파이썬
  • 프로그래밍

사이트 안내

  • 블로그 소개
  • 문의하기
  • 개인정보 처리방침
©2026 toylee blog | WordPress Theme by SuperbThemes