Senin, 22 Juni 2026

Cara Membuat Service Systemd di Linux (Panduan Aplikasi Biner)

logo systemd linux

Menjinakkan Aplikasi Biner di Linux: Panduan Praktis Membuat Service systemd

Pernahkah Anda membangun sebuah aplikasi hebat menggunakan Go, Rust, C++, atau bahkan mengemas aplikasi Python/Node.js menjadi file biner tunggal (single binary), lalu bingung bagaimana cara menjalankannya di server produksi?

Mungkin saat pertama kali mencoba, Anda menggunakan trik klasik seperti:

nohup ./my-app > app.log 2>&1 &

Atau membiarkannya berjalan di dalam sesi screen atau tmux. Cara ini memang bekerja untuk sementara. Namun, apa yang terjadi jika server tiba-tiba melakukan reboot otomatis setelah pemeliharaan rutin? Atau bagaimana jika aplikasi Anda mengalami crash karena kehabisan memori? Jawabannya jelas: aplikasi Anda akan mati dan tidak akan hidup kembali secara otomatis.

Di dunia DevOps modern, cara-cara "koboi" di atas sudah lama ditinggalkan. Standar industri untuk mengelola aplikasi di background (daemonize) pada sistem operasi Linux modern adalah menggunakan systemd.

Dalam artikel kali ini, kita akan membahas langkah demi langkah merancang custom systemd service untuk menjalankan file biner Anda bagaikan service bawaan sistem Linux yang tangguh dan siap tempur.


Mengapa Harus systemd?

Sebelum masuk ke teknis, mari kita samakan persepsi dulu. systemd adalah sistem inisialisasi (init system) dan manajer sistem yang bertindak sebagai proses pertama (PID 1) saat Linux melakukan booting.

Dengan membungkus aplikasi biner kita ke dalam unit service systemd, kita mendapatkan segudang fitur gratisan yang sangat bernilai:

  • Auto-start: Aplikasi otomatis menyala begitu server melakukan reboot.

  • Auto-recovery: Otomatis menyalakan ulang (restart) aplikasi jika mengalami crash.

  • Standardized Logging: Log aplikasi langsung dialirkan ke journald (bisa diintip dengan perintah journalctl).

  • Resource Limitation: Kita bisa membatasi penggunaan CPU atau memori langsung dari konfigurasi menggunakan Control Groups (cgroups).

  • Security Sandboxing: Menjalankan aplikasi di bawah user dengan hak akses minimal, bukan root.


Langkah 1: Siapkan File Biner dan Struktur Direktori

Demi kerapihan dan keamanan sistem, jangan biarkan file biner Anda berserakan di direktori /home/user/ atau /root/. Tempat standar untuk meletakkan file biner pihak ketiga (bukan bawaan distro) adalah /usr/local/bin/.

Mari kita pindahkan file biner kita ke sana dan berikan izin eksekusi (executable):

# Pindahkan biner ke direktori aman
sudo cp /path/ke/aplikasi-anda /usr/local/bin/my-app

# Berikan izin akses eksekusi
sudo chmod +x /usr/local/bin/my-app

Pro-Tip Keamanan:

Jangan pernah menjalankan aplikasi produksi Anda sebagai user root. Jika aplikasi Anda memiliki celah keamanan (misal: remote code execution), peretas akan langsung mendapatkan kontrol penuh atas server Anda.

Solusinya, buatlah system user khusus tanpa hak akses login shell:

sudo useradd -r -s /bin/false appuser


Langkah 2: Meracik Unit File .service

Semua konfigurasi service buatan pengguna disimpan di direktori /etc/systemd/system/. Meracik unit file baru sangatlah mudah, silakan buat file dengan ekstensi .service di direktori tersebut:

sudo nano /etc/systemd/system/my-app.service

Salin dan tempelkan konfigurasi deklaratif di bawah ini ke dalam file tersebut:

[Unit]
Description=Aplikasi Biner Kustom Saya
After=network.target

[Service]
Type=simple
User=appuser
Group=appuser
WorkingDirectory=/tmp
ExecStart=/usr/local/bin/my-app
Restart=on-failure
RestartSec=5s

# Manajemen Log output
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target

Simpan file tersebut (Ctrl+O lalu Enter di editor Nano, kemudian keluar dengan Ctrl+X).


