تعریف سرویس در systemd برای استارت خودکار دیتابیس – وحید یوسف زاده

rn rn rnt

rntt

تعریف سرویس در systemd برای استارت خودکار دیتابیس

rn

rn rnt

rn rnt

rn n

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

nnnnnnnn

برای ایجاد سرویس با systemd، باید فایلی را در یکی از مسیرهای زیر ایجاد کرد:

nnnn

/usr/lib/systemd/system

nnnn

/usr/lib/systemd/user

nnnn

/etc/systemd/system

nnnn

/etc/systemd/user

nnnn

برای نمونه، تعدادی از فایلهایی که در مسیر etc/systemd/system/ قرار دارند را در قسمت زیر مشاهده می کنید:

nnnn

[root@ol7 system]# ls -l

nnnn

drwxr-xr-x. 2 rootnroot   31 Jul 23  2018 basic.target.wants

nnnn

drwxr-xr-x. 2 rootnroot   31 Jul 24  2018 bluetooth.target.wants

nnnn

drwxr-xr-x. 2 root root   87 Jul 23 n2018 default.target.wants

nnnn

drwxr-xr-x. 2 rootnroot   32 Jul 23  2018 getty.target.wants

nnnn

drwxr-xr-x. 2 root rootn4096 Aug  1  2018 graphical.target.wants

nnnn

drwxr-xr-x. 2 root rootn4096 Feb  4 04:56 multi-user.target.wants

nnnn

-rw-r–r–  1 root root n586 Aug  1  2018 oracle-ohasd.service

nnnn

برای ایجاد فایل در هر کدام از این مسیرها، بدیهی است که باید با ساختار این نوع از فایلها آشنا باشیم. فایلهای که در این مسیر تعریف می شوند، می توانند شامل سه قسمت Unit، Service و Install باشند که به عنوان مثال، فایل مربوط به سرویس oracleasm.service، چنین ساختاری دارد:

nnnn

[root@ol7 system]#  less oracleasm.service

nnnn

[Unit]

nnnn

Description=Load oracleasm Modules

nnnn

[Service]

nnnn

ExecStart=/usr/sbin/service  oracleasm start_sysctl

nnnn

ExecStop=/usr/sbin/service   oracleasm stop_sysctl

nnnn

ExecReload=/usr/sbin/service oracleasm restart_sysctl

nnnn

[Install]

nnnn

WantedBy=multi-user.target

nnnn

در ادامه متن، با بعضی از پارامترهای مهم هر کدام از این قسمتها(Unit – Service – Install)، آشنا خواهیم شد.

nnnn

 [Unit]

nnnn

پارامتر Description: ازnطریق این پارامتر، توضیحاتی را در مورد سرویس مورد نظر تعیین می کنیم.

nnnn

مثال:

nnnn

Description=Start Oracle Database

nnnn

Before: در زمان boot شدن سیستم و تا قبل از اجرای سرویس جاری، چه سرویسهایی امکان اجرا ندارند؟

nnnn

مثال:

nnnn

Before =auditd.service systemd-user-sessions.service time-sync.target

nnnn

After: سرویس مورد نظر؛ بعد از اجرای چه سرویسی می تواند استارت شود؟

nnnn

مثال:

nnnn

After=auditd.service systemd-user-sessions.service time-sync.target

nnnn

Conflicts: این پارامتر، لیست سرویسهایی که امکان اجرای همزمان را با سرویس جاری ندارند، مشخص خواهد کرد.

nnnn

نکته: لیست سرویسها را می توان با دستور زیر مشاهده کرد:

nnnn

[root@ol7 system]# systemctl list-units|less

nnnn

  local-fs.target                   loaded active active    Local File Systems

nnnn

  multi-user.target              loaded active active    Multi-User System

nnnn

  network-online.target    loaded active active    Network is Online

nnnn

  network.target                 loaded active active    Network

nnnn

  nfs-client.target        loaded active active    NFS client services

nnnn

  smb.service               loaded active running   Samba SMB Daemon

nnnn

  sshd.service              loaded active running   OpenSSH server daemon

nnnn

  sysstat.service          loaded active exited    Resets System Activity Logs

nnnn

[Service]

nnnn

در این قسمت تعیین می کنیم که با start، stop و restart شدن سرویس، درعمل چه اتفاقی باید رخ دهد به بیانی بهتر، چه اسکریپت و یا دستوری باید اجرا شود؟ در ادامه، تعدادی از پارامترهای این [Service] را مورد بررسی قرار داده ایم:

nnnn

ExecStart: با استارت شدن سرویس، چه دستور و یا اسکریپتی اجرا شود؟

nnnn

مثالهای زیر را ببینید:

nnnn

