15%

Hemat 15% di Semua Layanan Hosting

Uji kemampuanmu dan dapatkan Diskon pada paket hosting apa saja

Gunakan kode:

Skills
Memulai
06.11.2024

Cara Menggunakan systemd untuk Memulai Layanan Linux saat Boot

Memastikan bahwa layanan kritis dimulai secara otomatis ketika server Anda di-boot ulang adalah salah satu tanggung jawab paling fundamental dari setiap administrator sistem Linux. Baik Anda menjalankan aplikasi web, mesin database, atau daemon khusus pada lingkungan VPS Hosting, boot ulang yang tidak terduga tidak boleh berarti downtime yang berkepanjangan. Dengan systemd — sistem init modern yang mendukung mayoritas distribusi Linux saat ini — Anda dapat menentukan dengan tepat bagaimana, kapan, dan sebagai siapa layanan Anda diluncurkan, semuanya melalui file unit deklaratif yang bersih.

Panduan komprehensif ini memandu Anda melalui setiap langkah: memahami apa itu systemd, membuat file unit layanan yang siap produksi, memverifikasi izin, menguji executable Anda, dan mengelola siklus hidup layanan. Pada akhirnya, aplikasi khusus Anda akan bertahan di setiap boot secara otomatis.

Apa Itu systemd dan Mengapa Hal Ini Penting?

systemd adalah sistem init dan manajer layanan yang menggantikan alternatif yang lebih lama seperti SysVinit dan Upstart di sebagian besar distribusi Linux utama, termasuk Ubuntu, Debian, CentOS, Rocky Linux, AlmaLinux, dan Fedora. Daripada menjalankan rantai sekuensial skrip shell saat boot, systemd melakukan paralelisasi startup layanan, menyelesaikan pengurutan ketergantungan, dan mengelola seluruh siklus hidup proses sistem dari satu antarmuka terpadu.

Keuntungan utama systemd untuk lingkungan server

FiturManfaat
Startup layanan paralelWaktu boot lebih cepat di server multi-layanan
Manajemen ketergantunganLayanan dimulai hanya setelah prasyarat mereka siap
Kebijakan restart otomatisLayanan yang mogok pulih tanpa intervensi manual
Logging terpusat melalui journaldSemua output layanan ditangkap dalam jurnal yang dapat diquery
Kontrol sumber daya berbasis cgroupBatas CPU dan memori diterapkan per layanan
Aktivasi soket dan perangkatLayanan dimulai sesuai permintaan, bukan tanpa syarat

Bagi siapa pun yang mengelola aplikasi di Server Dedicated atau instance VPS, kemampuan ini diterjemahkan langsung ke dalam uptime yang lebih tinggi dan perilaku yang lebih dapat diprediksi di bawah beban.

Memahami File Unit systemd

Semuanya yang dikelola systemd diwakili oleh file unit — file konfigurasi teks biasa yang dibagi menjadi bagian. File unit .service memberi tahu systemd:

  • Apa layanannya (metadata, deskripsi, ketergantungan)
  • Bagaimana menjalankannya (jalur executable, direktori kerja, konteks pengguna)
  • Kapan memulainya (target boot, pengurutan relatif terhadap unit lain)
  • Apa yang harus dilakukan jika gagal (kebijakan restart, penundaan restart)

File unit layanan untuk layanan di seluruh sistem berada di /etc/systemd/system/. File yang ditempatkan di sini mengambil alih dari unit yang disediakan vendor di /lib/systemd/system/ dan bertahan di seluruh upgrade paket.

Langkah demi Langkah: Membuat Unit Layanan systemd

Panduan berikut menggunakan aplikasi fiktif yang disebut myapp. Ganti setiap instance dari myapp, myuser, dan /usr/bin/myapp dengan nilai yang sesuai untuk lingkungan Anda sendiri.

Langkah 1: Siapkan Direktori Kerja

Sebelum menulis file unit, tentukan di mana aplikasi Anda akan berjalan. Direktori kerja khusus membuat file konfigurasi, log, dan data runtime terorganisir dan membuat manajemen izin menjadi mudah.

Buat direktori jika belum ada:

sudo mkdir -p /opt/myapp

> Mengapa /opt/ bukan /etc/systemd/?