Langkah 3: Membedah Isi Konfigurasi .service

Mari kita bedah apa arti baris-baris konfigurasi di atas agar Anda tidak sekadar copy-paste, melainkan benar-benar paham fungsionalitasnya:

1. Bagian [Unit]

Bagian ini mendefinisikan metadata dan urutan eksekusi aplikasi Anda.

  • Description: Nama atau deskripsi manusiawi untuk service Anda. Ini akan muncul saat Anda menjalankan systemctl status.

  • After=network.target: Parameter ini sangat krusial. Ini menginstruksikan systemd untuk menahan eksekusi aplikasi Anda sampai sistem jaringan (network stack) Linux aktif. Sangat penting jika aplikasi biner Anda memerlukan koneksi internet/API untuk bekerja.

2. Bagian [Service]

Bagian paling vital yang menentukan bagaimana aplikasi Anda dijalankan.

  • Type: Mengatur tipe startup dan cara systemd mengawasi proses aplikasi Anda. Parameter ini sangat krusial, sehingga kita akan mengupas tuntas pilihan tipenya pada bagian khusus di bawah!

  • User & Group: Di sini kita pasang appuser yang telah kita buat sebelumnya agar aplikasi berjalan dengan hak akses terbatas.

  • WorkingDirectory: Menentukan direktori kerja saat aplikasi dijalankan.

    Trap Peringatan Keamanan: Jangan arahkan parameter ini ke /usr/local/bin jika aplikasi Anda perlu menulis file lokal (seperti log lokal, cache, atau file sqlite). Karena direktori /usr/local/bin dimiliki oleh root, appuser tidak memiliki izin menulis di sana dan akan menyebabkan aplikasi mengalami crash (Permission Denied). Arahkan ke /tmp atau direktori khusus yang dimiliki oleh appuser (misalnya /var/lib/my-app).

  • ExecStart: Harus berupa path absolut ke file biner aplikasi Anda. systemd tidak mengenali alias atau path relatif di sini.

  • Restart: Menentukan dalam kondisi apa systemd harus otomatis menghidupkan kembali aplikasi Anda jika ia berhenti berjalan. Kita akan membedah parameter ini secara mendalam pada bab terpisah!

  • RestartSec=5s: Memberi jeda waktu selama 5 detik sebelum mencoba menyalakan kembali aplikasi yang mati untuk menghindari penggunaan CPU berlebih akibat kegagalan berulang (rapid looping).

3. Bagian [Install]

  • WantedBy=multi-user.target: Memastikan service ini otomatis berjalan pada mode multi-user normal (kondisi standar server Linux tanpa GUI).


Mengupas Tuntas Tipe-Tipe Service (Type=) di systemd

Parameter Type= di bawah blok [Service] bertugas memberi tahu systemd bagaimana cara mendeteksi bahwa aplikasi telah sukses berjalan (startup completion).

Pemilihan tipe yang salah dapat menyebabkan systemd mengira aplikasi Anda gagal berjalan, atau menahan proses booting sistem tanpa alasan yang jelas. Berikut adalah penjelasan mendalam mengenai masing-masing tipe:

1. Type=simple (Default)

Ini adalah tipe paling dasar sekaligus yang paling sering digunakan untuk aplikasi web modern.

  • Cara Kerja: Begitu systemd mengeksekusi perintah di ExecStart, systemd langsung menganggap service tersebut aktif (active/running). systemd tidak peduli apakah proses biner di dalamnya benar-benar berhasil menginisialisasi port jaringan atau justru langsung mati satu milidetik kemudian.

  • Cocok Untuk: Aplikasi yang berjalan di foreground dan tidak melakukan forking (misalnya aplikasi biner Go, Rust, skrip Node.js, atau aplikasi Python yang menangani event-loop sendiri).

  • Kelemahan: Jika ada service lain yang bergantung (dependent) pada aplikasi ini, systemd akan langsung menjalankan service kedua tersebut tanpa menunggu aplikasi utama benar-benar siap menerima koneksi.

2. Type=forking

