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
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)
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
sudo mkdir -p /scheduling/{scripts,logs,backups}
sudo chmod 755 /scheduling
sudo useradd -m -s /bin/bash scheduler
sudo passwd scheduler
sudo chown scheduler:scheduler /scheduling/
2. Install Tools yang Diperlukan
sudo apt install at -y
sudo systemctl enable atd
sudo systemctl start atd
sudo apt install anacron -y
Dasar-dasar Cron
1. Edit Crontab
crontab -e
sudo crontab -u scheduler -e
crontab -l
sudo crontab -u scheduler -l
2. Cron Syntax dan Examples
* * * * * /scheduling/scripts/minute_task.sh
0 2 * * * /scheduling/scripts/daily_backup.sh
0 3 * * 1 /scheduling/scripts/weekly_report.sh
0 4 1 * * /scheduling/scripts/monthly_cleanup.sh
0 */6 * * * /scheduling/scripts/every_6hours.sh
3. Special Cron Syntax
*/5 * * * * /scheduling/scripts/every_5min.sh
0 9 * * 1-5 /scheduling/scripts/workday_task.sh
0 9-17 * * 1-5 /scheduling/scripts/business_hours.sh
@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
sudo nano /scheduling/scripts/daily_backup.sh
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
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
sudo chmod +x /scheduling/scripts/daily_backup.sh
echo "0 2 * * * /scheduling/scripts/daily_backup.sh" | sudo crontab -
2. System Monitoring Setiap 5 Menit
sudo nano /scheduling/scripts/system_monitor.sh
LOG_FILE="/scheduling/logs/system_monitor.log"
THRESHOLD_CPU=80
THRESHOLD_MEM=85
THRESHOLD_DISK=90
echo "$(date): Starting system check..." >> $LOG_FILE
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
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_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
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
LOG_DIR="/var/log"
BACKUP_DIR="/scheduling/backups/logs"
RETENTION_DAYS=30
mkdir -p $BACKUP_DIR
find $LOG_DIR -name "*.log" -mtime +7 -exec gzip {} \;
find $LOG_DIR -name "*.gz" -mtime +$RETENTION_DAYS -delete
find /tmp -type f -mtime +7 -delete
find /var/tmp -type f -mtime +30 -delete
echo "Log cleanup completed: $(date)" >> /scheduling/logs/cleanup.log
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
Description=Daily System Maintenance
After=network.target
Type=oneshot
ExecStart=/scheduling/scripts/daily_maintenance.sh
User=root
WantedBy=multi-user.target
2. Buat Timer File
sudo nano /etc/systemd/system/daily-maintenance.timer
Description=Run Daily Maintenance at 3 AM
Requires=daily-maintenance.service
OnCalendar=*-*-* 03:00:00
Persistent=true
RandomizedDelaySec=300
WantedBy=timers.target
3. Aktifkan dan Manage Timer
sudo systemctl daemon-reload
sudo systemctl enable daily-maintenance.timer
sudo systemctl start daily-maintenance.timer
sudo systemctl list-timers
sudo systemctl status daily-maintenance.timer
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
echo "/scheduling/scripts/special_task.sh" | at now +10 minutes
echo "tar -czf /backup/special.tar.gz /important/data" | at 9:00 tomorrow
echo "shutdown -r" | at 23:59 2024-12-31
echo "systemctl restart apache2" | at 2:00 PM next week
2. Kelola Queue at
atq
atrm 1
at -c 1
3. Batch Processing
echo "/scheduling/scripts/cpu_intensive_task.sh" | batch
echo "updatedb" | at midnight batch
Advanced Cron Techniques
1. Environment Variables dalam Cron
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=admin@localhost
HOME=/home/scheduler
0 4 * * * /scheduling/scripts/daily_task.sh
2. Locking Mechanism untuk Prevent Overlap
sudo nano /scheduling/scripts/with_lock.sh
LOCK_FILE="/tmp/my_script.lock"
if [ -f "$LOCK_FILE" ]; then
echo "Script is already running. Exiting."
exit 1
fi
touch "$LOCK_FILE"
echo "Running main task..."
sleep 30
rm "$LOCK_FILE"
3. Error Handling dan Notification
sudo nano /scheduling/scripts/with_error_handling.sh
LOG_FILE="/scheduling/logs/script.log"
ERROR_FILE="/tmp/script_error.$$"
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
}
trap 'error_handler $LINENO' ERR
some_command_that_might_fail
another_risky_command
Monitoring dan Troubleshooting
1. Monitor Cron Execution
sudo tail -f /var/log/syslog | grep CRON
sudo grep CRON /var/log/syslog | grep scheduler
sudo journalctl -u daily-maintenance.service
sudo journalctl --since "1 hour ago" | grep -i cron
2. Debug Cron Jobs
* * * * * /scheduling/scripts/test.sh > /tmp/cron_debug.log 2>&1
MAILTO="admin@localhost"
* * * * * /scheduling/scripts/test.sh
env -i SHELL=/bin/bash PATH=/usr/bin:/bin /scheduling/scripts/test.sh
3. Check Cron Syntax
crontab -l | crontab -
# https://crontab.guru/
sudo cron -f -x schron
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
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
sudo nano /etc/cron.allow
sudo nano /etc/cron.deny
sudo nano /etc/at.allow
sudo nano /etc/at.deny
2. Secure Cron Environment
/usr/bin/tar instead of tar
Sanitize all inputs in scripts
sudo chmod 700 /scheduling/scripts/
sudo chown root:root /scheduling/scripts/*
sudo crontab -l | audit for suspicious entries
Tugas dan Evaluasi
- Apa perbedaan antara cron, systemd timer, dan anacron? Kapan masing-masing paling tepat digunakan?
- Bagaimana cara mencegah cron job overlap ketika eksekusi sebelumnya belum selesai?
- Apa keuntungan menggunakan systemd timer dibandingkan cron tradisional?
- Bagaimana cara troubleshooting ketika cron job tidak dieksekusi sesuai jadwal?
- Buat skenario: Perusahaan membutuhkan backup database setiap jam, cleanup log harian, dan report mingguan. Tulis implementasi lengkapnya!
Case Study: E-commerce Scheduling System
echo "Setting up e-commerce scheduling system..."
cat > /scheduling/scripts/db_backup.sh << 'EOF'
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
cat > /scheduling/scripts/inventory_sync.sh << 'EOF'
python3 /opt/ecommerce/inventory_sync.py
EOF
cat > /scheduling/scripts/sales_report.sh << 'EOF'
python3 /opt/ecommerce/generate_report.py --daily
EOF
(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!"