Perintah nohup Linux: menjalankan tugas setelah keluar

nohup adalah alat yang menjalankan perintah sambil mengabaikan sinyal SIGHUP, yang mungkin dikirim ketika koneksi terminal hilang. Untuk melanjutkan sebuah tugas setelah logout, biasanya digunakan nohup bersama dengan simbol eksekusi di latar belakang &, dan juga disarankan untuk secara eksplisit menentukan file input dan output standar.

Contoh berikut mengasumsikan skrip worker.sh ada dan dapat dijalankan. Sesuaikan jalur dan tinjau isi skrip serta log sebelum menjalankannya.

nohup ./worker.sh > worker.log 2>&1 < /dev/null &

Namun, nohup bukanlah pengelola layanan yang memantau atau me-restart proses. Untuk layanan jangka panjang yang memerlukan start otomatis setelah reboot, restart saat gagal, atau rotasi log, alat manajemen layanan seperti systemd lebih cocok.

Apa yang dilakukan perintah nohup?

nohup menjalankan perintah yang ditentukan setelah mengatur agar mengabaikan sinyal hangup, SIGHUP. Saat menutup terminal atau mengakhiri koneksi SSH, SIGHUP mungkin dikirim ke shell dan proses terkait, dan mengabaikannya meningkatkan kemungkinan bahwa tugas akan terus berjalan.

Seperti yang dapat dilihat dalam manual GNU nohup, nohup itu sendiri tidak mengirim perintah ke latar belakang. Untuk melanjutkan pekerjaan lain di terminal saat ini, Anda perlu menambahkan & di akhir perintah secara terpisah.

Komponen Apa yang dilakukan Apa yang tidak dilakukan
nohup Membuat perintah yang akan dijalankan mengabaikan SIGHUP. Tidak secara otomatis berjalan di latar belakang.
& Membuat shell mengeksekusi perintah sebagai pekerjaan latar belakang. Tidak menjamin mengabaikan SIGHUP.
Pengalihan Keluaran Mengirim keluaran standar dan kesalahan ke file log yang ditentukan. Tidak memberlakukan batas ukuran log atau penghapusan otomatis.

Sintaks Dasar dan Bentuk Eksekusi yang Disarankan

Sintaks Dasar

Setelah nohup, tulis perintah dan argumen yang akan dijalankan secara berurutan.

nohup command [arg ...]

Contoh berikut mengasumsikan backup.sh tersedia, telah ditinjau, dan dapat dijalankan pada direktori saat ini.

nohup ./backup.sh

Bentuk ini mengabaikan SIGHUP tetapi dijalankan di latar depan. Oleh karena itu, sulit untuk memasukkan perintah berikutnya di shell yang sama hingga perintah selesai.

Eksekusi Latar Belakang dan Penyimpanan Log

Dalam pekerjaan nyata, lebih mudah untuk mengelola jika Anda menentukan eksekusi latar belakang dan jalur log secara bersamaan.

nohup ./backup.sh > backup.log 2>&1 < /dev/null &
  • > backup.log menulis output standar ke file log baru. Jika file yang sama ada, ia akan menimpa konten yang ada.
  • 2>&1 mengirim kesalahan standar ke tempat yang sama seperti output standar saat ini.
  • < /dev/null menggantikan input standar dengan /dev/null, yang menghasilkan EOF saat dibaca sehingga program tidak menunggu input terminal.
  • & terakhir mengeksekusi perintah di latar belakang.

Untuk menambahkan konten baru ke log yang sudah ada, gunakan >> bukan >.

nohup ./backup.sh >> backup.log 2>&1 < /dev/null &

Simpan PID segera setelah eksekusi

Segera setelah menjalankan perintah latar belakang, $! berisi ID proses (PID) dari pekerjaan latar belakang yang paling baru dijalankan. Sangat praktis untuk mencatat nilai ini di tempat yang aman untuk pemeriksaan status atau penghentian proses nantinya.

nohup ./backup.sh > backup.log 2>&1 < /dev/null &
job_pid=$!
printf '%s\n' "$job_pid" > backup.pid

