Pertemuan 12

Penjadwalan Tugas Otomatis

Automation dengan cron, systemd timer, dan manajemen tugas terjadwal

Tujuan Pembelajaran

Setelah menyelesaikan praktikum ini, mahasiswa mampu:

  • Memahami konsep dan manfaat penjadwalan tugas otomatis
  • Menggunakan cron dan systemd timer untuk penjadwalan regular
  • Mengelola dan memonitor tugas terjadwal
  • Mengimplementasikan tugas kompleks dengan dependencies
  • Troubleshooting masalah penjadwalan

Teori Pendukung

Konsep Penjadwalan
Time-based Scheduling

Berdasarkan waktu tertentu (cron, systemd timer)

Event-based Scheduling

Berdasarkan event sistem (systemd path units)

One-time Scheduling

Tugas sekali jalan (at, batch)

Batch Processing

Saat sistem idle (batch, nice)

Komponen Cron
Crontab

File konfigurasi jadwal untuk setiap user

Cron Daemon

Service yang menjalankan tugas terjadwal

Syntax

***** command (minute, hour, day, month, weekday)

Environment

Variabel environment untuk eksekusi job

Perbandingan Scheduling Tools
Tool Kelebihan Kekurangan Use Case
cron Universal, simple syntax No job dependencies Regular maintenance tasks
systemd timer Integration dengan systemd, dependencies Complex configuration System services, complex workflows
at One-time jobs, simple No recurrence Single execution tasks
anacron Handles missed jobs Daily/weekly/monthly only Desktop, infrequent servers

Persiapan Environment

1. Setup Direktori dan User
# Buat direktori untuk praktikum penjadwalan
sudo mkdir -p /scheduling/{scripts,logs,backups}
sudo chmod 755 /scheduling

# Buat user khusus untuk tugas terjadwal
sudo useradd -m -s /bin/bash scheduler
sudo passwd scheduler

# Set ownership
sudo chown scheduler:scheduler /scheduling/
2. Install Tools yang Diperlukan
# Install at untuk one-time scheduling
sudo apt install at -y
sudo systemctl enable atd
sudo systemctl start atd

# Install anacron untuk missed jobs handling
sudo apt install anacron -y

Dasar-dasar Cron

1. Edit Crontab
# Edit crontab untuk user current
crontab -e

# Edit crontab untuk user lain
sudo crontab -u scheduler -e

# List current crontab
crontab -l
sudo crontab -u scheduler -l
2. Cron Syntax dan Examples
# Format: minute hour day month weekday command
* * * * * /scheduling/scripts/minute_task.sh

# Setiap hari pada jam 2:00 AM
0 2 * * * /scheduling/scripts/daily_backup.sh

# Setiap Senin jam 3:00 AM
0 3 * * 1 /scheduling/scripts/weekly_report.sh

# Setiap tanggal 1 bulanan jam 4:00 AM
0 4 1 * * /scheduling/scripts/monthly_cleanup.sh

# Setiap 6 jam
0 */6 * * * /scheduling/scripts/every_6hours.sh
3. Special Cron Syntax
# Setiap 5 menit
*/5 * * * * /scheduling/scripts/every_5min.sh

# Setiap hari kerja (Senin-Jumat) jam 9:00 AM
0 9 * * 1-5 /scheduling/scripts/workday_task.sh

# Setiap jam selama jam kerja
0 9-17 * * 1-5 /scheduling/scripts/business_hours.sh

# Special strings
@hourly /scheduling/scripts/hourly_task.sh
@daily /scheduling/scripts/daily_task.sh
@weekly /scheduling/scripts/weekly_task.sh
@monthly /scheduling/scripts/monthly_task.sh
@reboot /scheduling/scripts/reboot_task.sh
4. Cron Time Syntax Reference
Field Values Special Characters Examples
Minute 0-59 *, - , / */15 (setiap 15 menit)
Hour 0-23 *, - , / 0-6 (tengah malam sampai 6 pagi)
Day of Month 1-31 *, - , / 1,15 (tanggal 1 dan 15)
Month 1-12 *, - , / */3 (setiap 3 bulan)
Day of Week 0-7 (0 dan 7 = Minggu) *, - , / 1-5 (Senin-Jumat)