Digunakan untuk mengelola daemon tradisional (gaya Unix lama).

  • Cara Kerja: Ketika systemd memanggil perintah ExecStart, proses awal akan berjalan, lalu membuat proses anak (child process/fork) di latar belakang, kemudian proses awal tersebut akan langsung keluar (exit/terminate). systemd baru menganggap service aktif setelah proses induk pertama keluar dengan sukses dan proses anak terdeteksi berjalan stabil di background.

  • Cocok Untuk: Daemon klasik seperti Nginx, Apache HTTP Server, atau skrip bash lama yang menggunakan perintah latar belakang (diakhiri tanda &).

  • Konfigurasi Pendukung: Anda sangat disarankan untuk menambahkan parameter PIDFile=/var/run/my-app.pid agar systemd dapat melacak PID mana yang bertindak sebagai proses utama di background.

3. Type=oneshot

Tipe ini ditujukan untuk perintah atau skrip yang memiliki tugas spesifik dan dipastikan akan selesai (keluar/exit) setelah tugas itu rampung.

  • Cara Kerja: systemd akan menjalankan perintah di ExecStart dan menunggu hingga proses tersebut selesai sepenuhnya (exit code 0) sebelum melanjutkan eksekusi ke service berikutnya. Statusnya akan berubah dari activating langsung menjadi inactive (dead) begitu prosesnya selesai.

  • Cocok Untuk: Skrip backup otomatis, skrip inisialisasi jaringan, migrasi database (DB migration), atau operasi pembersihan file sampah.

  • Tips Kombinasi: Sering kali dikombinasikan dengan RemainAfterExit=yes agar systemd tetap mencatat status service tersebut sebagai active (exited) meskipun proses fisiknya di sistem sudah tidak ada.

4. Type=notify

Mirip dengan simple, tetapi aplikasi Anda harus secara aktif memberi tahu systemd bahwa dirinya telah siap.

  • Cara Kerja: systemd memulai aplikasi Anda tetapi menahan statusnya tetap di activating. Aplikasi Anda harus mengirimkan sinyal khusus (seperti memanggil fungsi sd_notify() dari library systemd) ke socket systemd untuk melapor bahwa inisialisasi internalnya (seperti koneksi ke database atau membaca memori cache) telah rampung. Setelah sinyal diterima, statusnya berubah menjadi active (running).

  • Cocok Untuk: Aplikasi berskala besar yang membutuhkan waktu inisialisasi yang cukup lama, di mana stabilitas urutan booting sangat diutamakan.

  • Kelemahan: Membutuhkan modifikasi kode internal aplikasi agar dapat berkomunikasi langsung dengan sistem socket milik systemd.

5. Type=idle

Tipe ini digunakan untuk mengoptimalkan tampilan konsol atau meminimalkan perebutan sumber daya saat booting awal.

  • Cara Kerja: Cara kerjanya persis seperti Type=simple, namun systemd akan menunda eksekusi aplikasi ini hingga semua pekerjaan penting lainnya di sistem selesai dieksekusi.

  • Cocok Untuk: Service dengan prioritas rendah atau aplikasi utilitas pemantauan yang tidak krusial di menit-menit pertama booting.

6. Type=dbus

Tipe khusus yang digunakan jika aplikasi Anda terdaftar di bus komunikasi sistem D-Bus.

  • Cara Kerja: systemd akan menanti hingga aplikasi berhasil mendaftarkan nama khususnya di sistem bus D-Bus sebelum menandai status service tersebut sebagai aktif.

  • Cocok Untuk: Modul atau service internal sistem operasi Linux (seperti NetworkManager atau daemon desktop GUI).


Tabel Perbandingan Cepat Tipe Service systemd

Tipe ServiceApakah Menunggu Proses Selesai?Kapan Dianggap "Active"?Contoh Kasus Penggunaan Terbaik

simple

Tidak

Sesaat setelah biner dipanggil

Aplikasi biner modern (Go, Rust, Node.js)

forking

Menunggu proses utama keluar

Setelah proses utama keluar dan child process aktif

Daemon tradisional (Nginx, MySQL)

oneshot

Ya (Wajib)

Setelah proses selesai berjalan (exit code 0)

Skrip backup, migrasi DB, bersih-bersih cache

notify

Tidak

Setelah aplikasi mengirim sinyal sd_notify

Aplikasi kompleks dengan warm-up time lama

idle

Tidak

Setelah semua proses booting selesai mengantre

Skrip log audit, utility non-kritikal

Menguasai Kebijakan Auto-Restart (Restart=) di systemd

Kebijakan restart adalah salah satu jaring pengaman terpenting yang disediakan oleh systemd untuk menjaga high availability aplikasi kita di lingkungan produksi. Namun, tidak semua skenario kegagalan aplikasi harus ditangani dengan cara yang sama.

Berikut adalah berbagai macam opsi nilai parameter Restart= yang dapat Anda gunakan beserta perilakunya:

1. Restart=no (Default)

systemd tidak akan pernah mencoba menghidupkan kembali service Anda, apa pun alasannya.

  • Kapan Digunakan: Sangat ideal untuk service bertipe oneshot yang memang didesain untuk selesai sekali jalan, atau saat Anda sedang melakukan proses debugging manual di mana Anda ingin menganalisis penyebab eror secara presisi tanpa terganggu oleh proses restart otomatis.

2. Restart=always

systemd akan menghidupkan kembali aplikasi Anda dalam kondisi apa pun—baik ketika aplikasi mati secara bersih (clean exit/exit code 0), keluar dengan kode eror (non-zero exit code), dimatikan paksa oleh sistem (killed by signal seperti SIGKILL atau SIGSEGV), atau mengalami timeout.

  • Kapan Digunakan: Digunakan untuk daemon utama yang harus selalu menyala tanpa terkecuali selama server hidup.

  • Perhatian: Hati-hati menggunakan opsi ini pada aplikasi yang dirancang untuk berhenti setelah tugasnya selesai, karena ia akan terjebak dalam putaran restart tanpa henti (infinite restart loop).

3. Restart=on-failure (Rekomendasi Produksi)

systemd hanya akan menghidupkan kembali aplikasi jika ia keluar secara tidak normal.

  • Kriteria Kegagalan (Failure):

    • Keluar dengan exit code selain 0 (misalnya crash karena kode penanganan eror internal).

    • Dihentikan secara paksa oleh sinyal sistem (killed by signal seperti SIGSEGV / out-of-memory).

    • Waktu respons habis (timeout).

  • Kelebihan: Jika Anda menghentikan service secara sengaja (misalnya dengan menjalankan sudo systemctl stop my-app yang mengirimkan clean exit signal), systemd cukup cerdas untuk not menyalakan aplikasi itu kembali. Ini adalah standar emas untuk aplikasi server biner/web API.

4. Restart=on-abnormal

Mirip dengan on-failure, namun jauh lebih toleran terhadap kode kesalahan internal.

  • Cara Kerja: systemd hanya melakukan restart jika proses mati karena hal-hal ekstrem di luar kontrol internal aplikasi, seperti terkena kill signal, core dump, atau timeout. Jika aplikasi Anda keluar secara "sopan" dengan memberikan status exit code tidak normal (misalnya exit(1)), systemd tidak akan menyalakannya kembali.

5. Restart=on-success

Kebalikan dari on-failure. systemd hanya akan menghidupkan kembali aplikasi jika ia keluar secara bersih (exit code 0 atau sinyal penutupan sukses seperti SIGHUP / SIGTERM).

6. Restart=on-abort

systemd hanya akan melakukan restart jika proses aplikasi keluar secara mendadak akibat menerima sinyal yang tidak tertangani secara bersih (misalnya Core Dump akibat kegagalan memori).


Tabel Matriks Pemicu Restart systemd

Berikut adalah rangkuman visual kapan systemd akan memicu aksi restart berdasarkan jenis penyebab matinya aplikasi:

Kebijakan RestartClean Exit (0)Unclean Exit (e.g. Code 1)Killed by SignalTimeout

no

always

on-success

on-failure

on-abnormal

on-abort

(Keterangan: ✅ = Memicu Restart otomatis, ❌ = Diabaikan/Tetap mati)


Pro-Tip DevOps: Menghindari Crash Loop (Restart Rate Limiting)

Bayangkan jika biner aplikasi Anda memiliki bug fatal pada saat membaca database (misalnya salah memasukkan kredensial database). Jika Anda memasang Restart=always atau on-failure, systemd akan terus-menerus mencoba menyalakan aplikasi, lalu aplikasi langsung mati dalam hitungan milidetik, lalu dinyalakan lagi, dan begitu seterusnya.

Hal ini disebut sebagai Crash Loop. Jika dibiarkan, putaran ini akan memakan resource CPU server hingga 100% dan membuat log journald Anda membengkak drastis akibat lonjakan penggunaan CPU (CPU spikes).

Untuk mencegah bencana ini, Anda wajib memasang limit pengaman.

Perbaikan Teknis Penting (Systemd v230+):

Banyak tutorial di internet meletakkan konfigurasi pembatas ini di bawah bagian [Service]. Hal itu salah karena di systemd modern, parameter ini telah didelegasikan sepenuhnya ke dalam blok [Unit].

Berikut adalah konfigurasi pembatasan yang benar:

[Unit]
Description=Aplikasi Biner Kustom Saya
After=network.target
# Membatasi siklus restart: Maksimal 5 kali percobaan restart dalam rentang waktu 30 detik
StartLimitIntervalSec=30s
StartLimitBurst=5

[Service]
Type=simple
ExecStart=/usr/local/bin/my-app
Restart=on-failure
RestartSec=5s

  • StartLimitIntervalSec: Rentang waktu pengawasan systemd terhadap frekuensi kegagalan.

  • StartLimitBurst: Jumlah toleransi maksimum aplikasi boleh mengalami kegagalan sebelum akhirnya systemd menyerah dan membiarkan status aplikasi menjadi failed (berhenti total untuk mencegah kerusakan server lebih lanjut).


Mengelola Variabel Lingkungan (Environment Variables) di systemd

Aplikasi biner modern (seperti backend API) sangat bergantung pada variabel lingkungan (environment variables) untuk membaca konfigurasi dinamis (misalnya port, koneksi database string, API keys, atau mode enkripsi). Ini sesuai dengan kaidah Twelve-Factor App.

Jangan pernah meng-hardcode nilai sensitif ke dalam kode biner Anda. Systemd menyediakan dua cara elegan untuk menyuntikkan variabel ini ke dalam proses backend:

Metode 1: Menyuntikkan Variabel Secara Langsung (Environment=)

Jika variabel lingkungan Anda sedikit dan tidak bersifat rahasia (seperti menentukan konfigurasi port aplikasi), Anda bisa langsung menuliskannya secara deklaratif di bawah blok [Service]:

[Service]
...
# Menyuntikkan variabel tunggal
Environment=PORT=8080

# Menyuntikkan beberapa variabel sekaligus (gunakan spasi untuk pemisah)
Environment="APP_ENV=production" "LOG_LEVEL=info" "DB_PORT=5432"

Metode 2: Menggunakan Berkas Rahasia Eksternal (EnvironmentFile=) - Sangat Direkomendasikan!

Menulis kredensial database atau JWT Token langsung di berkas .service berisiko tinggi karena berkas tersebut biasanya masuk ke dalam repositori Git atau dapat dibaca oleh banyak user di server.

Pendekatan terbaik adalah memisahkannya ke dalam berkas konfigurasi mandiri (biasanya berekstensi .env atau .conf) yang dikunci dengan hak akses ketat, lalu memanggilnya melalui EnvironmentFile:

  1. Buat berkas rahasia di direktori yang terisolasi (misalnya /etc/my-app/app.env):

    sudo mkdir -p /etc/my-app
    sudo nano /etc/my-app/app.env
  2. Isi berkas tersebut dengan format KEY=VALUE standar:

    # /etc/my-app/app.env
    DB_HOST=127.0.0.1
    DB_USER=psql_user
    DB_PASSWORD=password_super_rahasia_anda_di_sini
    JWT_SECRET=rahasia_token_bintang_lima
  3. Ubah izin akses berkas tersebut agar hanya bisa dibaca oleh pemilik proses (misalnya appuser):

    sudo chown appuser:appuser /etc/my-app/app.env
    sudo chmod 600 /etc/my-app/app.env
    

    Analisis Keamanan Tingkat Lanjut (Security Hardening):

    Tahukah Anda? Systemd membaca berkas EnvironmentFile menggunakan hak akses root sebelum menurunkan (dropping) privilese proses ke User=appuser.

    Artinya, Anda bahkan bisa mengatur kepemilikan file .env tersebut ke root:root dengan hak akses chmod 600 (atau 400). Dengan cara ini, jika aplikasi backend Anda yang berjalan sebagai appuser dieksploitasi oleh peretas, peretas tersebut tidak akan pernah bisa membaca file konfigurasi .env dari sistem penyimpanan disk, karena ia tidak memiliki hak akses pembacaan filesystem sebagai root!

  4. Hubungkan berkas tersebut ke dalam konfigurasi unit file [Service] Anda:

    [Service]
    ...
    # Tanda minus (-) di depan path menginstruksikan systemd untuk mengabaikan eror jika berkas .env ini tidak sengaja terhapus, alih-alih membuat service gagal booting.
    EnvironmentFile=-/etc/my-app/app.env
    