Tempatkan file PID di direktori yang hanya dapat ditulis oleh pengguna yang mengelola pekerjaan tersebut. Jika file PID lama tetap ada, nomor yang sama mungkin digunakan oleh proses lain nanti, jadi aman untuk memeriksa perintah dan waktu mulai bersama dengan penghentian.

Bagaimana standar input dan output ditangani?

Input Standar

Dalam implementasi GNU, jika input standar terhubung ke terminal, nohup menggantinya dengan sumber input yang tidak dapat dibaca. Perilaku ini mengurangi situasi di mana program berhenti menunggu input setelah terminal menghilang. Untuk mengurangi perbedaan implementasi dan memperjelas maksud, Anda dapat secara eksplisit menulis < /dev/null dalam perintah.

Output standar dan nohup.out

Jika output standar diarahkan ke terminal dan tidak ada pengalihan terpisah yang ditentukan, GNU nohup menambahkan output ke nohup.out di direktori saat ini. Jika sebuah file tidak dapat dibuat di direktori saat ini, ia mencoba nohup.out di direktori home pengguna, dan jika kedua lokasi tidak dapat ditulis, perintah tidak akan dijalankan.

Jika beberapa tugas menggunakan nohup.out yang sama, bisa sulit untuk membedakan log milik tugas mana, dan file tersebut mungkin terus bertambah. Lebih baik menentukan file log dengan nama dan kebijakan retensi untuk setiap tugas.

Kesalahan Standar

Jika kesalahan standar diarahkan ke terminal, GNU nohup umumnya mengirimkannya ke tujuan yang sama dengan output standar. Namun, tergantung pada shell, sistem operasi, atau pengalihan yang sebelumnya diterapkan, pembaca mungkin salah memahami hasilnya, jadi lebih aman untuk secara eksplisit menunjukkan maksud Anda menggunakan 2>&1. Urutan koneksi input/output di shell mempengaruhi hasil, dan prinsip-prinsip rinci dapat ditemukan dalam manual Bash tentang pengalihan.

Memeriksa Status dan Log Eksekusi

Memeriksa Proses dengan PID yang Disimpan

Jika Anda memiliki PID yang disimpan tepat setelah eksekusi, Anda bisa langsung memberikannya ke ps untuk memeriksa statusnya.

job_pid=$(cat backup.pid)
ps -p "$job_pid" -o pid,ppid,stat,etime,cmd

PID adalah ID proses, PPID adalah ID proses induk, STAT adalah status, dan ELAPSED adalah waktu eksekusi. Jangan menganggapnya sebagai tugas yang diinginkan hanya karena PID ada; juga periksa kolom perintah di akhir.

Menemukan proses berdasarkan nama

Jika PID tidak disimpan, Anda bisa mencari baris perintah dengan pgrep.

pgrep -af 'backup.sh'

Karena proses lain yang mengandung string yang sama mungkin juga ditemukan, Anda harus memeriksa seluruh baris perintah dari hasil tersebut. Sederhana mengalirkan keluaran ps ke grep sering menunjukkan perintah pencarian itu sendiri dan karena itu tidak cocok untuk otomasi.

Memeriksa log secara real time

Menggunakan tail -f memungkinkan Anda untuk terus melihat tambahan di akhir sebuah file.

tail -f backup.log

Untuk menghentikan pemantauan log, tekan Ctrl+C. Ini hanya menghentikan tail dan tidak menghentikan tugas asli yang menulis log. Anda dapat melihat lebih banyak detail tentang menentukan jumlah baris dan melacak file di cara menggunakan perintah tail.

Menghentikan proses yang dimulai dengan nohup

Pertama, minta terminasi normal

Setelah memeriksa PID dan perintah target, menjalankan kill pada dasarnya mengirim sinyal SIGTERM. Jika program memiliki kode penanganan terminasi, ia mendapatkan kesempatan untuk menutup file dan membersihkan statusnya.

job_pid=$(cat backup.pid)
ps -p "$job_pid" -o pid,ppid,stat,etime,cmd
kill "$job_pid"

Memeriksa apakah telah berhenti

Tunggu sebentar lalu periksa PID yang sama lagi.

ps -p "$job_pid" -o pid,stat,etime,cmd

