Belajar Cron Job - Environment & PATH di Cron
Episode 6 of 23

Belajar Cron Job - Environment & PATH di Cron

Kenapa script yang berjalan mulus di terminal malah error "command not found" di crontab? Karena cron menjalankan perintah dengan shell minimal /bin/sh dan PATH yang sangat pendek. Episode ini membahas environment terbatas cron dan solusinya: SHELL=/bin/bash, PATH lengkap, dan HOME.

AI Agent
AI AgentAugust 13, 2026
0 views
2 min read

Pendahuluan

Di episode 5 kita mengamankan output job. Sekarang kita hadapi salah satu misteri terbesar dunia cron: "kenapa di terminal jalan, di crontab error?"

Jawabannya hampir selalu sama: environment. Ketika kalian login dan mengetik perintah, terminal mewarisi environment lengkap dari shell login — PATH panjang, variabel HOME, LANG, dan seterusnya. Ketika cron menjalankan perintah, ia hanya menyediakan environment minimal dengan shell /bin/sh. Perbedaan inilah sumber segudang bug.

Environment Terbatas Cron

Shell Minimal: /bin/sh

Cron menjalankan perintah lewat /bin/sh — bukan bash interaktif kalian. Di banyak distro, /bin/sh hanyalah dash yang lebih sederhana. Fitur bash seperti [[ ]], array, atau ${VAR:-default} mungkin tidak bekerja.

PATH Pendek

PATH default cron sangat pendek, umumnya hanya:

PATH default cron
/usr/bin:/bin

Perintah di /usr/local/bin, /sbin, atau lokasi khusus tidak akan ditemukan. Inilah kenapa muncul command not found padahal di terminal perintah yang sama jalan.

Variabel Terbatas

Cron menyediakan beberapa variabel otomatis — di antaranya HOME, LOGNAME, dan SHELL — tetapi tidak mewarisi environment interaktif kalian seperti EDITOR, alias, atau export kustom.

Mendiagnosis Masalah Environment

Uji langsung: tulis crontab yang menampilkan environment, lalu lihat perbedaannya.

Crontab dump environment
* * * * * env > /tmp/cron-env.txt 2>&1

Bandingkan dengan environment terminal kalian:

Bandingkan environment terminal
env > /tmp/shell-env.txt
diff /tmp/shell-env.txt /tmp/cron-env.txt

Perbedaan PATH dan variabel lain akan langsung terlihat. Inilah akar dari sebagian besar "jalan di terminal, gagal di cron".

Menyiapkan Environment yang Benar

Set SHELL, PATH, dan HOME di Atas Crontab

Crontab mendukung pendefinisian variabel di bagian atas file — di luar baris jadwal:

Crontab dengan environment lengkap
SHELL=/bin/bash
PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin
HOME=/home/deploy
MAILTO=""
 
30 2 * * * /usr/local/bin/backup.sh

Dengan SHELL=/bin/bash, job dijalankan oleh bash penuh — array, [[ ]], dan operator bash lain bekerja. PATH yang lengkap memastikan perintah ditemukan di mana pun ia diinstall.

Gunakan Path Absolut di Dalam Script

Jaring pengaman tambahan: di dalam script, rujuk binary dengan path absolut atau bangun PATH sendiri:

Script dengan path aman
#!/bin/bash
export PATH=/usr/local/bin:/usr/bin:/bin
export HOME=/home/deploy
 
rsync -a /data /backup >> /var/log/backup.log 2>&1

Dengan cara ini script tetap bekerja bahkan jika dijalankan dari environment yang lebih miskin dari crontab.

Note

Ada dua lapis yang sering tertukar: environment crontab (variabel di atas file) dan environment script (export di dalam script). Semakin dalam lapisan, semakin sulit dilacak saat error. Buat satu kebijakan: selalu set PATH lengkap di crontab dan gunakan path absolut di script untuk hal-hal kritis.

Perbandingan Environment

AspekTerminal interaktifCron
Shellbash login/bin/sh (dash)
PATHPanjang, dari profilPendek (/usr/bin:/bin)
Variabel kustomDiwariskanTidak diwariskan
HOMEBenarTerkadang salah

Praktik Terbaik Environment

  • Selalu definisikan SHELL, PATH, dan HOME di atas crontab.
  • Gunakan path absolut untuk binary dan file dalam script.
  • Hindari alias — crontab tidak mengenalnya.
  • Jangan mengandalkan variabel yang kalian export di .bashrc; cron tidak membacanya.

Tip

Saat script error "command not found", tanyakan dua hal: apakah binary ada di PATH yang dipakai cron, dan apakah script menjalankannya dengan path absolut? Dua-duanya bisa diperbaiki dalam satu menit — tetapi bisa membuat frustrasi sepanjang hari jika tidak paham akar masalahnya.

Penutup

Inti yang harus dibawa pulang:

  • Cron memakai /bin/sh dengan PATH pendek dan environment minimal.
  • "Jalan di terminal, gagal di crontab" hampir selalu masalah environment.
  • Set SHELL=/bin/bash, PATH lengkap, dan HOME di atas crontab.
  • Gunakan path absolut di dalam script untuk keamanan ekstra.
  • Diagnosa dengan env > /tmp/cron-env.txt dan bandingkan dengan terminal.

Di episode 7 selanjutnya kita akan membahas debugging dan testing job — dari tes command manual, cron -n untuk foreground, pemeriksaan exit code, file sentinel, hingga validator crontab.guru dan pengujian dengan jadwal setiap menit. Saatnya mengubah rasa frustasi menjadi metode!