Recraftory

Automation dan Crontab

Otomatisasi tugas dengan cron dan script scheduling

Cron

Daemon scheduler di Unix. Format:

* * * * * command
- - - - -
| | | | |
| | | | +----- Day of week (0-7)
| | | +------- Month (1-12)
| | +--------- Day of month (1-31)
| +----------- Hour (0-23)
+------------- Minute (0-59)

Spesial String

  • @yearly / @monthly / @weekly / @daily / @hourly / @reboot

Contoh Entry

0 3 * * * /path/to/backup.sh       # Setiap jam 3 pagi
*/5 * * * * /path/to/monitor.sh    # Setiap 5 menit
0 9 * * 1 /path/to/report.sh       # Setiap Senin jam 9 pagi

Mengelola Crontab

crontab -e      # Edit
crontab -l      # List
crontab -r      # Hapus semua

Environment

Cron berjalan dengan environment minimal. Gunakan path absolut atau set PATH di awal crontab.

Script Backup Otomatis

#!/bin/bash
set -euo pipefail

readonly BACKUP_DIR="/backup"
readonly SOURCE_DIR="/var/www/html"
readonly DATE=$(date +%Y%m%d_%H%M%S)
readonly BACKUP_FILE="backup_${DATE}.tar.gz"
readonly RETENTION_DAYS=7

mkdir -p "$BACKUP_DIR"
tar -czf "${BACKUP_DIR}/${BACKUP_FILE}" -C "$(dirname "$SOURCE_DIR")" "$(basename "$SOURCE_DIR")"
find "$BACKUP_DIR" -name "backup_*.tar.gz" -mtime +$RETENTION_DAYS -delete

echo "[$(date)] Backup selesai: ${BACKUP_FILE}" >> /var/log/backup.log

Lock File (Anti Overlap)

#!/bin/bash
LOCKFILE="/var/run/myscript.lock"

if [ -f "$LOCKFILE" ] && kill -0 "$(cat "$LOCKFILE")" 2>/dev/null; then
  echo "Script sedang berjalan"
  exit 1
fi

echo $$ > "$LOCKFILE"
trap 'rm -f "$LOCKFILE"' EXIT

# Script utama...

Systemd Timer

# /etc/systemd/system/backup.timer
[Unit]
Description=Run backup daily

[Timer]
OnCalendar=daily
Persistent=true

[Install]
WantedBy=timers.target
sudo systemctl enable backup.timer
sudo systemctl start backup.timer
systemctl list-timers

At (One-time)

echo "/path/to/script.sh" | at 3:00 AM tomorrow
atq             # List job
atrm 1          # Hapus job

Best Practice

  • Gunakan path absolut
  • Redirect output ke log: >> /var/log/job.log 2>&1
  • Set environment variable di crontab
  • Gunakan lock file untuk script lama
  • Kirim email jika job gagal (MAILTO)
  • Log exit code untuk debugging