Jika sebuah skrip shell telah membuat beberapa proses anak, menghentikan hanya satu induk mungkin meninggalkan anak-anak yang masih berjalan. Periksa pohon proses dan grup proses terlebih dahulu, dan jika program yang Anda gunakan menyediakan perintah terminasi resmi, prioritaskan penggunaannya.

Gunakan terminasi paksa sebagai upaya terakhir

Jika Anda segera memaksa penghentian hanya karena tidak merespons SIGTERM, data mungkin tidak disimpan, atau file sementara mungkin tidak dibersihkan. Pastikan proses masih sama dengan memeriksa PID dan waktu mulai lagi tepat sebelum tindakan; PID dapat digunakan ulang. Gunakan SIGKILL hanya sebagai upaya terakhir.

kill -KILL "$job_pid"

Menjalankan pipeline dan perintah gabungan

Mengelompokkan menjadi satu perintah shell

Anda dapat mengirim string perintah ke shell untuk mengeksekusi pipeline, beberapa pengalihan, dan operator kondisional sebagai satu tugas.

nohup sh -c 'producer | consumer' > pipeline.log 2>&1 < /dev/null &

Saat ini, pipeline di dalam tanda kutip diinterpretasikan oleh shell baru. Jika Anda menggabungkan input eksternal ke dalam string perintah tanpa validasi, ada risiko injeksi perintah, jadi jangan masukkan nilai yang tidak tepercaya secara langsung. Anda juga dapat merujuk ke panduan operator perintah Bash (bahasa Inggris) untuk hubungan eksekusi operator shell.

Ketika log tidak segera terlihat

Jika proses sedang berjalan tetapi log muncul terlambat, penyebabnya bisa jadi buffering output program dan bukan nohup. Pertama, periksa pengaturan flush log dari program itu sendiri. Dalam lingkungan berbasis GNU, jika program dan metode output kompatibel, Anda dapat meminta buffering baris dengan stdbuf.

nohup stdbuf -oL -eL ./worker > worker.log 2>&1 < /dev/null &

stdbuf tidak berfungsi untuk semua program. Jika program mereset buffer-nya sendiri atau menggunakan metode input/output tertentu, mungkin tidak berlaku.

Batasan nohup dan kriteria untuk memilih alat lain

Fitur yang tidak disediakan oleh nohup

nohup adalah alat eksekusi sederhana yang mengubah penanganan satu sinyal. Fitur berikut tidak disediakan.

  • Memulai otomatis setelah sistem reboot
  • Memulai ulang otomatis ketika proses berhenti secara tidak normal
  • Mengelola urutan startup layanan yang bergantung
  • Pembatasan sumber daya dan pemantauan status seperti CPU dan memori
  • Pembatasan ukuran file log, kompresi, retensi, dan penghapusan
  • Pelestarian sesi terminal interaktif

Perbedaan dengan systemd, tmux, screen

Alat Situasi yang sesuai Fitur
nohup Menjalankan tugas batch non-interaktif sementara Sederhana, tetapi tidak memiliki fungsi pemantauan, restart, atau rotasi log.
systemd Layanan yang berjalan terus menerus di server Anda dapat mengonfigurasi integrasi boot, kebijakan restart, dependensi, dan mengelola log serta sumber daya.
tmux/screen Tugas interaktif yang perlu dihubungkan kembali nanti Anda dapat melepaskan dan menghubungkan kembali sesi terminal virtual.
Penjadwal tugas Tugas yang dieksekusi pada waktu atau interval tetap Kelola waktu eksekusi dan riwayat menggunakan cron atau antrean pekerjaan khusus.

Perbedaan dari disown

disown adalah fitur bawaan shell di beberapa shell seperti Bash yang menghapus sebuah pekerjaan yang sudah dimulai dari daftar pekerjaan shell atau mengubah metode penanganan sinyal hangup-nya. Sebaliknya, nohup adalah program eksternal yang membuat sebuah perintah mengabaikan SIGHUP sejak saat perintah itu mulai. Karena opsi dan perilaku disown bervariasi tergantung pada shell, Anda harus memeriksa dokumentasi shell saat ini untuk skrip yang portabel.

