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:

FieldNilai UmumKeterangan
Menit0–59Menit dalam satu jam
Jam0–23Jam dalam format 24 jam
Hari1–31Hari dalam bulan
Bulan1–12Bulan dalam setahun
Hari dalam minggu0–7Hari 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>&1 menggabungkan 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:

AspekCronSystemd Timer
KonfigurasiSederhanaLebih kompleks
Mudah dipelajariYaPerlu memahami systemd
Cocok untuk script sederhanaYaYa
Integrasi systemdTerbatasSangat baik
Logging dan status serviceLebih sederhanaTerintegrasi 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.