Implementasi Tugas Praktis dengan Cron

1. Backup Otomatis Harian
# Buat script backup
sudo nano /scheduling/scripts/daily_backup.sh

#!/bin/bash
# Daily Backup Script

DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="/scheduling/backups"
LOG_FILE="/scheduling/logs/backup_$DATE.log"
SOURCE_DIRS="/etc /home /var/log"

echo "=== BACKUP STARTED: $(date) ===" > $LOG_FILE

# Create backup
tar -czf $BACKUP_DIR/backup_$DATE.tar.gz $SOURCE_DIRS 2>> $LOG_FILE

if [ $? -eq 0 ]; then
echo "Backup completed successfully" >> $LOG_FILE
# Delete backups older than 7 days
find $BACKUP_DIR -name "*.tar.gz" -mtime +7 -delete >> $LOG_FILE
else
echo "Backup failed!" >> $LOG_FILE
fi

echo "=== BACKUP COMPLETED: $(date) ===" >> $LOG_FILE

# Make executable
sudo chmod +x /scheduling/scripts/daily_backup.sh

# Add to crontab (setiap hari jam 2:00 AM)
echo "0 2 * * * /scheduling/scripts/daily_backup.sh" | sudo crontab -
2. System Monitoring Setiap 5 Menit
# Buat monitoring script
sudo nano /scheduling/scripts/system_monitor.sh

#!/bin/bash
# System Monitoring Script

LOG_FILE="/scheduling/logs/system_monitor.log"
THRESHOLD_CPU=80
THRESHOLD_MEM=85
THRESHOLD_DISK=90

echo "$(date): Starting system check..." >> $LOG_FILE

# CPU Check
CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)
if (( $(echo "$CPU_USAGE > $THRESHOLD_CPU" | bc -l) )); then
echo "WARNING: High CPU usage: $CPU_USAGE%" >> $LOG_FILE
fi

# Memory Check
MEM_USAGE=$(free | grep Mem | awk '{printf "%.0f", $3/$2 * 100.0}')
if [ $MEM_USAGE -gt $THRESHOLD_MEM ]; then
echo "WARNING: High memory usage: $MEM_USAGE%" >> $LOG_FILE
fi

# Disk Check
DISK_USAGE=$(df / | awk 'NR==2 {print $5}' | sed 's/%//')
if [ $DISK_USAGE -gt $THRESHOLD_DISK ]; then
echo "WARNING: High disk usage: $DISK_USAGE%" >> $LOG_FILE
fi

echo "$(date): System check completed" >> $LOG_FILE

# Make executable dan tambah ke cron
sudo chmod +x /scheduling/scripts/system_monitor.sh
echo "*/5 * * * * /scheduling/scripts/system_monitor.sh" | sudo crontab -
3. Log Cleanup Mingguan
sudo nano /scheduling/scripts/log_cleanup.sh

#!/bin/bash
# Log Cleanup Script

LOG_DIR="/var/log"
BACKUP_DIR="/scheduling/backups/logs"
RETENTION_DAYS=30

# Create backup directory
mkdir -p $BACKUP_DIR

# Compress and backup old logs
find $LOG_DIR -name "*.log" -mtime +7 -exec gzip {} \;
find $LOG_DIR -name "*.gz" -mtime +$RETENTION_DAYS -delete

# Cleanup temporary files
find /tmp -type f -mtime +7 -delete
find /var/tmp -type f -mtime +30 -delete

echo "Log cleanup completed: $(date)" >> /scheduling/logs/cleanup.log

# Tambah ke cron (setiap Minggu jam 4:00 AM)
echo "0 4 * * 0 /scheduling/scripts/log_cleanup.sh" | sudo crontab -

Systemd Timer untuk Penjadwalan Modern

1. Buat Service File
sudo nano /etc/systemd/system/daily-maintenance.service

[Unit]
Description=Daily System Maintenance
After=network.target

[Service]
Type=oneshot
ExecStart=/scheduling/scripts/daily_maintenance.sh
User=root

