Create-New-Services-Units-in-SystemD

ایجاد سرویس در centos با Systemd

بررسی نحوه ایجاد یک سرویس در Systemd:

در این پست قصد داریم تا نحوه ایجاد یک سرویس لینوکسی در Centos را با استفاده از systemd بررسی کنیم. همانطور که پیش تر در پست مربوط به معرفی systemd و تفاوت آن با init اشاره اشاره گردید، systemd ‌ یک system manager  است که وظیفه مدیریت سرویس ها، سخت افزار، mount point  ها و سایر موجودیت های سیستم عامل را بر عهده دارد. تمامی این موجودیت ها با نام unit در systemd‌ شناخته می شوند که با یک فایل configuration به سیستم معرفی می شوند. این فایل ها میتوانند بر اساس این که چکونه ایجاد می شوند در یکی از سه مسیر زیر قرار داشته باشند.

  • /usr/lib/systemd/system/
  • /run/systemd/system/
  • /etc/systemd/system/

معرفی کردن سرویس جدید، به معی اضافه کردن unit جدید می باشد. در نتیجه باید قایل پیکربندی این unit  نیز در سیستم ایجاد شود. بدین منظور باید فایل پیکربندی سرویس را در میسر /etc/systemd/system/ و با نامی با پسوندtype  آن ایجاد نماییم.

به عنوان نمونه:
sample_unit_name.unit_type
data_writer.service
some_socket.sock

برخی از unit type  ها به شرح زیر می باشند.

  • Device
  • Service
  • Socket
  • Swap
  • Target
  • Timer
  • Snapshot
  • Mount
  • Slice
  • Path
  • Automount
  • Scope

در این مستند با توجه به این که قصد ایجاد سرویس را داریم، از service در انتهای نام سرویس مورد نظر استفاده خواهد شد.

برای ایجاد فایل پیکربندی سرویس یا unit file  فایلی را در مسیر اشاره (/etc/systemd/system/) و به صورت زیر ایجاد می نماییم.

vi /etc/systemd/system/newservice.service

این فایل می بایست به صورت زیر ایجاد شود و دارای سه قسمت باشد.

[Unit]
 Description= a description for service

[Service]	
 ExecStart=the path to execute service script/file

[Install]
 WantedBy=default.target

بعد از ایجاد فایل و ذخیره سازی تنظیمات، می بایست پرمیژن فایل برابر با ۶۴۴ قرار داده شود و در با دستور systemctl، systemd را reload  کرده تا از تغییرات اعمال شده با خبر شود.

Chmod 644 /etc/systemd/system/newservice.service
Systemctl daemon-reload

در ادامه به معرفی برخی از پارامتر های مورد استفاده در هر بخش خواهیم پرداخت:

پارامتر های بخش Unit:

توضیحی کوتاه از سرویس است. Description
برای معرفی مسیر مستندات مربوط به unit به کار می رود Documentation
لیستی از unit هایی است که کنار این سرویس فعال باشند. در صورتی که هر کدام از unit ها اشاره شده در این قسمت فعال نباشند، سرویس شروع ب کار نخواهد کرد. Requires
لیست unit  هایی است که برای اجرای سرویس باید اجرا شوند. با عدم اجرای این unit ها بر خلاف require، میتوان سرویس را اجرا نمود. Wants
لیست unit هایی است که قبل از شروع به کار آنها باید سرویس اجرا و فعال شود. Before
لیست unit هایی است که فقط بعد از اجرای آنها میتوان سرویس را اجرا کرد. After
لیست unit  هایی  است که نمیتوانند همزمان با سریس اجرا شوند. conflict

پارامتر های بخش Service:

بیانگر نوع شروع سرویس می باشد. به عنوان نمونه:
simple: مقدار پیش فرض است و سرویس با مقدار قرار داده شده برای ExecStart به عنوان یک process اجرا خواهد شد.Onehot: همانند simple اجرا می شود اما سیستم صبر میکند تا کار پردازش با سایر unit ها به اتمام برسد.
Type
مشخص کننده دستوری است که قبل از اجرای Process باید اجرا شود. ExecStartPre
مشخص کننده دستوری است که با آن process شروع به کار خواهد کرد. ExecStart
مشخص کننده دستوری است که بعد از شروع process اجرا شود. ExecStartPost
مشخص کننده دستوری است که برای توقف process استفاده میشود. ExecStop
مشخص کننده دستوری است که با دریافت دستور reload باید انجام شود. ExecReload
مشخص کننده این است که چه زمانی سرویس به صورت اتوماتیک restart شود. Restart
بیانگر فایلی است که pid مربوط به process‌ در آن ذخیره می شود. PIDfile
بیانگر روشی است که process‌ باید متوقف شود. KillMode
بیانگر سیگنالی است که برای توقف سرویس استفاده می شود. KillSignal
بیانگر نام کاربری ای در سیستم است که سرویس باید توسط آن اجرا شود. User
بیانگر گروه سیستمی است که سرویس باید با آن اجرا شود. Group
بیانگر مدت زمانی است که سیستم صبر می ناید تا مطمپن شود process مورد نظر متوقف شده است. در صورتی که process همچنان بعد از گذشت این زمان فعال باشد، مجددا برای توقف آن تلاش می کند. TimeoutStopSec

