Linux Cron Job: Menjalankan Script Secara Otomatis di Ubuntu Server
Server sering kali membutuhkan tugas yang dijalankan secara otomatis dan berulang, seperti backup database, membersihkan file sementara, menjalankan script maintenance, memproses data, atau melakukan sinkronisasi tertentu.
Di Ubuntu Server, salah satu cara paling sederhana untuk menjalankan tugas tersebut secara otomatis adalah menggunakan Linux Cron Job.
Cron memungkinkan administrator menentukan kapan sebuah command atau script harus dijalankan. Jadwal tersebut dapat dibuat setiap menit, setiap jam, setiap hari, pada hari tertentu, atau menggunakan pola jadwal yang lebih spesifik.
Konfigurasi Cron biasanya dilakukan melalui crontab. Setelah sebuah cron job dibuat, sistem akan menjalankan command sesuai jadwal tanpa perlu menjalankannya secara manual.
Artikel ini membahas cara kerja Cron Job di Ubuntu Server, cara membuat crontab, memahami format waktu Cron, menjalankan Bash atau PHP script, menggunakan absolute path, menyimpan output ke log, mengatasi masalah permission, dan melakukan troubleshooting ketika Cron tidak berjalan.
Apa Itu Linux Cron Job?
Cron adalah mekanisme penjadwalan tugas pada sistem operasi Unix-like, termasuk Linux. Cron digunakan untuk menjalankan command atau script secara otomatis berdasarkan jadwal tertentu.
Sebuah Cron Job pada dasarnya terdiri dari dua bagian:
- Schedule — menentukan kapan tugas dijalankan.
- Command — menentukan apa yang harus dijalankan.
Contoh sederhana:
0 2 * * * /home/ubuntu/scripts/backup.sh
Artinya, script backup.sh dijalankan setiap hari pada pukul 02:00.
Dengan Cron, administrator tidak perlu menjalankan script backup tersebut secara manual setiap malam.
Bagaimana Cron Bekerja?
Secara sederhana, alur Cron dapat digambarkan seperti berikut:
Cron Service
↓
Membaca crontab
↓
Memeriksa jadwal
↓
Waktu sesuai?
├── Tidak → Tunggu
│
└── Ya
↓
Jalankan command
↓
Simpan output/log
Di Ubuntu, service yang menjalankan scheduled task tersebut biasanya dikelola oleh cron.
Untuk memeriksa statusnya, gunakan:
systemctl status cron
Jika service berjalan, Cron siap memproses job yang terdaftar pada crontab.
Memeriksa Apakah Cron Aktif di Ubuntu
Gunakan command berikut:
systemctl status cron
Untuk memastikan service aktif setelah server melakukan reboot:
systemctl is-enabled cron
Jika perlu mengaktifkan service:
sudo systemctl enable --now cron
Command tersebut mengaktifkan Cron dan menjalankannya saat ini.
Apa Itu Crontab?
Crontab adalah file atau interface yang digunakan untuk menentukan jadwal Cron Job.
Untuk membuka crontab milik user saat ini, gunakan:
crontab -e
Jika ini adalah pertama kalinya menggunakan crontab, sistem dapat meminta Anda memilih text editor.
Untuk melihat daftar Cron Job yang sudah dibuat:
crontab -l
Jika belum ada job, hasilnya dapat menunjukkan bahwa crontab untuk user tersebut belum tersedia.
Membuat Cron Job Pertama
Misalnya kita ingin menjalankan sebuah script setiap hari pada pukul 01:00.
Buat script terlebih dahulu:
nano /home/ubuntu/scripts/backup.sh
Isi sederhana script tersebut:
#!/bin/bash
echo "Backup dijalankan pada $(date)"
Buat script dapat dieksekusi:
chmod +x /home/ubuntu/scripts/backup.sh
Kemudian buka crontab:
crontab -e
Tambahkan:
0 1 * * * /home/ubuntu/scripts/backup.sh
Setelah disimpan, Cron akan menjalankan script tersebut setiap hari pada pukul 01:00.
Memahami Format Cron
Format dasar Cron terdiri dari lima field waktu yang diikuti command:
* * * * * command
│ │ │ │ │
│ │ │ │ └── Hari dalam minggu
│ │ │ └──── Bulan
│ │ └────── Hari dalam bulan
│ └──────── Jam
└────────── Menit
Lima field tersebut adalah:
| Field | Nilai Umum | Keterangan |
|---|---|---|
| Menit | 0–59 | Menit dalam satu jam |
| Jam | 0–23 | Jam dalam format 24 jam |
| Hari | 1–31 | Hari dalam bulan |
| Bulan | 1–12 | Bulan dalam setahun |
| Hari dalam minggu | 0–7 | Hari dalam minggu |
Pada field hari dalam minggu, nilai 0 dan 7 umumnya mewakili Minggu.
Contoh Jadwal Cron yang Sering Digunakan
Menjalankan Setiap Menit
* * * * * /home/ubuntu/scripts/task.sh
Script dijalankan setiap menit.
Menjalankan Setiap Jam
0 * * * * /home/ubuntu/scripts/task.sh
Script dijalankan pada menit ke-0 setiap jam.
Contohnya:
01:00
02:00
03:00
04:00
...
Menjalankan Setiap Hari pada Pukul 02:00
0 2 * * * /home/ubuntu/scripts/task.sh
Menjalankan Setiap Hari pada Pukul 23:30
30 23 * * * /home/ubuntu/scripts/task.sh
Menjalankan Setiap Senin
0 8 * * 1 /home/ubuntu/scripts/task.sh
Script dijalankan setiap Senin pukul 08:00.
Menjalankan Setiap Awal Bulan
0 0 1 * * /home/ubuntu/scripts/task.sh
Script dijalankan pada tanggal 1 setiap bulan, tepat pada pukul 00:00.
Menjalankan Setiap 15 Menit
*/15 * * * * /home/ubuntu/scripts/task.sh
Script akan dijalankan pada menit:
00
15
30
45
Memahami Tanda Bintang pada Cron
Tanda * berarti semua nilai yang tersedia untuk field tersebut.
Contohnya:
* * * * * /home/ubuntu/scripts/task.sh
Semua field menggunakan *, sehingga command dijalankan setiap menit.
Sementara:
0 2 * * * /home/ubuntu/scripts/task.sh
berarti:
- menit = 0;
- jam = 2;
- hari = semua;
- bulan = semua;
- hari dalam minggu = semua.
Menggunakan Interval dengan Cron
Cron mendukung pola seperti */5 untuk menjalankan command pada interval tertentu.
Contoh setiap 5 menit:
*/5 * * * * /home/ubuntu/scripts/task.sh
Setiap 10 menit:
*/10 * * * * /home/ubuntu/scripts/task.sh
Setiap 30 menit:
*/30 * * * * /home/ubuntu/scripts/task.sh
Pola ini sangat berguna untuk task yang perlu dijalankan secara berkala.
Menjalankan Cron Job pada Waktu Tertentu
Misalnya script perlu dijalankan setiap hari pukul 03:15:
15 3 * * * /home/ubuntu/scripts/backup.sh
Untuk pukul 18:45:
45 18 * * * /home/ubuntu/scripts/report.sh
Gunakan format waktu 24 jam pada field jam.
Menjalankan Bash Script dengan Cron
Contoh script:
#!/bin/bash
DATE=$(date '+%Y-%m-%d %H:%M:%S')
echo "Task berjalan: $DATE"
Simpan sebagai:
/home/ubuntu/scripts/task.sh
Kemudian berikan permission executable:
chmod +x /home/ubuntu/scripts/task.sh
Cron dapat menjalankannya secara langsung:
*/10 * * * * /home/ubuntu/scripts/task.sh
Atau Bash dapat dipanggil secara eksplisit:
*/10 * * * * /bin/bash /home/ubuntu/scripts/task.sh
Pendekatan kedua dapat berguna ketika ingin memastikan interpreter yang digunakan sudah jelas.
Menjalankan PHP Script dengan Cron
Cron juga dapat digunakan untuk menjalankan script PHP.
Misalnya terdapat file:
/var/www/myapp/scripts/process.php
Gunakan binary PHP dengan absolute path:
0 * * * * /usr/bin/php /var/www/myapp/scripts/process.php
Untuk mengetahui lokasi PHP:
which php
Hasilnya dapat berupa:
/usr/bin/php
Penggunaan absolute path penting karena environment Cron tidak selalu sama dengan environment shell interaktif pengguna.
Menjalankan Laravel Scheduler dengan Cron
Jika aplikasi menggunakan Laravel Scheduler, pendekatan yang umum adalah membuat satu Cron Job untuk menjalankan scheduler Laravel secara berkala.
Pada server, Cron dapat menjalankan:
* * * * * cd /var/www/myapp && php artisan schedule:run >> /dev/null 2>&1
Dengan konfigurasi tersebut, Laravel mendapatkan kesempatan untuk menentukan task mana yang memang harus dijalankan pada waktu tersebut.
Contoh task pada aplikasi Laravel:
use Illuminate\Support\Facades\Schedule;
Schedule::call(function () {
// Task yang dijalankan oleh scheduler
})->daily();
Pendekatan ini membuat jadwal aplikasi dikelola di dalam kode Laravel, sementara Cron hanya bertugas memanggil scheduler secara berkala.
Mengapa Absolute Path Penting pada Cron?
Salah satu sumber masalah paling umum adalah Cron tidak menemukan command atau file yang sebenarnya tersedia ketika dijalankan secara manual.
Misalnya pada terminal Anda dapat menjalankan:
php artisan migrate
Namun command tersebut belum tentu berhasil jika langsung ditulis di Cron:
0 2 * * * php artisan migrate
Lebih aman menggunakan working directory dan absolute path:
0 2 * * * cd /var/www/myapp && /usr/bin/php artisan migrate
Namun, migration production sebaiknya tidak dijalankan secara otomatis tanpa mempertimbangkan deployment strategy, backup, locking, dan dampaknya terhadap aplikasi.
Menyimpan Output Cron ke File Log
Debugging Cron menjadi lebih mudah jika output command disimpan ke file.
Contoh:
*/5 * * * * /home/ubuntu/scripts/task.sh >> /home/ubuntu/logs/task.log 2>&1
Operator:
>>menambahkan output ke akhir file;2>&1menggabungkan standard error dengan standard output.
Dengan demikian, output normal dan error dapat dikumpulkan pada file yang sama.
Perbedaan > dan >>
Gunakan:
> /home/ubuntu/logs/task.log
untuk menimpa isi file pada setiap eksekusi.
Sedangkan:
>> /home/ubuntu/logs/task.log
digunakan untuk menambahkan output ke file yang sudah ada.
Untuk Cron yang berjalan berkali-kali, biasanya >> lebih berguna, tetapi file log juga perlu dikelola agar tidak tumbuh tanpa batas.
Menggunakan Cron untuk Backup Database
Salah satu penggunaan Cron yang umum adalah menjalankan backup database.
Contoh sederhana untuk MySQL:
mysqldump -u appuser -p'PASSWORD' appdb > /home/ubuntu/backups/appdb.sql
Namun, jangan menaruh password database secara langsung di crontab seperti contoh tersebut pada server production.
Untuk production, gunakan mekanisme secret atau credential management yang sesuai dan batasi permission terhadap file backup.
Setelah mekanisme autentikasi aman disiapkan, Cron dapat digunakan untuk menjalankan script backup:
0 2 * * * /home/ubuntu/scripts/backup.sh
Contoh script dapat menangani proses backup dan memberikan nama file berdasarkan tanggal:
#!/bin/bash
BACKUP_DIR="/home/ubuntu/backups"
DATE=$(date '+%Y-%m-%d_%H-%M-%S')
mysqldump appdb > "$BACKUP_DIR/appdb_$DATE.sql"
Untuk sistem production, backup sebaiknya juga mempertimbangkan retensi, enkripsi, penyimpanan di lokasi berbeda, pengujian restore, dan monitoring keberhasilan backup.
Permission pada Cron Job
Cron Job dijalankan sebagai user yang memiliki crontab tersebut.
Jika user menjalankan:
crontab -e
maka job tersebut berjalan dengan permission user tersebut.
Sedangkan:
sudo crontab -e
mengedit crontab milik user root.
Perbedaan ini sangat penting.
Jika script dapat dijalankan oleh user biasa tetapi Anda memasukkannya ke root crontab, environment dan permission yang digunakan berbeda.
Prinsip yang baik adalah gunakan user dengan permission minimum yang memang diperlukan oleh task.
Kesalahan Permission yang Sering Terjadi
Misalnya script berada di:
/home/ubuntu/scripts/backup.sh
Pastikan user yang menjalankan Cron memiliki permission untuk:
- membaca script;
- mengeksekusi script;
- mengakses direktori yang dibutuhkan;
- menulis output atau file backup.
Periksa permission dengan:
ls -l /home/ubuntu/scripts/backup.sh
Jika script perlu dieksekusi secara langsung, pastikan memiliki execute permission:
chmod +x /home/ubuntu/scripts/backup.sh
Environment Cron Berbeda dengan Terminal
Salah satu alasan Cron sering membingungkan adalah environment-nya tidak selalu sama dengan shell interaktif.
Ketika Anda menjalankan:
echo $PATH
di terminal, hasilnya mungkin berbeda dengan PATH yang tersedia ketika Cron menjalankan command.
Karena itu, command seperti:
php
python
node
npm
sebaiknya menggunakan absolute path ketika diperlukan.
Contoh:
/usr/bin/php
/usr/bin/python3
/usr/bin/node
Lokasi sebenarnya dapat diperiksa dengan:
which php
which python3
which node
Timezone pada Cron
Jadwal Cron bergantung pada timezone yang digunakan oleh sistem atau environment Cron.
Periksa timezone server dengan:
timedatectl
Informasi timezone dapat dilihat pada output command tersebut.
Ini penting ketika Anda membuat jadwal seperti:
0 2 * * * /home/ubuntu/scripts/backup.sh
Pastikan pukul 02:00 yang dimaksud sesuai dengan timezone server.
Hal ini menjadi sangat penting jika server berada di negara atau region yang berbeda dengan lokasi administrator.
Melihat Log Cron di Ubuntu
Jika Cron tidak berjalan seperti yang diharapkan, periksa log sistem.
Pada Ubuntu, salah satu cara yang umum adalah mencari event Cron pada system log:
grep CRON /var/log/syslog
Untuk melihat entry terbaru:
grep CRON /var/log/syslog | tail -n 50
Jika sistem menggunakan journald untuk service logging, Anda juga dapat memeriksa:
journalctl -u cron
Untuk melihat entry terbaru secara realtime:
journalctl -u cron -f
Ketersediaan dan detail log dapat bergantung pada konfigurasi logging sistem.
Cara Troubleshooting Cron Job yang Tidak Berjalan
Jika Cron tidak berjalan, jangan langsung membuat ulang job. Periksa masalah secara bertahap.
1. Pastikan Cron Service Aktif
systemctl status cron
2. Periksa Crontab
crontab -l
Pastikan job benar-benar tersimpan.
3. Periksa Syntax Cron
Pastikan jumlah field waktu benar:
* * * * * command
4. Gunakan Absolute Path
Jangan mengandalkan PATH dari shell interaktif.
5. Periksa Permission
Pastikan user Cron memiliki akses terhadap script dan file yang digunakan.
6. Jalankan Script Secara Manual
Jika command Cron adalah:
/home/ubuntu/scripts/task.sh
jalankan langsung:
/home/ubuntu/scripts/task.sh
Jika gagal secara manual, perbaiki script terlebih dahulu.
7. Simpan Output ke Log
* * * * * /home/ubuntu/scripts/task.sh >> /home/ubuntu/logs/task.log 2>&1
Dengan cara ini, error dari script dapat diperiksa dengan lebih mudah.
Cara Menguji Cron Job
Daripada menunggu satu hari untuk mengetahui apakah job berhasil, gunakan jadwal sementara yang berjalan setiap menit.
Misalnya:
* * * * * echo "Cron berjalan $(date)" >> /home/ubuntu/cron-test.log 2>&1
Tunggu sekitar satu menit, kemudian periksa:
tail /home/ubuntu/cron-test.log
Jika timestamp baru muncul, Cron berjalan.
Setelah pengujian selesai, jangan lupa menghapus Cron Job tersebut.
Menggunakan Komentar pada Crontab
Crontab dapat diberi komentar menggunakan tanda #.
Contohnya:
# Backup database setiap hari pukul 02:00
0 2 * * * /home/ubuntu/scripts/backup.sh
# Bersihkan temporary file setiap hari pukul 04:00
0 4 * * * /home/ubuntu/scripts/cleanup.sh
Komentar sangat membantu ketika crontab memiliki banyak job.
Menghindari Cron Job Berjalan Bersamaan
Jika sebuah task membutuhkan waktu lebih lama daripada interval jadwalnya, ada kemungkinan proses berikutnya dimulai ketika proses sebelumnya masih berjalan.
Misalnya task berjalan setiap 5 menit:
*/5 * * * * /home/ubuntu/scripts/process.sh
Jika script membutuhkan waktu 10 menit, proses dapat saling tumpang tindih tergantung mekanisme yang digunakan.
Untuk task yang tidak boleh berjalan bersamaan, pertimbangkan penggunaan locking atau mekanisme concurrency control yang sesuai.
Salah satu pendekatan sederhana di Linux adalah menggunakan flock:
*/5 * * * * flock -n /tmp/process.lock /home/ubuntu/scripts/process.sh
Dengan pola tersebut, proses baru tidak dijalankan ketika lock masih digunakan oleh proses sebelumnya.
Cron Job untuk Cleanup File
Cron sering digunakan untuk membersihkan file lama.
Contoh mencari file log yang lebih lama dari 7 hari:
find /home/ubuntu/logs -type f -mtime +7
Setelah memastikan file yang ditemukan memang aman untuk dihapus, command dapat digunakan dalam script cleanup.
Contoh:
#!/bin/bash
find /home/ubuntu/logs -type f -mtime +7 -delete
Kemudian jadwalkan:
0 3 * * * /home/ubuntu/scripts/cleanup.sh
Gunakan command find dengan hati-hati, terutama jika path yang digunakan berada pada direktori penting.
Cron vs Systemd Timer
Cron bukan satu-satunya mekanisme scheduling pada Linux modern.
Ubuntu juga menggunakan systemd untuk mengelola banyak service dan menyediakan systemd timer sebagai mekanisme penjadwalan.
Secara sederhana:
| Aspek | Cron | Systemd Timer |
|---|---|---|
| Konfigurasi | Sederhana | Lebih kompleks |
| Mudah dipelajari | Ya | Perlu memahami systemd |
| Cocok untuk script sederhana | Ya | Ya |
| Integrasi systemd | Terbatas | Sangat baik |
| Logging dan status service | Lebih sederhana | Terintegrasi dengan systemd |
Untuk script sederhana yang membutuhkan jadwal rutin, Cron sering kali sudah cukup. Untuk kebutuhan service yang lebih kompleks, systemd timer dapat dipertimbangkan.
Praktik Terbaik Menggunakan Linux Cron Job
Agar Cron Job lebih aman dan mudah dikelola, terapkan beberapa praktik berikut.
Gunakan Absolute Path
Gunakan path lengkap untuk script dan binary yang diperlukan.
0 2 * * * /usr/bin/php /var/www/myapp/scripts/task.php
Gunakan User dengan Permission Minimum
Jangan menggunakan root jika task tersebut tidak membutuhkan hak akses root.
Simpan Output dan Error
0 2 * * * /home/ubuntu/scripts/backup.sh >> /home/ubuntu/logs/backup.log 2>&1
Jangan Menyimpan Secret di Crontab
Hindari menyimpan password, API key, dan secret secara langsung pada command Cron.
Gunakan Lock untuk Task yang Tidak Boleh Overlap
*/10 * * * * flock -n /tmp/task.lock /home/ubuntu/scripts/task.sh
Uji Script Secara Manual
Pastikan script berhasil ketika dijalankan menggunakan user yang sama dengan Cron sebelum menjadwalkannya.
Monitor Task Penting
Backup, cleanup, sinkronisasi, dan task production lainnya sebaiknya memiliki mekanisme monitoring atau notifikasi jika kegagalan dapat berdampak pada operasional aplikasi.
Contoh Crontab untuk Server Sederhana
Berikut contoh crontab dengan beberapa task:
# Backup database setiap hari pukul 02:00
0 2 * * * /home/ubuntu/scripts/backup.sh >> /home/ubuntu/logs/backup.log 2>&1
# Cleanup setiap hari pukul 03:00
0 3 * * * /home/ubuntu/scripts/cleanup.sh >> /home/ubuntu/logs/cleanup.log 2>&1
# Menjalankan task aplikasi setiap 10 menit
*/10 * * * * /home/ubuntu/scripts/process.sh >> /home/ubuntu/logs/process.log 2>&1
Contoh tersebut menunjukkan pola yang cukup mudah dipelihara: setiap job memiliki jadwal, script, dan file log masing-masing.
Kesimpulan
Linux Cron Job merupakan cara sederhana dan efektif untuk menjalankan script secara otomatis di Ubuntu Server berdasarkan jadwal tertentu.
Konfigurasi Cron dilakukan menggunakan crontab. Untuk membuka crontab user saat ini, gunakan:
crontab -e
Sedangkan untuk melihat Cron Job yang sudah terdaftar:
crontab -l
Format dasar Cron adalah:
* * * * * command
Contoh menjalankan script setiap hari pukul 02:00:
0 2 * * * /home/ubuntu/scripts/backup.sh
Untuk Cron Job yang berjalan pada server production, jangan hanya memperhatikan jadwal. Perhatikan juga absolute path, permission, environment, timezone, logging, locking, keamanan credential, dan monitoring.
Jika Cron Job tidak berjalan, periksa secara sistematis mulai dari status service:
systemctl status cron
kemudian crontab:
crontab -l
dan log:
grep CRON /var/log/syslog | tail -n 50
Dengan memahami konsep tersebut, Cron dapat digunakan untuk berbagai kebutuhan automation di Ubuntu Server, mulai dari backup, cleanup, pemrosesan data, sinkronisasi, hingga menjalankan Laravel Scheduler secara otomatis.
