الحمدالله، شرایط جور شد، ادامه میدیم:
فکر میکنم لازم باشه بیشتر درباره superviser توضیح بدم. اول از همه بدونید ۳ اینیت مشهور از چه چیزی برای superviser استفاده میکنن:
OpenRC: supervise-deamon
systemd: Built-in (توضیح بیشتر: خودش به طور خودکار اینکارو میکنه مگر تنظیم کنید نکنه)
sysvinit: start-stop-deamon
فکر میکنم در سوالی در ذهنتون به وجود اومده، اونم اینه: «چه برنامه هایی نیاز به supervise دارن؟»
هر برنامه ای که باید همیشه روشن باشه، برنامه ای که برای کارکرد صحیحش به تنظیم کردن متغیر های محیطی نیاز داشته باشه و چند مورد خاص دیگه که بهتره خودتون بعدا کشفش کنید
به طور مثال nginx به این مسئله
نیاز داره و اسکریپت هم بدین شکل شده:
#!/sbin/openrc-run
name=$RC_SVCNAME
description="A high performance web server and a reverse proxy server"
supervise="supervise-daemon"
command="/usr/sbin/nginx"
command_args="-g 'daemon on; master_process on;'"
pidfile="/run/nginx.pid"
extra_started_commands="reload"
depend() {
after net
use dns logger netmount
}
#stop() {
# ebegin "Stopping $RC_SVCNAME"
# /sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid
# eend $?
#}
reload() {
ebegin "Reloading $RC_SVCNAME"
/usr/sbin/nginx -g 'daemon on; master_process on;' -s reload
eend $?
}
اما یک برنامه مثل mariadb به این مسئله
نیاز نداره و اسکریپتش بدین شکل شد:
#!/sbin/openrc-run
extra_stopped_commands="setup"
retry="60"
pidfile="/run/mysqld/$RC_SVCNAME.pid"
command="/usr/bin/mysqld_safe"
command_args="--syslog --nowatch --pid-file=$pidfile"
depend() {
after net
after localmount
}
start_pre() {
required_dirs=$(getconf datadir "/var/lib/mysql")
if [ ! -d $required_dirs/mysql ]; then
eerror "Datadir '$required_dirs' is empty or invalid."
eerror "Run '/etc/init.d/mariadb setup' to create new database."
fi
}
start_post() {
ewaitfile 10 $(getconf socket "/run/mysqld/mysqld.sock")
}
stop() {
ebegin "Stopping $RC_SVCNAME"
/etc/init.d/mariadb_sysvinit stop
}
setup() {
ebegin "Creating a new MySQL database"
mysql_install_db --user=mysql --datadir=/var/lib/mysql
eend $?
}
getconf() {
v=$(my_print_defaults --mysqld | grep ^--$1)
[ -z $v ] && echo $2 || echo ${v#*=}
}
حالا میتونم، کاملا دقیق بهتون بگم کی باید از supervise-deamon استفاده کنید.
nginx یک برنامه است که به این مسئله نیاز داره. چرا؟ چون باید همیشه روشن باشه و روش نظارت بشه.
اما اگه mariadb رو با mysqld_safe اجرا کنیم، برنامه mysqld_safe خودش تمام چیز هایی که لازم هست رو راه اندازی میکنه و بعدا خودش بسته میشه.
فکر میکنم اگه بادقت دنبال کرده باشید، تا الآن کامل متوجه شده باشید. راستی تا اینجا خوندی بگذار بهت یک نکته بگم:
OpenRC از superviser های دیگه علاوه بر supervise-deamon خودش پشتیبانی میکنه مثلا s6-superviser. میتونید بعدا که حرفه ای شدید دربارش جستجو کنید، اگه الآن برید سراغش، ممکنه گیج بشید
بریم سراغ مسئله بعدی: command و command_args
توضیح خاصی نداره. دستور اصلی (مثلا /usr/bin/nginx) رو در command بنویسید و اگه میخواید آرگومان خاصی بهش بدید، اون رو در command_args بنویسید. به مثال زیر توجه کنید:
...
command="/usr/sbin/nginx"
command_args="-g 'daemon on; master_process on;'"
...
میتونید تمام دستور رو در command بنویسید اما توصیه نمیشه و بهتره از هم تفکیکشون کنید.
مبحث بعدی: command_user
این دستور در شرایطی به درد میخوره که میخواید یک دستور تحت یک کاربر خاص (به جز کاربر ریشه) اجرا بشه. به مثال زیر دقت کنید، amavis-new لازم داره تحت کاربر amavis اجرا بشه، پس اینو مینویسیم:
...
command_user="amavis:amavis"
...
نکته: «کاربر:گروه کاربری» اگه لازم بود گروه کاربری رو هم مشخص کنید
مبحث بعدی: pid_file
درباره pid پیشنهاد میکنم که این مطلب رو از ویکی پدیای فارسی بخونید:
https://fa.wikipedia.org/wiki/%D8%B4%D9%86%D8%A7%D8%B3%D9%87_%D9%81%D8%B1%D8%A7%DB%8C%D9%86%D8%AFاین pid_file میآید و pid پروسه والد رو در جایی که مشخص میکنید، مینویسه.
و در نهایت مبحث extra_commands ها (این مسئله پیشرفته است پیشنهاد میکنم که بعدا بهش فکر کنید)
ممکنه در کار اسکریپت نویسی تون بخواید یکسری کار های اضافه (به جز start stop restart zap و status) در اسکریپت طراحی کنید، اون وقت باید چه کرد؟
اینجاست که extra_commands ها وارد میشن. در اینها میتونید دستوراتی تعریف کنید که در حالت استاندارد تعریف نشده اند.
سه نوع از extra_commands وجود داره:
extra_commands دستوراتی که در همه حال معتبرند
extra_started_commands دستوراتی که تنها در صورت روشن بودن خدمت معتبرند
extra_stopped_commands دستوراتی که تنها در صورت خاموش بودن خدمت معتبرند
هر کدوم این سه تا به درد کار های مختلف میخورند که در ادامه چند نمونه از کاربرد هاش رو میگم:
۱- تعریف کردن reload برای خدمت، مشابه با systemd
برای اینکار به extra_started_commands نیاز داریم، تعریفش میکنیم:
...
extra_started_commands="reload"
...
سپس در اسکریپتمون، قسمت زیرو تعریف میکنیم:
reload() {
ebegin "Reloading $RC_SVCNAME"
/bin/kill -USR2 $(cat /run/php/php-fpm.pid)
eend $?
}
ذخیره اش میکنیم و حال میبینیم میتوانیم به مشابه systemd، از دستور reload استفاده کنیم.
۲- راه اندازی اولیه یک برنامه:
فرض کنیم میخوایم برای mariadb اسکریپت بنویسیم. میخواهیم درصورتی که کاربر تا به حال اقدام به ساخت پایگاه داده نکرده، بتوانید با استفاده از همین اسکریپت، این کار را انجام دهد. یک extra_stopped_comnands به نام setup تنظیم میکنیم:
...
extra_stopped_commands="setup"
...
و در اسکریپت بخشی به همین نام مینویسیم:
...
setup() {
ebegin "Creating a new MySQL database"
mysql_install_db --user=mysql --datadir=/var/lib/mysql
eend $?
}
...
حال کاربر میتوانید با دستور setup، پایگاه داده اولیه خود را بسازد.
خب قسمت اول آموزش openrc-run تموم شد. توصیه میکنم پس درک کامل این آموزش به سراغ جستجو درباره openrc و openrc-run بپردازید و اطلاعات جدید کسب کنید.
در آخر خواندن صفحه man زیر بسیار توصیه میشود:
man openrc-run
ایام به کام یاعلی مدد