پارمتر های بخش Install:

لیستی از unit  های است که به این سرویس یا unit  نیاز دارند تا اجرا شوند. RequiredBy
بیانگر target ‌یا run level هایی است که unit  در آن ها باید اجرا شود. به عنوان مثال در هنگام خاموش شدن یا هنگامی که سیستم وارد multi user run level می شود. WantedBy

هنگامی که فایل مرتبط با سرویس را ایجاد کردیم، میتوانیم با reload کردن systemd، سرویس را enable/disable و start/sop نماییم. با دستور زیر سرویس enable  خواهد شد و در هر بار بوت سیستم عامل بر اساس فایل پیکربندی ایجاد شده، شروع به کار می نماید.

systemctl enable myservice

به این نکته نیز اشاره کنیم که target (یا همان run level) پیش فرض در دایرکتوری /etc/systemd/system دارای یک دایرکتوری مجزا است که در آن لیست unit  هایی که باید در آن اجرا شوند وجود خواهد داشت.

هنگامی که از دستور بالا استفاده میکنیم، فایلی با نام سرویس در این دایرکتوری ایجاد می شود و به فایل ایجاد شده در مراحل قبل لینک میشود.

به عنوان نمونه اگر نام سرویس ما data_writer باشد که در multi-user  باید اجرا شود، با استفاده از دستور بالا فایلی به صورت زیر ایجاد می شود.

در صورتی که بخواهیم سرویس را غیر فعال نماییم نیز از دستور زیر استفاده خواهیم کرد. با استفاده از این دستور لینک ایجاد شده در مرحله قبل حذف می گردد.

systemctl disable myservice

ارائه نمونه عملی:

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

در این مثال میخواهیم اسکریپتی به زبان پایتون با نام data_writer.py را به عنوان سرویس معرفی، فعال و اجرا نماییم. این سرویس می بایست بعد از شروع به فعالت سرویس دیگری به نام mod-gearman2-worker شروع به فعالیت نماید. و اجرای آن نیز باید توسط user و group برابر با Nagios باشد.بدین منظور در فایلی در مسیر /etc/systemd/system به صورت زیر ایجاد می نماییم.

vi /etc/systemd/system/data_writer.service

سپس پارامتر های آن را به صورت زیر وارد می نماییم.

link_systemd

پس از ذخیره سازی تغییرات، با دستور زیر پرمیژن فایل را به  644 تغییر می دهیم.

chmod 644 /etc/systemd/system/data_writer.service

سپس systemd را با دستور زیر به reload خواهیم کرد تا تغییرات و اضافه شدن unit  جدید را متوجه شود.

systemctl reload-daemon

سپس با دستور زیر سرویس را enable  می نماییم.

systemctl enable data_writer.service

enable the service

در نهایت سرویس را با دستور زیر start  خواهیم کرد.

systemctl start data_writer.service

بعد از شروع به کار سرویس میتوانیم وضعیت آن را نیز با دستور زیر مشاهده نماییم.

systemctl status data_writer.service

service_status

نتیجه گیری:

در این مستند بعد از آشنایی با systemd به معرفی unit  ها و نحوه ایجاد فایل پیکربندی در آنها پرداخته شد و سعی گردید با ارپه توضیحاتی از پارامتر های مورد استفاده آن ها نحوه ایجاد و معرفی سرویس در systemd را قابل درک نموده ودر انتها با اراپه مثالی عملی به چگونگی ایجاد و معرفی سرویس بپردازیم.

حامد
اشتراک دانش رو دوست دارم برای همین سعی میکنم مطالب آموزشی ای تهیه شده دارای جزئیات خوب و به صورت کامل تهیه بشوند.استفاده از مطالب این سایت در هر جایی بلا مانع می باشد. اما ذکر منبع رفتاری حرفه ای و اخلاقی خواهد بود. من را از نظرات خود مطلع سازید. و اگر میخواهید در مورد من بیشتر بدانید سری به صفحه "در باره من" بزنید.