آیا می‌دانستید که شما می‌توانید پس از نوشتن برنامه‌های پرکاربرد که با زبان برنامه نویسی مورد علاقه تان نوشته اید، به راحتی یک سرویس برای آن ایجاد کرده و با استفاده از systemd آن برنامه را به یک سرویس تبدیل نمایید. در اینجا، مراحل انجام این کار شرح داده شده است.

 

در ابتدا بیایید با استفاده از PHP یک سرور کوچک ایجاد کنیم. در این سرور، پورت 10000 مربوط به UDP شنود می‌شود؛ بدین صورت که هر پیامی را که دریافت می‌نماید با پاسخ را با استفاده از تابع ROT13، باز می‌گرداند:

در صورتی که نمی دانید str_rot13 چه کاری انجام می دهد، این صفحه را مطالعه بفرمایید: PHP str_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);
}

 

اکنون باید سرویس را راه‌اندازی کرده:

$ php server.php

و آن را در ترمینال دیگری آزمایش نمایید:

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

همانطور که مشاهده می‌کنید، برنامه به درستی کار می‌کند.

 

این مطلب نیز ممکن است برای شما مفید باشد: فعال و غیرفعال کردن اجرای سرویس ها در اوبونتو و CentOS

 

اکنون می‌خواهیم این اسکریپت همیشه اجرا شود؛ بدین صورت که در صورت خرابی (خروج غیرمنتظره) دوباره راه‌اندازی شود و حتی پس از راه‌اندازی مجدد سرور، بصورت خودکار راه‌اندازی شود. در چنین موقعیتی باید از systemd استفاده کرد.

 

تبدیل برنامه به سرویس

در ابتدا فایلی به عنوان مثال به نام jeyservice.service در مسیر  /etc/systemd/system/ایجاد نمایید:

[Unit]
Description=JeyService 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

که در آن شما باید نام کاربری واقعی خود را مقابل User= نوشته و مسیر مناسب اسکریپت خود را پس از ExecStart= تنظیم کنید

 

اکنون می‌توانید سرویس را راه‌اندازی نمایید:

systemctl start jeyservice

و به صورت زیر، آن را فعال کنید؛ بطوریکه پس از هربار راه‌اندازی سیستم، بطور خودکار سرور راه‌اندازی شود:

systemctl enable jeyservice

اکنون که سرویس شما به درستی کار می‌کند، ممکن است بخواهید پیکربندی‌های بیشتری انجام دهید و اطمینان حاصل کنید که همیشه مطابق انتظار شما کار خواهد کرد.

 

راه‌اندازی بلافاصله پس از اجرا

شاید از خود پرسیده باشید که گزینه After = در سرویس چه کاری انجام می‌دهد. با این گزینه تعیین می‌شود که سرویس شما باید بلافاصله پس از آماده شدن شبکه راه‌اندازی شود. اگر برنامه شما به فعال بودن سرور MySQL نیاز دارد، باید موارد زیر را اضافه کنید:

After=mysqld.service

 

راه‌اندازی مجدد پس از خراب شدن

Systemd بطور پیش فرض، اگر سرویسی به هر دلیلی متوقف شد، آن را مجدداً راه‌اندازی نمی‌کند. احتمالاً شما می‌خواهید سرویس شما همیشه در دسترس باشد؛ بدین منظور با استفاده از دستور زیر مشخص می‌کنید که همیشه سرویس هنگام خروج، مجدداً راه‌اندازی شود:

Restart=always

همچنین می‌توانید از on-failure استفاده کنید تا فقط درصورتی که وضعیت خروج 0 نبود، مجدداً راه‌اندازی شود.

به طور پیش فرض، systemd پس از 100میلی ثانیه دوباره راه‌اندازی می‌شود. شما می‌توانید با استفاده از دستور زیر، مدت زمان دلخواه خود را تعیین نمایید:

RestartSec=1

 

محدودیت در راه‌اندازی

به طور پیش فرض، هنگامی‌که تنظیمات Restart=always را انتخاب می‌کنید، چنانچه سرویس شما در مدت زمان 10 ثانیه بیش از 5 بار راه‌اندازی نشود، systemd از راه‌اندازی مجدد سرویس برای همیشه خودداری می‌کند.

به منظور جلوگیری از این مشکل، دو گزینه پیکربندی [Unit] مسئول این امر هستند:

StartLimitBurst=5
StartLimitIntervalSec=10

 

دستورالعمل RestartSec نیز می‌تواند برای ایجاد محدودیت استفاده شود: بدین صورت که اگر تنظیم کنید که سرویس بعد از 3 ثانیه مجدداً راه‌اندازی شود، هرگز در عرض 10 ثانیه نمی‌توانید به 5 بار امتحان ناموفق برسید.

راه‌حل ساده‌ای که همیشه کار می‌کند تنظیم StartLimitIntervalSec = 0 است. به این ترتیب، systemd سعی می‌کند سرویس شما را برای همیشه راه‌اندازی کند.

بهتر است برای جلوگیری از ایجاد فشار زیاد بر سرور خود، هنگام عدم موفقیت در راه‌اندازی، RestartSec را حداقل روی 1 ثانیه تنظیم کنید.

به عنوان یک گزینه دیگر، می‌توانید تنظیمات پیش فرض را ترک کرده و با استفاده از StartLimitAction = reboot، از systemd بخواهید در صورت رسیدن به حد شروع، سرور خود را مجدداً راه‌اندازی نماید.

 

 

 

منبع:

medium