Mengendalikan Pembatasan Resource (Cgroups) & Prioritas Proses

Di server produksi yang sibuk, sangat sering terjadi kondisi di mana satu aplikasi mengalami kebocoran memori (memory leak) atau terjebak dalam infinite loop logika kode yang menghabiskan 100% daya CPU. Jika hal ini terjadi, seluruh sistem server Anda akan mengalami freeze (macet total).

Systemd memanfaatkan teknologi Control Groups (cgroups) bawaan kernel Linux untuk membatasi konsumsi daya komputasi secara presisi dan mengatur seberapa prioritas aplikasi tersebut di mata CPU scheduler.

Berikut adalah parameter-parameter pembatas terbaik yang bisa Anda pasang di bawah blok [Service]:

1. Mengatur Prioritas Kerja CPU (Nice=)

Jika aplikasi biner Anda menjalankan kalkulasi data yang sangat berat di background tetapi Anda tidak ingin proses tersebut mengganggu performa server web utama Anda, Anda bisa menurunkan tingkat prioritas kerjanya:

  • Nice=: Menerima nilai bilangan bulat antara -20 (prioritas tertinggi, sangat agresif mengambil hak jatah CPU) hingga 19 (prioritas terendah, sangat mengalah pada proses lain).

  • Nilai bawaan systemd adalah 0.

[Service]
...
# Memberikan prioritas rendah agar aplikasi bersikap sopan pada aplikasi lain di server
Nice=10

2. Membatasi Penggunaan Memori RAM (MemoryMax= & MemoryHigh=)

Untuk mencegah aplikasi biner Anda memakan seluruh RAM server dan mematikan basis data (seperti MySQL/PostgreSQL) akibat kehabisan memori, Anda wajib membatasi kapasitas RAM-nya:

  • MemoryMax=: Batas maksimal RAM yang kaku (hard limit). Jika aplikasi Anda melewati batas ini, kernel Linux akan langsung mengirimkan sinyal OOM (Out of Memory) Killer untuk menghentikan aplikasi secara paksa.

  • MemoryHigh=: Batas pengawasan halus (soft limit). Begitu konsumsi RAM melewati nilai ini, systemd akan sengaja memperlambat alokasi memori untuk proses tersebut dan memicu mekanisme pembersihan memori (garbage collection) internal kernel, tanpa perlu langsung membunuh aplikasinya.

[Service]
...
# Batasi RAM maksimal 500 Megabyte, dengan mitigasi halus mulai dari 400 Megabyte
MemoryHigh=400M
MemoryMax=500M

Catatan: MemoryMax dan MemoryHigh merupakan parameter cgroups v2 modern. Pastikan distribusi Linux Anda menggunakan cgroups v2 (standar pada Ubuntu 22.04+, Debian 11+, RHEL 9+).

3. Membatasi Penggunaan Inti CPU (CPUQuota=)

Anda bisa membatasi berapa persen waktu kerja CPU (CPU execution time) yang boleh dialokasikan untuk service Anda. Parameter ini menerima nilai persentase:

  • Nilai 100% setara dengan penggunaan penuh satu buah inti CPU (Single-Core).

  • Jika server Anda memiliki 4 core, batas maksimal teoretisnya adalah 400%.

[Service]
...
# Membatasi aplikasi agar maksimal hanya boleh memakai daya setara 50% dari 1 core CPU
CPUQuota=50%

4. Mengatur Kekebalan Terhadap OOM Killer (OOMScoreAdjust=)

Saat Linux kehabisan RAM, sistem akan mengaktifkan algoritma OOM Killer untuk membunuh proses acak demi menyelamatkan kestabilan kernel. Proses dengan skor paling tinggi akan dimatikan terlebih dahulu.

  • OOMScoreAdjust=: Menerima nilai antara -1000 (kebal mutlak dari pembunuhan OOM) hingga 1000 (sangat mudah terpilih sebagai korban utama OOM).

  • Direkomendasikan untuk memasang nilai negatif ringan pada aplikasi backend kritis Anda agar ia tidak gampang dimatikan dibanding proses non-kritikal lainnya.

[Service]
...
# Membuat service kita sedikit lebih tangguh/kebal dari incaran OOM Killer
OOMScoreAdjust=-500


Langkah 4: Menghidupkan Engine Service

Setelah file .service berhasil disimpan, systemd belum langsung menyadari keberadaan file baru tersebut. Kita perlu memaksa systemd untuk memindai ulang daftar konfigurasinya (reload daemon).

Jalankan perintah-perintah berikut secara berurutan:

# 1. Reload systemd manager configuration
sudo systemctl daemon-reload

# 2. Aktifkan fitur auto-start saat booting DAN jalankan service sekarang juga
sudo systemctl enable --now my-app.service

Pro-Tip CLI:

Penggunaan opsi --now pada perintah systemctl enable sangat praktis karena menggabungkan dua perintah sekaligus: enable (untuk auto-start) dan start (untuk langsung mengeksekusi saat ini juga). Jadi Anda tidak perlu mengetikkan enable lalu start secara terpisah!


Langkah 5: Verifikasi Status & Intip Log Kerja

Setelah dijalankan, saatnya kita melakukan pengecekan apakah aplikasi biner kita sudah mengudara dengan selamat di background:

sudo systemctl status my-app.service

Jika konfigurasi Anda benar, Anda akan melihat tampilan terminal yang indah dengan indikator hijau bertuliskan active (running) seperti ini:

● my-app.service - Aplikasi Biner Kustom Saya
     Loaded: loaded (/etc/systemd/system/my-app.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2026-06-22 18:00:00 WIB; 10s ago
   Main PID: 12345 (my-app)
      Tasks: 4 (limit: 4915)
     Memory: 15.4M
     CGroup: /system.slice/my-app.service
             └─12345 /usr/local/bin/my-app

Bagaimana Cara Melihat Log Aplikasi Kita?

Karena di langkah 2 kita mengarahkan output log ke journald (StandardOutput=journal), kita tidak perlu lagi pusing mencari-cari file log manual di server.

Cukup gunakan alat bawaan Linux, journalctl, untuk memantau log aplikasi Anda secara real-time bagaikan menggunakan perintah tail -f:

sudo journalctl -u my-app.service -f

Opsi -f (follow) akan terus memantau dan menampilkan baris log baru begitu aplikasi Anda mencetaknya ke konsol (stdout/stderr).


Cheat Sheet: Perintah Manajemen Service Harian

Sebagai admin sistem atau praktisi DevOps, berikut adalah perintah esensial yang paling sering Anda gunakan untuk mengelola service ini:

  • Melihat Status: sudo systemctl status my-app

  • Menyalakan Ulang (Restart): sudo systemctl restart my-app

  • Menghentikan Sementara (Stop): sudo systemctl stop my-app

  • Mematikan Fitur Auto-start Saat Booting: sudo systemctl disable my-app

  • Melihat Log 50 Baris Terakhir: sudo journalctl -u my-app -n 50 --no-pager


Kesimpulan

Selamat! Anda baru saja naik kelas dari menggunakan perintah nohup manual ke manajemen proses bergaya DevOps profesional menggunakan systemd.

Dengan mengonfigurasikan aplikasi biner Anda di bawah kontrol systemd, Anda tidak perlu lagi khawatir aplikasi akan mati tanpa sebab di tengah malam atau lupa menyalakannya kembali pasca-reboot server. Semua dikelola secara otomatis, aman, dan efisien langsung oleh sistem inti Linux.

Apakah Anda memiliki konfigurasi khusus atau menemui kendala saat mencoba? Mari diskusikan di kolom komentar di bawah!

Tidak ada komentar:

Posting Komentar