[Install]
WantedBy=multi-user.target
2. Buat Timer File
sudo nano /etc/systemd/system/daily-maintenance.timer

[Unit]
Description=Run Daily Maintenance at 3 AM
Requires=daily-maintenance.service

[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true
RandomizedDelaySec=300

[Install]
WantedBy=timers.target
3. Aktifkan dan Manage Timer
# Reload systemd dan aktifkan timer
sudo systemctl daemon-reload
sudo systemctl enable daily-maintenance.timer
sudo systemctl start daily-maintenance.timer

# Check timer status
sudo systemctl list-timers
sudo systemctl status daily-maintenance.timer

# Manual trigger service
sudo systemctl start daily-maintenance.service
4. Systemd Timer vs Cron Comparison
Feature Systemd Timer Cron
Dependencies ✅ Supports service dependencies ❌ No dependency management
Logging ✅ Integrated with journalctl ❌ Separate log files
Random delays ✅ Built-in RandomizedDelaySec ❌ Manual implementation
Calendar syntax ✅ More flexible ❌ Traditional cron syntax
Persistent ✅ Handles missed runs ❌ Missed if system down

One-time Scheduling dengan 'at'

1. Basic at Commands
# Tugas 10 menit dari sekarang
echo "/scheduling/scripts/special_task.sh" | at now +10 minutes

# Tugas besok jam 9:00 AM
echo "tar -czf /backup/special.tar.gz /important/data" | at 9:00 tomorrow

# Tugas tanggal tertentu
echo "shutdown -r" | at 23:59 2024-12-31

# Tugas dengan waktu relatif
echo "systemctl restart apache2" | at 2:00 PM next week
2. Kelola Queue at
# Lihat antrian jobs
atq

# Hapus job dari queue
atrm 1 # Ganti dengan job number dari atq

# View job details
at -c 1 # Show job content
3. Batch Processing
# Batch job akan jalan saat load average < 1.5
echo "/scheduling/scripts/cpu_intensive_task.sh" | batch

# Batch dengan time constraint
echo "updatedb" | at midnight batch

Advanced Cron Techniques

1. Environment Variables dalam Cron
# Di crontab, set environment variables
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=admin@localhost
HOME=/home/scheduler

# Then add cron jobs
0 4 * * * /scheduling/scripts/daily_task.sh
2. Locking Mechanism untuk Prevent Overlap
sudo nano /scheduling/scripts/with_lock.sh

#!/bin/bash
# Script with locking mechanism

LOCK_FILE="/tmp/my_script.lock"

# Check if lock file exists
if [ -f "$LOCK_FILE" ]; then
echo "Script is already running. Exiting."
exit 1
fi

# Create lock file
touch "$LOCK_FILE"

# Main script logic here
echo "Running main task..."
sleep 30

# Remove lock file
rm "$LOCK_FILE"
3. Error Handling dan Notification
sudo nano /scheduling/scripts/with_error_handling.sh

#!/bin/bash
# Script with error handling and notification

LOG_FILE="/scheduling/logs/script.log"
ERROR_FILE="/tmp/script_error.$$"

# Function to handle errors
error_handler() {
echo "Error occurred at line $1" | tee -a $LOG_FILE
# Send notification
echo "Script failed: $(hostname)" | mail -s "Script Error" admin@localhost
exit 1
}

# Set error trap
trap 'error_handler $LINENO' ERR

# Main script - will trigger error trap on failure
some_command_that_might_fail
another_risky_command

Monitoring dan Troubleshooting

1. Monitor Cron Execution
# Check cron log
sudo tail -f /var/log/syslog | grep CRON

# Check specific user's cron
sudo grep CRON /var/log/syslog | grep scheduler

# Check systemd timer execution
sudo journalctl -u daily-maintenance.service
sudo journalctl --since "1 hour ago" | grep -i cron
2. Debug Cron Jobs
# Redirect output untuk debugging
* * * * * /scheduling/scripts/test.sh > /tmp/cron_debug.log 2>&1

# Atau kirim email output
MAILTO="admin@localhost"
* * * * * /scheduling/scripts/test.sh

# Test script manually dengan environment cron
env -i SHELL=/bin/bash PATH=/usr/bin:/bin /scheduling/scripts/test.sh
3. Check Cron Syntax
# Validasi crontab syntax
crontab -l | crontab -

# Online validator atau gunakan:
# https://crontab.guru/

# Debug cron dengan verbose mode
sudo cron -f -x schron # Debug mode
4. Common Cron Issues dan Solutions
Problem Cause Solution
Job not running Wrong PATH, permissions, syntax error Set full paths, check permissions, validate syntax
No output Output not captured Redirect stdout/stderr to file
Permission denied Wrong user context Run as correct user, check file permissions
Environment issues Missing environment variables Set env vars in crontab or script

Anacron untuk Missed Jobs

1. Konfigurasi Anacron
sudo nano /etc/anacrontab

# Format: period in days delay in minutes job-identifier command
1 5 daily.backup /scheduling/scripts/daily_backup.sh
7 10 weekly.cleanup /scheduling/scripts/log_cleanup.sh
@monthly 15 monthly.report /scheduling/scripts/monthly_report.sh
2. Anacron vs Cron Comparison
Aspect Anacron Cron
Frequency Daily, weekly, monthly Any minute-based schedule
Missed jobs ✅ Runs missed jobs ❌ Skips missed jobs
System requirements Doesn't need to run continuously Requires always-running system
Use case Desktops, laptops, infrequent servers Servers, frequent tasks

Security Considerations

1. Restrict Cron Access
# File allow/deny untuk cron access
sudo nano /etc/cron.allow # List users allowed to use cron
sudo nano /etc/cron.deny # List users denied from using cron

# Similarly for at command
sudo nano /etc/at.allow
sudo nano /etc/at.deny
2. Secure Cron Environment
# Gunakan full paths dalam scripts
/usr/bin/tar instead of tar

# Validasi input dan output
Sanitize all inputs in scripts

# Set appropriate permissions
sudo chmod 700 /scheduling/scripts/
sudo chown root:root /scheduling/scripts/*

# Regular audit of cron jobs
sudo crontab -l | audit for suspicious entries

Tugas dan Evaluasi

  1. Apa perbedaan antara cron, systemd timer, dan anacron? Kapan masing-masing paling tepat digunakan?
  2. Bagaimana cara mencegah cron job overlap ketika eksekusi sebelumnya belum selesai?
  3. Apa keuntungan menggunakan systemd timer dibandingkan cron tradisional?
  4. Bagaimana cara troubleshooting ketika cron job tidak dieksekusi sesuai jadwal?
  5. Buat skenario: Perusahaan membutuhkan backup database setiap jam, cleanup log harian, dan report mingguan. Tulis implementasi lengkapnya!

Case Study: E-commerce Scheduling System

#!/bin/bash
# E-commerce Scheduling System

echo "Setting up e-commerce scheduling system..."

# 1. Database backup every 6 hours
cat > /scheduling/scripts/db_backup.sh << 'EOF'

#!/bin/bash
# Database Backup Script
mysqldump -u root ecommerce_db > /scheduling/backups/db_$(date +%Y%m%d_%H%M%S).sql
find /scheduling/backups -name "*.sql" -mtime +7 -delete
EOF

# 2. Inventory update every 30 minutes
cat > /scheduling/scripts/inventory_sync.sh << 'EOF'

#!/bin/bash
# Inventory Synchronization
python3 /opt/ecommerce/inventory_sync.py
EOF

# 3. Sales report daily at 11 PM
cat > /scheduling/scripts/sales_report.sh << 'EOF'

#!/bin/bash
# Daily Sales Report
python3 /opt/ecommerce/generate_report.py --daily
EOF

# Setup crontab
(crontab -l 2>/dev/null; echo "0 */6 * * * /scheduling/scripts/db_backup.sh") | crontab -
(crontab -l 2>/dev/null; echo "*/30 * * * * /scheduling/scripts/inventory_sync.sh") | crontab -
(crontab -l 2>/dev/null; echo "0 23 * * * /scheduling/scripts/sales_report.sh") | crontab -

echo "E-commerce scheduling system configured!"