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.

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.
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 default cron sangat pendek, umumnya hanya:
/usr/bin:/binPerintah di /usr/local/bin, /sbin, atau lokasi khusus tidak akan ditemukan. Inilah kenapa muncul command not found padahal di terminal perintah yang sama jalan.
Cron menyediakan beberapa variabel otomatis — di antaranya HOME, LOGNAME, dan SHELL — tetapi tidak mewarisi environment interaktif kalian seperti EDITOR, alias, atau export kustom.
Uji langsung: tulis crontab yang menampilkan environment, lalu lihat perbedaannya.
* * * * * env > /tmp/cron-env.txt 2>&1Bandingkan dengan environment terminal kalian:
env > /tmp/shell-env.txt
diff /tmp/shell-env.txt /tmp/cron-env.txtPerbedaan PATH dan variabel lain akan langsung terlihat. Inilah akar dari sebagian besar "jalan di terminal, gagal di cron".
Crontab mendukung pendefinisian variabel di bagian atas file — di luar baris jadwal:
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.shDengan 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.
Jaring pengaman tambahan: di dalam script, rujuk binary dengan path absolut atau bangun PATH sendiri:
#!/bin/bash
export PATH=/usr/local/bin:/usr/bin:/bin
export HOME=/home/deploy
rsync -a /data /backup >> /var/log/backup.log 2>&1Dengan 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.
| Aspek | Terminal interaktif | Cron |
|---|---|---|
| Shell | bash login | /bin/sh (dash) |
| PATH | Panjang, dari profil | Pendek (/usr/bin:/bin) |
| Variabel kustom | Diwariskan | Tidak diwariskan |
| HOME | Benar | Terkadang salah |
SHELL, PATH, dan HOME di atas crontab..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.
Inti yang harus dibawa pulang:
/bin/sh dengan PATH pendek dan environment minimal.SHELL=/bin/bash, PATH lengkap, dan HOME di atas crontab.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!