Run Linux Command in Background (run-linux-cmd-in-bg.mdx)
Artikel ini menjelaskan cara menjalankan perintah Linux di background (di luar terminal) dengan berbagai metode praktis: dari & sederhana sampai systemd-run dan tmux. Cocok untuk developer dan engineer yang butuh long-running processes.
Mengapa menjalankan perintah di background?
Sering kali kita perlu menjalankan proses yang berlangsung lama—backup, server development, sync, atau skrip batch—tanpa memblokir terminal. Ada beberapa cara untuk mengeksekusi pekerjaan di background dengan sifat yang berbeda: kemampuan survive logout, kontrol job, logging, dan integrasi ke systemd.
Di bawah ini kita bahas teknik-teknik utama, contoh nyata, dan best practices.
Dasar: & dan job control (bash/zsh)
Cara paling sederhana:
Contoh: ps
sleep 300 &
# output: [1] 12345 <-- job id dan PID
echo $! # menampilkan PID proses terakhir yang di-background-kan
# 12345
jobs # lihat job yang berjalan di session shell
bg %1 # jalankan job nomor 1 di background (jika sebelumnya dihentikan dengan Ctrl+Z)
fg %1 # bawa job ke foreground
Catatan:
- Proses ini akan menerima SIGHUP saat logout, kecuali kita men-disown atau gunakan nohup/setsid.
- Pastikan redirect output agar tidak menulis ke terminal.
Redirect output:
long-running-command > /var/log/myjob.log 2>&1 &
nohup vs disown vs setsid: membuat proses survive logout
- nohup
nohup my_command > my_command.log 2>&1 &
- nohup menangkap SIGHUP sehingga proses biasanya tidak mati saat logout.
- hasil standar ditulis ke nohup.out jika tidak diarahkan.
- disown (bash built-in)
my_command > my_command.log 2>&1 &
disown %1
- disown melepaskan job dari shell job table; shell tidak mengirim SIGHUP lagi.
- cocok jika proses sudah dijalankan di shell interaktif.
- setsid (memulai session baru)
setsid my_command > my_command.log 2>&1 < /dev/null &
- setsid menjalankan command di session baru, memisahkan dari controlling terminal.
Perbedaan praktis:
- nohup menangani SIGHUP; disown mengubah hubungan job dengan shell; setsid memutuskan controlling terminal.
- Semua pendekatan perlu memastikan I/O tidak bergantung ke terminal (redirect stdin/out/err).
Gunakan tmux atau screen untuk proses interaktif
Jika proses butuh interaksi (atau ingin attach/detach):
tmux new -s mysession -d 'python3 -m http.server 8000'
# atau
tmux new -s mysession
# di dalam tmux: jalankan perintah, lalu Ctrl-b d untuk detach
tmux attach -t mysession
Screen:
screen -S mysession -dm bash -c 'your_command arg1 arg2'
screen -r mysession
Kelebihan:
- Maintain TTY, bisa reconnect dari SSH lain.
- Sangat cocok untuk debugging dan interactive shells.
systemd-run: transient units (modern & robust)
Untuk systemd-based systems (most modern distros), systemd-run membuat transient unit dan mengelola lifecycle-nya seperti service:
Contoh menjalankan HTTP server sebagai transient unit:
systemd-run --unit=myhttp --description="Temp HTTP" --scope \
/usr/bin/python3 -m http.server 8000
Perintah lain:
systemd-run --user --unit=myjob --slice=background.slice /path/to/script
# lihat logs:
journalctl -u myjob -f
# status:
systemctl --user status myjob
Kelebihan:
- Logging, restart policy, resource control (cgroup).
- Proses akan tetap hidup sesuai kebijakan systemd bahkan setelah logout.
- Cocok untuk proses yang butuh integrasi dengan systemctl/journalctl.
start-stop-daemon / daemonize (Debian & classic daemons)
Debian/Ubuntu menyediakan start-stop-daemon:
start-stop-daemon --start --background --exec /usr/bin/mydaemon --make-pidfile --pidfile /var/run/mydaemon.pid --chuid myuser --startas /usr/bin/mydaemon -- \
--arg1 --arg2
Daemonize (tool) contoh:
daemonize -c /var/log/myapp -p /var/run/myapp.pid /usr/bin/myapp --option
Biasanya digunakan saat menulis init scripts atau admin-level daemons.
at dan cron untuk satu-kali dan periodik
- at: jadwalkan satu kali di masa depan:
echo "long-job > /tmp/log 2>&1" | at now + 1 minute
- cron: periodik (crontab -e).
Monitoring dan kontrol proses
Cari PID / proses:
ps aux | grep my_command
pgrep -fl my_command
Melihat file descriptor / ports:
lsof -p 12345
ss -tulpn | grep 8000
Monitoring log:
tail -n 200 -f /var/log/myjob.log
journalctl -u myjob -f
Menghentikan proses:
kill 12345 # SIGTERM
kill -15 12345
kill -9 12345 # SIGKILL jika tidak merespon (hindari bila mungkin)
pkill -f my_command
Practical examples
- Menjalankan server Node.js di background dengan logging:
cd /srv/myapp
nohup /usr/bin/node server.js > /var/log/myapp.log 2>&1 &
- Menggunakan tmux untuk development server:
tmux new -s dev -d 'npm start'
tmux attach -t dev
- Menggunakan systemd-run untuk transient job:
systemd-run --unit=backup --description="Nightly backup" /usr/local/bin/backup.sh
journalctl -u backup -f
Tips penting
- Selalu redirect stdout/stderr (2>&1) atau gunakan logger.
- Gunakan absolute paths di cron/sysv/systemd untuk menghindari PATH issues.
- Untuk proses sensitif, pertimbangkan systemd unit file agar restart / permissions lebih manageable.
- Hindari sudo tanpa pengaturan ketika menjalankan background job; gunakan user service jika memungkinkan.
Troubleshooting Umum
- Proses mati saat logout:
- Solusi: nohup, disown, setsid, atau systemd-run / tmux.
- Proses berjalan tapi tanpa output/log:
- Pastikan redirect sudah benar: mycmd > /path/out.log 2>&1
- Periksa permissions pada file log.
- Program butuh TTY (contoh: sudo asking password, interactive installer):
- Gunakan tmux/screen atau script with pseudo-tty (expect).
- PATH berbeda ketika dijalankan via cron/systemd:
- Gunakan absolute path atau set PATH di crontab/systemd unit.
- Proses tidak merespon SIGTERM:
- Coba SIGKILL (kill -9), tapi periksa konsistensi data setelah paksa kill.
- systemd-run job tidak muncul di journal:
- Pastikan opsi —user jika dijalankan sebagai user unit; gunakan journalctl —user -u nama_unit.
- PID file tidak dibuat:
- Gunakan start-stop-daemon atau buat skrip yang menulis PID sendiri. Periksa permission direktori pidfile.
- Port already in use:
- Cek dengan ss -tulpn atau lsof -i :PORT, matikan proses yang mengikat port tersebut.
Ringkasan
Menjalankan command di background di Linux bisa dilakukan dengan berbagai metode, dari yang sederhana (& + redirect) sampai yang robust (systemd, tmux). Pilih teknik sesuai kebutuhan: apakah butuh survive logout, interaksi TTY, logging yang bagus, atau integrasi dengan service manager. Untuk production-grade processes, prefer systemd unit; untuk development/interactive use, tmux/screen sangat nyaman. Selalu perhatikan redirect output, path absolute, dan permission agar proses berjalan stabil.
Semoga panduan ini membantu mengelola background processes Anda dengan lebih efektif.
💬 Komentar
⏳ Memuat komentar...
Tulis Komentar