بررسی نحوه ایجاد یک سرویس در 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
سپس پارامتر های آن را به صورت زیر وارد می نماییم.
پس از ذخیره سازی تغییرات، با دستور زیر پرمیژن فایل را به 644 تغییر می دهیم.
chmod 644 /etc/systemd/system/data_writer.service
سپس systemd را با دستور زیر به reload خواهیم کرد تا تغییرات و اضافه شدن unit جدید را متوجه شود.
systemctl reload-daemon
سپس با دستور زیر سرویس را enable می نماییم.
systemctl enable data_writer.service
در نهایت سرویس را با دستور زیر start خواهیم کرد.
systemctl start data_writer.service
بعد از شروع به کار سرویس میتوانیم وضعیت آن را نیز با دستور زیر مشاهده نماییم.
systemctl status data_writer.service
نتیجه گیری:
در این مستند بعد از آشنایی با systemd به معرفی unit ها و نحوه ایجاد فایل پیکربندی در آنها پرداخته شد و سعی گردید با ارپه توضیحاتی از پارامتر های مورد استفاده آن ها نحوه ایجاد و معرفی سرویس در systemd را قابل درک نموده ودر انتها با اراپه مثالی عملی به چگونگی ایجاد و معرفی سرویس بپردازیم.
دیدگاهتان را بنویسید