ExecStart=/usr/sbin/service  oracleasm start_sysctl

nnnn

ExecStart=/usr/sbin/firewalld –nofork –nopid $FIREWALLD_ARGS

nnnn

ExecStart=/sbin/multipathd

nnnn

ExecStart=/usr/bin/touch /root/mynewwwwwwfile

nnnn

ExecStop: سرویسی که توسط پارامتر ExecStart استارت شده، با چه دستور و یا اسکریپتی متوقف خواهد شد؟

nnnn

مثال:

nnnn

ExecStop=/usr/sbin/service   oracleasm stop_sysctl

nnnn

ExecReload: با restart شدن سرویس، چه دستور و یا اسکریپتی اجرا می شود؟

nnnn

مثال:

nnnn

ExecReload=/usr/sbin/service oracleasm restart_sysctl

nnnn

 [Install]

nnnn

زمانی که از دستور systemctl enable و systemctl disable استفاده می کنیم، به قسمت [Install] رجوع خواهد شد. پارامتر مهمی که در این بخش تعریف می شود، WantedBy می باشد.

nnnn

WantedBy: با boot شدن مجدد سرور/ماشین، سرویس در چه runlevelای اجرا شود؟

nnnn

توجه! برای استارت خودکار سرویس بعد از boot شدن سرور، علاوه بر پارامتر WantedBy، باید دستور systemctl enable را هم اجرا کرده باشیم.

nnnn

نکته: لیست runlevelها را در قسمت زیر می بینید:

nnnn

 [root@ol7 ~]# cd /usr/lib/systemd/system/

nnnn

 [root@ol7 system]# ls -l runlevel*.target

nnnn

lrwxrwxrwx. 1 root root 15 Jul 23  2018 runlevel0.target -> poweroff.target

nnnn

lrwxrwxrwx. 1 root root 13 Jul 23  2018 runlevel1.target -> rescue.target

nnnn

lrwxrwxrwx. 1 root root 17 Jul 23  2018 runlevel2.target -> multi-user.target

nnnn

lrwxrwxrwx. 1 root root 17 Jul 23  2018 runlevel3.target -> multi-user.target

nnnn

lrwxrwxrwx. 1 root root 17 Jul 23  2018 runlevel4.target -> multi-user.target

nnnn

lrwxrwxrwx. 1 root root 16 Jul 23  2018 runlevel5.target -> graphical.target

nnnn

lrwxrwxrwx. 1 root root 13 Jul 23  2018 runlevel6.target -> reboot.target

nnnn

در ادامه با دو مثال، شیوه ایجاد سرویس را موردnبررسی قرار خواهیم داد.

nnnn

مثال 1: در قسمت زیر، سرویسی تعریف شده است که استارت کردن آن سبب ایجاد فایلی در مسیر home/oracle/ خواهد شد:

nnnn

[root@ol7 ~]# vi /root/myscript.sh

nnnn

/usr/bin/touchn/home/oracle/m_`date +%y%m%d_%H%M%S`

nnnn

[root@ol7 ~]# chmod +x /root/myscript.sh

nnnn

[root@ol7 ~]# vi /etc/systemd/system/test1.service

nnnn

[Service]

nnnn

ExecStart=/bin/bash /root/myscript.sh

nnnn

 [root@ol7 ~]# systemctl daemon-reload

nnnn

نکته: با هر بار تغییر در متن یک سرویس، باید دستور systemctl daemon-reload را هم اجرا کرد.

nnnn

بعد از تعریف سرویس test1.service، این سرویس را استارت می کنیم:

nnnn

[root@ol7 ~]#systemctl start test1.service

nnnn

با اجرای این دستور، فایلی در مسیر home/oracle/ ایجاد خواهد شد:

nnnn

 [root@ol7 ~]# ls -l /home/oracle/m_*

nnnn

-rw-r–r– 1 root root 0 Feb  4 09:05 /home/oracle/m_190204_090501

nnnn

مثال 2: در این مثال می خواهیم با هر بار reboot شدن سرور، سرویس test1.service هم به صورت خودکار اجرا شود.

nnnn

برای این کار می توانیم متن سرویس test1.service راnبه شکل زیر اصلاح کنیم:

nnnn

[root@ol7 ~]# vi /etc/system/system/test1.service

nnnn

[Service]

nnnn

ExecStart=/bin/bash /root/myscript.sh

nnnn

 [Install]

nnnn

WantedBy=multi-user.target

nnnn

بعد از تغییر فایل test1.service،nکافیست تا دستور systemctlnenable را برای اینnسرویس اجرا کنیم:

nnnn

 [root@ol7 ~]# systemctl enable test1.service

nnnn

Created symlink fromn/etc/systemd/system/multi-user.target.wants/test1.service ton/etc/systemd/system/test1.service.

