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일

현재 대부분의 비즈니스는 인터넷을 통해 운영됩니다. 이를 위해서는 서버를 운영하여 데이터를 저장하고, 소프트웨어를 구동시켜야 합니다. 그러나 서버 운영은 많은 비용이 들기 때문에, 이를 최적화하는 방법이 필요합니다. 이번 글에서는 서버 운영에 대한 비용 최적화 방법에 대해 자세히 알아보겠습니다. 클라우드 서비스 이용하기 서버를 구입하고 운영하는 것은 많은 비용이 듭니다. 따라서 클라우드 서비스를…

Read More
Linux

서버 보안 강화 방법

2023년 07월 28일

오늘날의 세계에서 인터넷은 우리 삶의 핵심이 되었고, 이로 인해 서버의 중요성은 기하급수적으로 증가했습니다. 그 결과 서버 보안은 그 어느 때보다 중요해졌습니다. 서버 공격은 막대한 데이터 침해와 비용이 드는 다운타임을 포함하여 심각한 손상을 초래할 수 있습니다. 따라서 서버 보안을 강화할 수 있는 효과적인 방법을 모색하는 것이 필수적입니다. 주요 항목 1: 암호화…

Read More
Linux

FTP 서버 보안 강화 방법

2024년 05월 14일

FTP 서버 보안은 귀중한 데이터를 보호하는 데 중요한 역할을 합니다. FTP 서버는 파일 전송을 용이하게 하는 동시에, 보안 취약점을 가진 서비스 중 하나입니다. 따라서 FTP 서버 보안을 강화하여 민감한 정보 유출을 방지하는 것이 중요합니다. 이 문서에서는 FTP 서버 보안을 강화하는 방법과 주요 이슈에 대해 자세히 살펴보겠습니다. 보다 안전한 파일 전송을 위해 FTP 서버의 보안을 강화하는 방법을 이해하고 적용하는 것이 중요하다.

Read More

최신 글

  • 맥북 외부 모니터 연결 시 체크할 점: 화면 출력과 발열 관리 핵심 정리
  • 자동화 스크립트 설계 순서: 실패 없는 반복 업무 자동화 구축 방법
  • 시맨틱 태그를 써야 하는 이유와 의미 있는 웹 문서 작성 방법
  • 워드프레스 스팸 댓글 관리 기본 설정: 악성 링크와 광고 차단 요령
  • 파이썬 CSV 자동 정리 스크립트 작성법과 표준 라이브러리 활용법

최신 댓글

보여줄 댓글이 없습니다.

보관함

  • 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