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.
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 tombolCtrl+C
.SIGQUIT
(3): Sinyal ini dikirim ke proses ketika pengguna menekan tombolCtrl+\
.SIGABRT
(6): Sinyal ini dikirim ke proses ketika proses memanggil fungsiabort()
.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.