> Pohon /etc/systemd/ dicadangkan untuk konfigurasi systemd sendiri. Menempatkan data aplikasi di sana tidak standar dan dapat menyebabkan kebingungan. Gunakan /opt/myapp, /srv/myapp, atau /var/lib/myapp tergantung pada kategori Standar Hierarki Sistem File yang paling sesuai dengan beban kerja Anda.

Tetapkan kepemilikan kepada pengguna yang akan menjalankan layanan:

sudo useradd --system --no-create-home --shell /usr/sbin/nologin myuser
sudo chown -R myuser:myuser /opt/myapp

Menggunakan akun sistem khusus (tidak ada shell login, tidak ada direktori home) adalah praktik terbaik keamanan. Ini membatasi radius ledakan jika aplikasi pernah dikompromikan.

Verifikasi hasilnya:

ls -ld /opt/myapp
# Expected output: drwxr-xr-x 2 myuser myuser 4096 Jan 1 00:00 /opt/myapp

Langkah 2: Buat File Unit Layanan

Buka file unit baru dengan editor pilihan Anda:

sudo nano /etc/systemd/system/myapp.service

Tempel konten berikut, sesuaikan nilai untuk mencocokkan aplikasi Anda:

[Unit]
Description=My Custom Application
Documentation=https://example.com/docs
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
ExecStart=/usr/bin/myapp --config /opt/myapp/myapp.conf
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
RestartSec=5s
User=myuser
Group=myuser
WorkingDirectory=/opt/myapp
StandardOutput=journal
StandardError=journal
SyslogIdentifier=myapp

# Security hardening
NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=true
PrivateTmp=true

[Install]
WantedBy=multi-user.target

Simpan file dengan Ctrl+O, kemudian keluar dengan Ctrl+X.

Langkah 3: Memahami Setiap Direktif

#### Bagian [Unit]

DirektifTujuan
DescriptionNama yang dapat dibaca manusia ditampilkan dalam output systemctl status
DocumentationReferensi URL atau halaman manual untuk layanan
AfterMemastikan layanan dimulai *setelah* unit yang tercantum aktif
WantsKetergantungan lunak — systemd akan *mencoba* memulai unit yang tercantum tetapi tidak akan gagal jika tidak tersedia

> network-online.target vs network.target: Gunakan network-online.target (dikombinasikan dengan Wants=network-online.target) untuk layanan yang benar-benar membutuhkan antarmuka jaringan yang dikonfigurasi sepenuhnya — misalnya, aplikasi yang terhubung ke database jarak jauh atau API eksternal saat startup. network.target hanya menjamin bahwa subsistem jaringan telah *dimulai*, bukan bahwa antarmuka aktif dan alamat ditetapkan.

#### Bagian [Service]

DirektifTujuan
Type=simpleProses yang dimulai oleh ExecStart adalah proses utama (default untuk sebagian besar aplikasi)
ExecStartJalur lengkap ke biner dan argumen apa pun. Selalu gunakan jalur absolut.
ExecReloadPerintah untuk memuat ulang konfigurasi tanpa restart penuh (opsional tetapi direkomendasikan)
Restart=on-failureMulai ulang layanan hanya ketika keluar dengan kode bukan nol atau dibunuh oleh sinyal. Gunakan always jika Anda menginginkan restart bahkan pada exit bersih.
RestartSecDetik untuk menunggu sebelum mencoba restart
User / GroupJalankan proses sebagai pengguna/grup ini bukan root
WorkingDirectoryAtur direktori saat ini sebelum menjalankan ExecStart
StandardOutput / StandardErrorArahkan stdout/stderr ke jurnal systemd
SyslogIdentifierTag yang digunakan untuk memfilter entri jurnal untuk layanan ini
NoNewPrivilegesMencegah proses mendapatkan hak istimewa tambahan melalui biner setuid
ProtectSystem=strictMemasang /usr, /boot, dan /etc sebagai baca-saja untuk layanan
ProtectHomeMembuat /home, /root, dan /run/user tidak dapat diakses
PrivateTmpMemberikan layanan namespace /tmp privatnya sendiri

#### Bagian [Install]

DirektifTujuan
WantedBy=multi-user.targetMengaktifkan layanan ketika sistem mencapai runlevel multi-pengguna standar (non-grafis). Ini adalah target yang benar untuk hampir semua daemon server.

Langkah 4: Verifikasi Izin File dan Direktori

Sebelum memuat ulang systemd, konfirmasi bahwa pengguna layanan benar-benar dapat mengakses semua yang dibutuhkannya:

# Check working directory ownership and permissions
ls -ld /opt/myapp

# Confirm the executable exists and is executable
ls -l /usr/bin/myapp

# Verify the config file is readable by myuser
sudo -u myuser cat /opt/myapp/myapp.conf

Jika salah satu pemeriksaan ini gagal, perbaiki izin sebelum melanjutkan:

# Make the binary executable
sudo chmod +x /usr/bin/myapp

# Grant read access to the config file
sudo chmod 640 /opt/myapp/myapp.conf
sudo chown myuser:myuser /opt/myapp/myapp.conf

Langkah 5: Uji Executable Secara Manual

Selalu verifikasi bahwa aplikasi Anda berjalan dengan benar *sebelum* menyerahkan kontrol ke systemd. Ini mengisolasi bug aplikasi dari masalah konfigurasi systemd:

sudo -u myuser /usr/bin/myapp --config /opt/myapp/myapp.conf

Jika aplikasi dimulai tanpa kesalahan, tekan Ctrl+C untuk menghentikannya dan lanjutkan. Jika gagal, troubleshoot aplikasi itu sendiri — periksa bahwa semua dependensi terinstal, variabel lingkungan diatur, dan port yang diperlukan tersedia.

Langkah 6: Muat Ulang systemd dan Aktifkan Layanan

Setelah menyimpan file unit, instruksikan systemd untuk membaca ulang konfigurasinya:

sudo systemctl daemon-reload

Aktifkan layanan sehingga dimulai secara otomatis di setiap boot berikutnya:

sudo systemctl enable myapp.service

Perintah ini membuat symlink di direktori .wants yang sesuai, menghubungkan file unit Anda ke urutan boot multi-user.target. Anda akan melihat output serupa dengan:

Created symlink /etc/systemd/system/multi-user.target.wants/myapp.service → /etc/systemd/system/myapp.service.

Mulai layanan segera tanpa boot ulang:

sudo systemctl start myapp.service

Langkah 7: Verifikasi Layanan Sedang Berjalan

Periksa status saat ini dari layanan:

sudo systemctl status myapp.service

Layanan yang sehat menghasilkan output seperti ini:

● myapp.service - My Custom Application
     Loaded: loaded (/etc/systemd/system/myapp.service; enabled; vendor preset: disabled)
     Active: active (running) since Wed 2025-01-01 12:00:00 UTC; 5s ago
   Main PID: 12345 (myapp)
      Tasks: 4 (limit: 4915)
     Memory: 12.3M
        CPU: 45ms
     CGroup: /system.slice/myapp.service
             └─12345 /usr/bin/myapp --config /opt/myapp/myapp.conf

Bidang kunci untuk diverifikasi:

  • Loaded — mengkonfirmasi file unit diuraikan dengan berhasil dan menunjukkan apakah enabled atau disabled untuk boot
  • Active: active (running) — layanan sedang berjalan
  • Main PID — ID proses aplikasi Anda

Langkah 8: Monitor Log dengan journalctl

systemd merutekan semua output layanan ke jurnal, penyimpan log terstruktur yang dapat diquery. Gunakan journalctl untuk memeriksa:

# View all logs for myapp (most recent last)
journalctl -u myapp.service

# Follow live log output (like tail -f)
journalctl -u myapp.service -f

# Show only logs since the last boot
journalctl -u myapp.service -b

# Show the last 50 lines
journalctl -u myapp.service -n 50

# Show logs since a specific time
journalctl -u myapp.service --since "2025-01-01 12:00:00"

Jika layanan Anda gagal dimulai, jurnal hampir selalu berisi pesan kesalahan yang tepat menjelaskan alasannya. Ini adalah tempat pertama untuk dilihat sebelum membuat perubahan apa pun.

Langkah 9: Uji Perilaku Boot

Untuk mengkonfirmasi layanan bertahan dari boot ulang tanpa secara manual memeriksa urutan boot, Anda dapat mensimulasikannya:

# Reboot the server (only if safe to do so)
sudo reboot

Setelah server kembali online, periksa status layanan lagi:

sudo systemctl status myapp.service

Jika menampilkan active (running), layanan Anda dikonfigurasi dengan benar untuk startup otomatis.

Mengelola Siklus Hidup Layanan

Setelah layanan Anda berjalan, Anda akan menggunakan perintah berikut secara teratur:

Perintah systemctl Umum

# Start the service
sudo systemctl start myapp.service

# Stop the service gracefully
sudo systemctl stop myapp.service

# Restart the service (stop + start)
sudo systemctl restart myapp.service

# Reload configuration without restarting (if ExecReload is defined)
sudo systemctl reload myapp.service

# Enable automatic startup at boot
sudo systemctl enable myapp.service

# Disable automatic startup at boot
sudo systemctl disable myapp.service

# Check whether the service is enabled
sudo systemctl is-enabled myapp.service

# Check whether the service is currently active
sudo systemctl is-active myapp.service

# View the full unit file as systemd interprets it
sudo systemctl cat myapp.service

# Edit the unit file and reload in one step
sudo systemctl edit --full myapp.service

Troubleshooting Masalah Umum

Layanan gagal dimulai: “No such file or directory”

Ini biasanya berarti ExecStart menunjuk ke biner yang tidak ada atau WorkingDirectory tidak ada. Verifikasi kedua jalur:

which myapp
ls -l /opt/myapp

Layanan dimulai tetapi segera keluar

Periksa jurnal untuk output kesalahan aplikasi itu sendiri:

journalctl -u myapp.service -n 100 --no-pager

Juga verifikasi bahwa Type=simple benar untuk aplikasi Anda. Jika biner Anda melakukan fork ke latar belakang, gunakan Type=forking sebagai gantinya.

Kesalahan “Permission denied”

Pengguna layanan tidak memiliki akses ke file atau direktori yang diperlukan. Gunakan ls -l untuk mengaudit izin dan sudo -u myuser untuk menguji akses secara interaktif.

Port sudah digunakan

Proses lain terikat pada port yang dibutuhkan aplikasi Anda. Identifikasi dengan:

sudo ss -tlnp | grep :<port>

Layanan restart dalam loop

Jika Restart=on-failure menyebabkan loop restart cepat, systemd pada akhirnya akan membatasi restart. Periksa StartLimitIntervalSec dan StartLimitBurst di bagian [Unit] untuk menyesuaikan perilaku ini, dan selalu selidiki akar penyebab dalam jurnal.

Pola systemd Lanjutan untuk Server Produksi

Variabel Lingkungan dan File Lingkungan

Jangan pernah hardcode rahasia dalam file unit. Gunakan file lingkungan sebagai gantinya:

[Service]
EnvironmentFile=/etc/myapp/myapp.env
ExecStart=/usr/bin/myapp

Buat /etc/myapp/myapp.env dengan chmod 600 dan chown root:myuser untuk membatasi akses:

DATABASE_URL=postgresql://user:password@localhost/mydb
API_KEY=supersecretkey

Ketergantungan Layanan dan Pengurutan

Jika aplikasi Anda bergantung pada layanan database (misalnya PostgreSQL atau MySQL), deklarasikan ketergantungan itu secara eksplisit:

[Unit]
After=network-online.target postgresql.service
Requires=postgresql.service

Requires adalah ketergantungan keras — jika PostgreSQL gagal dimulai, systemd tidak akan mencoba memulai layanan Anda juga.

Integrasi Watchdog

Untuk layanan yang sangat penting, aktifkan watchdog bawaan systemd untuk mendeteksi proses yang tergantung:

[Service]
WatchdogSec=30s
Restart=on-watchdog

Aplikasi Anda harus memanggil sd_notify(0, "WATCHDOG=1") secara berkala untuk mengatur ulang timer watchdog. Jika gagal melakukannya dalam WatchdogSec, systemd membunuh dan memulai ulang layanan.

Memilih Lingkungan Hosting yang Tepat

Pola konfigurasi systemd yang dijelaskan dalam panduan ini berlaku sama di semua jenis server Linux, tetapi pilihan infrastruktur hosting Anda mempengaruhi seberapa banyak kontrol yang Anda miliki atas sistem init dan manajemen layanan.

  • VPS Hosting — Akses root penuh, kontrol systemd lengkap, ideal untuk deployment aplikasi khusus. Paket VPS AlexHost berjalan pada virtualisasi KVM, memberikan Anda lingkungan kernel terisolasi yang genuine.
  • Server Dedicated — Performa maksimal dan isolasi untuk layanan yang intensif sumber daya. Akses perangkat keras penuh tanpa tetangga yang berisik.
15%

Hemat 15% di Semua Layanan Hosting

Uji kemampuanmu dan dapatkan Diskon pada paket hosting apa saja

Gunakan kode:

Skills
Memulai