Run Linux Command in Background (run-linux-cmd-in-bg.mdx)

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

  1. 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.
  1. 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.
  1. 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

  1. Menjalankan server Node.js di background dengan logging:
cd /srv/myapp
nohup /usr/bin/node server.js > /var/log/myapp.log 2>&1 &
  1. Menggunakan tmux untuk development server:
tmux new -s dev -d 'npm start'
tmux attach -t dev
  1. 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

Real-time

⏳ Memuat komentar...

Tulis Komentar

Email tidak akan ditampilkan

0/2000 karakter

⚠️ Catatan: Komentar akan dimoderasi sebelum ditampilkan. Mohon bersikap sopan dan konstruktif.