Daftar periksa untuk eksekusi yang aman

  • Path: Tentukan skrip, file konfigurasi, dan file log dengan jalur absolut kapan pun memungkinkan. Ini memastikan file yang sama digunakan meskipun lokasi login berubah.
  • Izin: Periksa apakah kata sandi, token, atau informasi pribadi bisa tetap berada dalam log, dan batasi izin file.
  • Ukuran: Konfigurasikan logrotate atau kebijakan penyimpanan log program itu sendiri untuk mencegah log terus bertambah.
  • Eksekusi duplikat: Periksa apakah aman bagi tugas yang sama untuk dijalankan beberapa kali secara bersamaan. Jika perlu, gunakan file kunci atau fitur eksekusi tunggal program.
  • Lingkungan: Dalam eksekusi non-interaktif, direktori kerja, PATH, locale, dan variabel lingkungan mungkin berbeda dari shell login, jadi tentukan nilai yang diperlukan.
  • Argumen sensitif: Jika Anda melewatkan kata sandi atau token sebagai argumen baris perintah, pengguna lain dapat melihatnya di daftar proses. Gunakan file kredensial atau metode penyimpanan rahasia yang didukung oleh program.
  • Prosedur penghentian: Catat PID segera setelah eksekusi dan siapkan baik metode penghentian normal maupun langkah-langkah untuk memeriksa proses anak yang tersisa.

Pertanyaan yang Sering Diajukan

Apakah pekerjaan nohup pasti akan tetap berjalan jika saya menutup jendela SSH?

Perintah yang dimulai dengan nohup mengabaikan SIGHUP, tetapi ini tidak menjamin sepenuhnya keberlanjutan pekerjaan di semua lingkungan. Jika sebuah program membuat proses anak terpisah sambil mengubah pengaturan sinyal atau terus menggunakan perangkat terminal, hasilnya mungkin berbeda. Kebijakan pembersihan sesi atau cgroup juga dapat menghentikan proses. Lepaskan input dan output standar dari terminal, dan untuk tugas penting yang berjalan lama, gunakan manajer layanan yang sesuai.

Bagaimana saya bisa mencegah pembuatan file nohup.out?

Anda dapat langsung menentukan output standar dan kesalahan standar. Hanya tugas yang sama sekali tidak memerlukan pencatatan yang dapat dikirim ke /dev/null, tetapi karena informasi diagnostik juga akan hilang, biasanya disarankan untuk menggunakan file log terpisah untuk tugas operasional.

nohup ./worker > /dev/null 2>&1 < /dev/null &

Mengapa pekerjaan tidak muncul dalam jobs?

jobs hanya menampilkan tugas yang dikelola oleh shell saat ini. Jika Anda keluar dan masuk dengan shell baru, daftar pekerjaan pada shell sebelumnya tidak terbawa, sehingga tidak akan muncul di jobs. Gunakan PID yang tersimpan dan ps, atau gunakan fungsi pemeriksaan status dari alat manajemen layanan.

Apa arti kode keluar dari nohup?

Dalam implementasi GNU, kode keluar yang terpisah digunakan untuk kesalahan di nohup itu sendiri, kasus di mana perintah tidak dapat ditemukan, atau kasus di mana perintah tidak dapat dieksekusi. Jika perintah berhasil dimulai, itu akan mengembalikan status keluar dari perintah tersebut. Nilai pastinya dapat dipengaruhi oleh implementasi dan pengaturan POSIXLY_CORRECT, jadi untuk otomasi, periksa nohup --help dan dokumentasi resmi dari sistem. Perlu dicatat juga bahwa setelah memulai di latar belakang dan keluar dari shell, Anda tidak dapat begitu saja membaca $? di shell tersebut untuk mendapatkan hasil akhir tugas.

Ringkasan

nohup mengeksekusi sebuah perintah sehingga mengabaikan SIGHUP, yang dapat terjadi saat keluar atau menutup terminal. Tugas non-interaktif biasanya menggunakan nohup bersama dengan & dan pengalihan input/output standar secara eksplisit, serta menyimpan PID segera setelah eksekusi membuat pengelolaan menjadi lebih mudah.

Jika tugas perlu dimulai bahkan setelah reboot atau memerlukan pemulihan otomatis dalam kasus kegagalan, pilihlah manajer layanan seperti systemd daripada nohup. Untuk melihat alat dasar lainnya secara sekilas, Anda dapat merujuk ke daftar perintah Linux (bahasa Inggris).