nnnn

برای تست درستی تعریف سرویس، ماشین را reboot می کنیم:

nnnn

 [root@ol7 ~]# date

nnnn

Mon Feb  4 09:06:38 EST 2019

nnnn

[root@ol7 ~]# reboot

nnnn

PolicyKit daemonndisconnected from the bus.

nnnn

We are no longer anregistered authentication agent.

nnnn

با استارت مجدد ماشین، خواهیم دید که فایل دیگری هم در مسیرhome/oracle/ ایجاد شده است:

nnnn

[root@ol7 ~]# ls -l /home/oracle/m_*

nnnn

-rw-r–r– 1 root root 0nFeb  4 09:05 /home/oracle/m_190204_090501

nnnn

-rw-r–r– 1 root root 0nFeb  4 09:07 /home/oracle/m_190204_090701

nnnn

تعریف سرویس برای استارت خودکار دیتابیس

nnnn

در ادامه قصد داریم با کمک سه اسکریپت ساده زیر، سرویسی را برای stop، start و restart کردن دیتابیس تعریف کنیم:

nnnn

 [root@hkm2 ~]$ vi start_database

nnnn

#!/bin/sh

nnnn

su – oracle <<EOF

nnnn

sqlplus “/asnsysdba”

nnnn

startup ;

nnnn

EOF

nnnn

 [root@ol7 ~]$ vi restart_database

nnnn

#!/bin/sh

nnnn

su – oracle <<EOF

nnnn

sqlplus “/as sysdba”

nnnn

startup force;

nnnn

EOF

nnnn

 [root@ol7 ~]$ vi stop_database

nnnn

#!/bin/sh

nnnn

su – oracle <<EOF

nnnn

sqlplus “/asnsysdba”

nnnn

shut abort

nnnn

EOF

nnnn

با دستور زیر، سرویسی با نام oracledb.service ایجاد خواهد شد که از سه اسکریپت بالا برای مدیریت(stop-start-restart)nدیتابیس اوراکل استفاده خواهد کرد:

nnnn

[root@ol7 ~]# vi /etc/systemd/system/oracledb.service

nnnn

[Unit]

nnnn

Description=Start Oracle Database

nnnn

After=network.target

nnnn

[Service]

nnnn

RemainAfterExit=yes

nnnn

ExecStart=/home/oracle/start_database

nnnn

ExecStop=/home/oracle/stop_database

nnnn

ExecReload=/home/oracle/restart_database

nnnn

[Install]

nnnn

WantedBy=multi-user.target

nnnn

برای استارت خودکار سرویس oracledb.service،nکافیست دستور زیر را اجرا کنیم:

nnnn

[root@ol7 ~]# systemctl enable oracledb.service

nnnn

Created symlink fromn/etc/systemd/system/multi-user.target.wants/oracledb.service ton/etc/systemd/system/oracledb.service.

nnnn

سرویس systemd در زمان استارت کردن سرویس oracledb.service، از تنظیمات فایل limit.conf صرف نظر خواهد کرد، به این جهت، برای اعمال تنظیماتی چون nproc،nofile و stack باید پارامترهای زیر را به متن سرویس oracledb.service اضافه کرد:

nnnn

LimitMEMLOCK=infinity

nnnn

LimitNOFILE=65535

nnnn

LimitSTACK=10240

nnnn

همچنین در صورت تنظیم Huge Page در سرور/ماشین، باید پارامتر معادل memlock را هم به این اسکریپت اضافه کرد:

nnnn

LimitMEMLOCK=infinity

nnnn

با این تغییرات، متن نهایی سرویس oracledb.service، به شکل زیر تغییر خواهد کرد:

nnnn

[root@ol7 ~]# vi /etc/systemd/system/oracledb.service

nnnn

[Unit]

nnnn

Description=Start Oracle Database

nnnn

After=network.target

nnnn

[Service]

nnnn

LimitMEMLOCK=infinity

nnnn

LimitNOFILE=65535

nnnn

LimitNPROC=1638400

nnnn

LimitSTACK=10240

nnnn

RemainAfterExit=yes

nnnn

ExecStart=/home/oracle/start_database

nnnn

ExecStop=/home/oracle/stop_database

nnnn

ExecReload=/home/oracle/restart_database

nnnn

[Install]

nnnn

WantedBy=multi-user.target

nnnn

با تنظیم این سرویس، با دستورات زیر هم می توانnدیتابیس را stop و start کرد:

nnnn

[root@ol7 ~]# systemctl stop oracledb.service

nnnn

[root@ol7 ~]# systemctl start oracledb.service

nnnn

[root@ol7 ~]# systemctl restart oracledb.service

n rnttt

rn rn

rn

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *