Cara Membuat Layanan Linux Dengan Systemd - CRUDPRO

Cara Membuat Layanan Linux Dengan Systemd

Cara Membuat Layanan Linux Dengan Systemd

Saat menulis program situs, saya kerap perlu mengalihkan pekerjaan berat komputasi ke skrip karyawan asinkron, mengagendakan pekerjaan untuk kelak, atau bahkan juga menulis daemon yang dengarkan soket untuk berbicara dengan klien langsung.

Walau kadang ada alat yang lebih bagus untuk tugas itu — selalu pikirkan untuk memakai piranti lunak yang ada lebih dulu, seperti server barisan pekerjaan — menulis service Anda sendiri bisa memberikan Anda tingkat fleksibilitas yang tidak pernah Anda peroleh saat terlilit oleh masalah faksi ke-3 perangkat lunak.

Hal yang kece adalah membuat service Linux lumayan gampang: pakai bahasa pemrograman favorite Anda untuk menulis program yang jalan lama, dan menggantinya jadi service memakai systemd.

Program

Silahkan buat server kecil memakai PHP. Saya dapat menyaksikan alismu naik, tetapi itu bekerja dengan baik sekali. Kami akan dengarkan port UDP 10000, dan kembalikan pesan apa saja yang diterima dengan alih bentuk ROT13:

<?php

$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
socket_bind($sock, '0.0.0.0', 10000);

for (;;) {
    socket_recvfrom($sock, $message, 1024, 0, $ip, $port);
    $reply = str_rot13($message);
    socket_sendto($sock, $reply, strlen($reply), 0, $ip, $port);

Mari kita mulai:

$ php server.php

Dan uji di terminal lain:

$ nc -u 127.0.0.1 10000
Hello, world!
Uryyb, jbeyq!

Kece, sukses. Saat ini kami ingin skrip ini jalan setiap waktu, diawali ulangi bila terjadi kegagalan (keluar yang tidak terduga), serta bertahan dari restart server. Di sanalah systemd berperanan.

Mengubahnya menjadi layanan

Mari buat file bernama /etc/systemd/system/rot13.service:

[Unit]
Description=ROT13 demo service
After=network.target
StartLimitIntervalSec=0[Service]
Type=simple
Restart=always
RestartSec=1
User=centos
ExecStart=/usr/bin/env php /path/to/server.php

[Install]
WantedBy=multi-user.target

Anda harus:

  • set your actual username after User=
  • set the proper path to your script in ExecStart=

Itu dia. Kami sekarang dapat memulai layanan:

$ systemctl start rot13

Dan secara otomatis memulainya saat boot:

$ systemctl enable rot13
Mengambil langkah lebih jauh

Saat ini sesudah service Anda (mudah-mudahan) berperan, kemungkinan penting untuk menyelam lebih dalam ke pilihan komposisi, dan pastikan jika itu akan berperan sama seperti yang Anda harap.

Memulai dengan posisi yang betul

Anda kemungkinan bertanya apa yang sudah dilakukan After= direktif. Maknanya, service Anda harus diawali sesudah jaringan siap. Bila program Anda menginginkan server MySQL aktif dan jalan, Anda harus menambah:

After=mysqld.service
Memulai ulang saat keluar

Secara default, systemd tidak memulai ulang layanan Anda jika program keluar karena alasan apa pun. Ini biasanya bukan yang Anda inginkan untuk layanan yang harus selalu tersedia, jadi kami menginstruksikannya untuk selalu dimulai ulang saat keluar:

Restart=always

Anda juga dapat menggunakan on-failure untuk memulai ulang hanya jika status keluar bukan 0.

Secara default, systemd mencoba memulai ulang setelah 100ms. Anda dapat menentukan jumlah detik untuk menunggu sebelum memulai ulang, menggunakan:

RestartSec=1
Menghindari jebakan: batas awal

Saya pribadi jatuh ke dalam yang satu ini lebih dari sekali. Secara default, saat Anda mengonfigurasi Restart=always seperti yang kami lakukan, systemd berhenti memulai ulang layanan Anda jika gagal memulai lebih dari 5 kali dalam interval 10 detik. Selama-lamanya.

Ada dua opsi konfigurasi [Unit] yang bertanggung jawab untuk ini:

StartLimitBurst=5
StartLimitIntervalSec=10

Direktif RestartSec berpengaruh di hasil: bila Anda menyetelnya untuk mengawali ulangi sesudah 3 detik, karena itu Anda tidak pernah capai 5 eksperimen ulangi yang tidak berhasil di dalam 10 detik.

Pembaruan simpel yang selalu sukses ialah menyetel StartLimitIntervalSec=0. Dengan langkah ini, systemd akan coba me-restart service Anda selama-lamanya.

Seharusnya tentukan RestartSec minimal 1 detik, untuk menghindari kebanyakan penekanan pada server Anda saat terjadi kekeliruan.

Sebagai alternative, Anda bisa tinggalkan penataan standar, dan minta systemd untuk me-restart server Anda bila batasan mulai terwujud, memakai StartLimitAction=reboot.

Apakah benar itu?

Itu saja yang dibutuhkan untuk membikin service Linux dengan systemd: menulis file komposisi kecil yang merekomendasikan program Anda yang telah jalan lama.

Systemd sudah jadi sistem init standar di RHEL/CentOS, Fedora, Ubuntu, Debian, dan yang lain sepanjang sekian tahun saat ini, jadi peluang server Anda siap untuk meng-host service homebrew Anda!