Terminasi Proses Yang Benar di Linux

Terminasi Proses Yang Benar di Linux

Banyak orang yang mematikan proses di Linux dengan menggunakan perintah `kill` dengan tidak benar. Padahal, ada cara yang lebih baik untuk melakukan terminasi proses di Linux.

John Doe
John Doe

Hari ini saya membuat sebuah survei di Twitter tentang bagaimana orang mematikan proses di Linux. Hasilnya cukup mengejutkan.

Hampir 40% dari responden menggunakan perintah kill untuk mematikan proses di Linux dengan menggunakan opsi -9. Perintah ini akan memberhentikan proses dengan mengirim sinyal SIGKILL ke proses tersebut. Sebelum saya memjelaskan lebih lanjut, mari kita tentang signal di Linux.

Signal di Linux

Signal adalah cara yang digunakan oleh sistem operasi untuk mengirim pesan ke proses. Signal ini bisa digunakan untuk berbagai hal, seperti memberhentikan proses, memberi tahu proses untuk memuat kembali konfigurasi, dan lain-lain.

Ada banyak jenis signal yang bisa dikirim ke proses. Menurut man 7 signal, berikut adalah sinyal yang sering digunakan dalam sistem operasi Linux maupun Unix lain seperti macOS dan FreeBSD:

  • SIGHUP (1): Sinyal ini dikirim ke proses ketika terminal yang digunakan untuk menjalankan proses ditutup.
  • SIGINT (2): Sinyal ini dikirim ke proses ketika pengguna menekan tombol Ctrl+C.
  • SIGQUIT (3): Sinyal ini dikirim ke proses ketika pengguna menekan tombol Ctrl+\.
  • SIGABRT (6): Sinyal ini dikirim ke proses ketika proses memanggil fungsi abort().
  • SIGKILL (9): Sinyal ini dikirim ke proses untuk memberhentikan proses secara paksa.
  • SIGTERM (15): Sinyal ini dikirim ke proses untuk memberhentikan proses secara normal.

Masalah dengan kill -9 atau kill -s SIGKILL

Kembali ke pembahasan awal, mengapa menggunakan kill -9 untuk memberhentikan proses di Linux tidak disarankan? Alasannya adalah karena sinyal SIGKILL tidak bisa diabaikan oleh proses. Proses yang menerima sinyal SIGKILL akan langsung dihentikan tanpa bisa melakukan apa-apa untuk menanggapi sinyal dan membersihkan diri.

Ini bisa menjadi masalah jika proses tersebut sedang melakukan operasi penting, seperti menulis data, menyimpan konfigurasi, atau melakukan operasi lain yang bisa merusak data. Jika proses tidak diberi kesempatan untuk membersihkan diri, bisa saja data yang sedang diolah oleh proses tersebut menjadi korup.

Alternatif yang Lebih Baik

Sebagai gantinya, Anda bisa menggunakan sinyal SIGTERM untuk memberhentikan proses. Sinyal SIGTERM memberi kesempatan kepada proses untuk menanggapi sinyal tersebut dan membersihkan diri sebelum berhenti. Proses bisa menutup koneksi ke database, menulis data yang belum tersimpan, atau melakukan operasi lain yang diperlukan sebelum berhenti.

Anda bisa menggunakan perintah kill dengan opsi -15 atau -s SIGTERM untuk mengirim sinyal SIGTERM ke proses. Contoh:

kill -15 <pid>
kill -s SIGTERM <pid>

Dengan menggunakan sinyal SIGTERM, Anda memberi kesempatan kepada proses untuk berhenti dengan cara yang lebih aman dan terkontrol. Jika proses tidak merespon terhadap sinyal SIGTERM, Anda bisa menggunakan sinyal SIGKILL sebagai langkah terakhir.

Bagaimana dengan Ctrl+C?

Ctrl+C adalah cara yang umum digunakan untuk memberhentikan proses yang sedang berjalan di terminal. Ctrl+C mengirim sinyal SIGINT ke proses, yang biasanya akan memberhentikan proses dengan cara yang lebih aman daripada SIGKILL. Akan tetapi, Ctrl+C hanya bisa digunakan untuk proses yang berjalan secara interaktif di terminal.

Adanya jawaban di survei tersebut yang menggunakan Ctrl+C untuk memberhentikan proses yang berjalan menandakan bahwa responden menjalankan proses tersebut secara interaktif di terminal secara manual, bukan sebagai daemon atau proses latar belakang.

Kemungkinan besar, teman-teman yang menjawab Ctrl+C adalah mereka yang menjalankan proses tersebut dengan menggunakan perintah screen atau tmux lalu di-detach dari terminal. Jadi, ketika ingin memberhentikan proses tersebut, mereka kembali ke terminal dan menekan Ctrl+C.

Masalah dengan menggunakan screen atau tmux

Meskipun menggunakan screen atau tmux memungkinkan kita untuk menjalankan proses di latar belakang dan mengaksesnya kembali di kemudian hari, ada beberapa masalah yang bisa timbul. Salah satunya adalah masalah monitoring dan logging.

Dalam Linux, solusi yang lebih baik untuk menjalankan proses di latar belakang adalah menggunakan systemd. systemd adalah sistem init yang digunakan oleh banyak distribusi Linux modern, seperti Ubuntu, Fedora, dan CentOS. Dengan menggunakan systemd, Anda bisa membuat unit file untuk menjalankan proses di latar belakang, memonitor proses tersebut, dan melihat log proses tersebut dengan menggunakan perintah journalctl.

Contoh unit file systemd untuk menjalankan proses di latar belakang:

[Unit]
Description=Proses Saya 
After=network.target

[Service]
Type=simple
ExecStart=/path/to/my/process
Restart=on-failure

[Install]
WantedBy=multi-user.target

Simpan unit file tersebut di /etc/systemd/system/my-process.service, lalu jalankan perintah berikut:

sudo systemctl daemon-reload
sudo systemctl start my-process
sudo systemctl enable my-process

Dengan menggunakan systemd, Anda bisa menjalankan proses di latar belakang dengan lebih terkontrol dan memiliki kemampuan monitoring dan logging yang lebih baik. Semua output dari proses tersebut akan tersimpan di journalctl, sehingga Anda bisa melihat log proses tersebut dengan mudah.

Contoh jika ingin melihat log dari proses yang dijalankan dengan systemd lima menit yang lalu:

journalctl -u my-process --since "5 minutes ago"

Alasan Saya Menulis Ini

Saya menulis artikel ini karena saya ingin karena ada tweet dari mas Levi yang membahas tentang graceful shutdown berikut:

Di dalam cuitan tersebut juga dituliskan mengenai bagaimana cara menangani sinyal yang dikirimkan oleh sistem operasi ke proses. Tapi semua itu ga ada gunanya kalau semua orang menggunakan kill -9

Kesimpulan

Jadi, intinya adalah, gunakan sinyal SIGTERM untuk memberhentikan proses di Linux. Sinyal SIGTERM memberi kesempatan kepada proses untuk membersihkan diri sebelum berhenti, sehingga data yang sedang diolah oleh proses tersebut tidak menjadi korup. Jika proses tidak merespon terhadap sinyal SIGTERM, Anda bisa menggunakan sinyal SIGKILL sebagai langkah terakhir.

Jika Anda ingin menjalankan proses di latar belakang, gunakan systemd untuk membuat unit file yang memungkinkan Anda untuk menjalankan proses di latar belakang, memonitor proses tersebut, dan melihat log proses tersebut dengan mudah.

linux
sistem-operasi
infrastruktur

Previous Article

Pembuatan Aplikasi Cross Platform Dengan Menggunakan C dan CMake
Pembuatan Aplikasi Cross Platform Dengan Menggunakan C dan CMake

Dalam artikel ini, kita akan membahas cara membuat aplikasi lintas platform dengan menggunakan C dan CMake.

Subscribe Kanal Koding Aja Dulu!

Berlangganan ke channel YouTube kami dan dapatkan akses ke tutorial terbaru, tips, dan trik pemrograman sistem, microservices, dan low level programming.

Subscribe Sekarang