تغییرات اخیر

در اینجا اطلاعیه‌ها، نسخه‌ها و تغییرات جدید لیارا فهرست می‌شوند.

نحوه پیکربندی لینوکس برای شروع خودکار بعد از خرابی یا راه‌اندازی مجدد


۳۰ اسفند ۱۴۰۳

در این آموزش، از دستور systemd برای پیکربندی MySQL به‌گونه‌ای که پس از راه‌اندازی مجدد یا خرابی به‌طور خودکار راه‌اندازی شود، استفاده خواهیم کرد. در ادامه، شما با مفاهیم targets، wants ،requires و فایل‌های unit آشنا خواهید شد.

پیش‌نیازها

یک سرور با سیستم عامل CentOS 8 که شامل یک کاربر غیر root با دسترسی‌های sudo باشد. همچنین MySQL را بایستی روی CentOS 8 نصب کرده باشید.

در ادامه بخوانید:

  • پیکربندی MySQL برای شروع خودکار پس از راه‌اندازی با استفاده از systemd
  • پیکربندی MySQL برای شروع خودکار پس از خرابی با استفاده از systemd
  • جمع بندی
  • سوالات متداول

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

نحوه پیکربندی لینوکس برای شروع خودکار پس از خرابی یا راه‌اندازی مجدد
نحوه پیکربندی لینوکس برای شروع خودکار پس از خرابی یا راه‌اندازی مجدد

پیکربندی MySQL برای شروع خودکار پس از راه‌اندازی با استفاده از systemd

پس از نصب MySQL، وضعیت سرویس خود را با استفاده از دستور زیر بررسی کنید:

sudo systemctl status mysqld.service

خروجی باید نشان دهد که سرویس در حال اجرا است، اما دایمون (daemon) غیرفعال است. پیامی مانند زیر مشاهده خواهید کرد:

 mysqld.service - MySQL 8.0 database server
   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; disabled; vendor preset: disabled)
    Active: active (running) since Thu 2020-12-24 23:48:56 UTC; 1h 6min ago
   Process: 30423 ExecStartPost=/usr/libexec/mysql-check-upgrade (code=exited, status=0/SUCCESS)
   Process: 30294 ExecStartPre=/usr/libexec/mysql-prepare-db-dir mysqld.service (code=exited, status=0/SUCCESS)
   Process: 30270 ExecStartPre=/usr/libexec/mysql-check-socket (code=exited, status=0/SUCCESS)
 Main PID: 30378 (mysqld)
  Status: "Server is operational"
   Tasks: 40 (limit: 4763)
...

همان‌طور که در خروجی می‌بینید، سرویس فعال است که باید آن‌را غیرفعال کنید:

sudo systemctl disable mysqld.service

سپس برای اینکه بررسی کنید آیا سرویس MySQL توسط multi-user.target درخواست شده است، از دستور زیر استفاده کنید:

sudo systemctl show --property "Wants" multi-user.target | fmt -10 | grep mysql

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

sudo ls -l /etc/systemd/system/multi-user.target.wants/mysql*

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

خروجی :

ls: cannot access '/etc/systemd/system/multi-user.target.wants/mysql*': No such file or directory

اینجا، می‌توانید سرویس MySQL را به‌طور دستی برای شروع خودکار پس از راه‌اندازی مجدد یا خرابی فعال کنید. برای این کار از دستور زیر استفاده کنید:

sudo systemctl enable mysqld.service

این بار، سیستم یک لینک نمادین در مسیر /etc/systemd/system/multi-user.target.wants/ ایجاد خواهد کرد. این لینک نمادین به سیستم اعلام می‌کند که سرویس MySQL باید در زمان بوت سیستم به‌طور خودکار شروع شود.

خروجی:

Created symlink /etc/systemd/system/multi-user.target.wants/mysqld.service → /usr/lib/systemd/system/mysqld.service.

برای تأیید این که لینک نمادین به درستی ایجاد شده است، دوباره دستور ls را اجرا کنید:

sudo ls -l /etc/systemd/system/multi-user.target.wants/mysql*

خروجی مانند زیر دریافت خواهید کرد:

lrwxrwxrwx 1 root root 38 Aug  1 04:43 /etc/systemd/system/multi-user.target.wants/mysqld.service -> /usr/lib/systemd/system/mysqld.service

لازم است بدانید، فعال یا غیرفعال کردن یک سرویس systemd باعث ایجاد یا حذف لینک نمادین از دایرکتوری wants پیش‌فرض می‌شود.

حالا اگر تمایل دارید، دوباره Droplet را ری‌استارت کنید. پس از اینکه سیستم آنلاین شد، از دستور زیر استفاده کنید تا وضعیت سرویس را بررسی کنید:

ps -ef | grep mysql

خروجی دستور بالا، نشان می‌دهد که سرویس MySQL در حال اجرا است:

[secondary_label Output]\
mysql        851       1  2 04:26 ?        00:00:02 /usr/libexec/mysqld --basedir=/usr

حالا که سرویس MySQL را برای راه‌اندازی خودکار پس از راه‌اندازی مجدد پیکربندی کرده‌اید، مرحله بعدی این است که برای برخورد با خرابی‌ها (crashes) پیکربندی کنید.

در لیارا فقط با یک کلیک و در چند ثانیه، دیتابیس MySQL تهیه کنید. ✅ شبکه خصوصی ✅ منابع اختصاصی ✅ مدیریت آسان خرید هاست ابری MySQL

پیکربندی MySQL برای شروع خودکار پس از خرابی با استفاده از systemd

در این مرحله MySQL به‌طور پیش‌فرض به‌گونه‌ای پیکربندی شده است که پس از خرابی به‌طور خودکار راه‌اندازی شود، حالا اگر می‌خواهید این ویژگی را غیرفعال کنید، می‌توانید تنظیمات آن را تغییر دهید.

برای غیرفعال کردن راه‌اندازی خودکار پس از خرابی، دستور زیر را اجرا کنید:

sudo vi /etc/systemd/system/multi-user.target.wants/mysqld.service

بعد از اطلاعات هدر، خروجی به شکل زیر خواهد بود:


[Unit]

Description=MySQL 8.0 database server
After=syslog.target
After=network.target

[Service]

Type=notify
User=mysql
Group=mysql

ExecStartPre=/usr/libexec/mysql-check-socke
ExecStartPre=/usr/libexec/mysql-prepare-db-dir %n
`# Note: we set --basedir to prevent probes that might trigger SELinux alarms,`
`# per bug #547485`
ExecStart=/usr/libexec/mysqld --basedir=/usr
ExecStartPost=/usr/libexec/mysql-check-upgrade
ExecStopPost=/usr/libexec/mysql-wait-stop

`# Give a reasonable amount of time for the server to start up/shut down`

TimeoutSec=300

`# Place temp files in a secure directory, not /tmp`

PrivateTmp=true

Restart=on-failure

RestartPreventExitStatus=1

`# Sets open_files_limit`

LimitNOFILE = 10000

`# Set enviroment variable MYSQLD_PARENT_PID. This is required for SQL restart command.`

Environment=MYSQLD_PARENT_PID=1

[Install]

WantedBy=multi-user.target

همان‌طور که می‌بینید، مقدار پارامتر Restart در فایل سرویس MySQL روی on-failure تنظیم شده است. یعنی اینکه، سرویس MySQL تنها در صورت خروج غیرمنتظره (unclean exit) یا تایم‌اوت‌ها به‌طور خودکار مجدداً راه‌اندازی می‌شود.

در واقع، وقتی Restart=on-failure تنظیم شده باشد، سرویس MySQL فقط در صورتی که با خطای غیرمنتظره خاتمه یابد یا به دلیل تایم‌اوت متوقف شود، دوباره شروع می‌شود. در صورت توقف نرمال سرویس، سیستم آن را مجدداً راه‌اندازی نمی‌کند.

اگر می‌خواهید که سرویس حتی در صورت خطای غیرمنتظره نیز مجدداً راه‌اندازی نشود، می‌توانید مقدار Restart را به no تغییر دهید، که این به معنای غیرفعال کردن راه‌اندازی مجدد پس از هر خرابی است.

در سرویس systemd، دو پارامتر Restart و RestartSec رفتار خرابی را کنترل می‌کنند. پارامتر اول مشخص می‌کند که سرویس در چه شرایطی باید مجدداً راه‌اندازی شود و پارامتر دوم مدت زمانی را که باید قبل از راه‌اندازی مجدد منتظر بماند، تعیین می‌کند.

برای تست رفتار خرابی، فرآیند MySQL را با سیگنال kill -9 متوقف کنید. در این مثال، PID اصلی برابر با 851 است؛ این شماره را با PID خود جایگزین کنید:

ps -ef | grep mysql
sudo kill -9 851

حالا چند ثانیه صبر کنید و مجدد وضعیت را چک کنید:

sudo systemctl status mysqld.service

همان‌طور که در پائین می‌بینید، خروجی دستور نشان می‌دهد که سرویس MySQL با یک PID جدید راه‌اندازی شده است (در این مثال، PID جدید برابر با 1513 است). یعنی پس از توقف سرویس، سیستم به‌طور خودکار آن را مجدداً راه‌اندازی کرده است.

 mysqld.service - MySQL 8.0 database server
   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
   Active: active (running) since Fri 2020-12-25 04:47:48 UTC; 55s ago
  Process: 1420 ExecStopPost=/usr/libexec/mysql-wait-stop (code=exited, status=0/SUCCESS)
  Process: 1559 ExecStartPost=/usr/libexec/mysql-check-upgrade (code=exited, status=0/SUCCESS)
  Process: 1476 ExecStartPre=/usr/libexec/mysql-prepare-db-dir mysqld.service (code=exited, status=0/SUCCESS)Process: 1451 ExecStartPre=/usr/libexec/mysql-check-socket (code=exited, status=0/SUCCESS)
 Main PID: 1513 (mysqld)
   Status: "Server is operational"
...

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

sudo vi /etc/systemd/system/multi-user.target.wants/mysqld.service

حالا، برای غیرفعال کردن وظیفه راه‌اندازی مجدد، باید پارامتر Restart را در فایل واحد سرویس MySQL کامنت کنید. برای این کار مراحل زیر را دنبال کنید:

`# Restart=on-failure`

بعد از اینکه تغییرات را اعمال کردید، باید با دستورات زیر، سیستم را مجدداً بارگذاری کرده و سپس سرویس MySQL را دوباره راه‌اندازی کنید تا تغییرات اعمال شوند.

sudo systemctl daemon-reload
sudo systemctl restart mysqld.service

سپس برای پیدا کردن PID اصلی (شماره فرآیند) سرویس MySQL، می‌توانید از دستور زیر استفاده کنید:

sudo systemctl status mysqld.service
Output
. . .
Main PID: 1895 (mysqld)

اگر می‌خواهید فرآیند اصلی MySQL را متوقف کنید، با دستور kill -9، باید ابتدا PID اصلی سرویس را پیدا کنید و سپس آن را متوقف کنید.

به این شکل:

sudo kill -9 1895

در آخر، وضعیت MySQL را بررسی کنید:

sudo systemctl status mysqld.service

خروجی مشابه به این شکل خواهد بود:

mysqld.service - MySQL 8.0 database server
   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
   Active: **failed** (Result: signal) since Fri 2020-12-25 05:07:22 UTC; 1min 14s ago
  Process: 1976 ExecStopPost=/usr/libexec/mysql-wait-stop (code=exited, status=0/SUCCESS)
  Process: 1940 ExecStartPost=/usr/libexec/mysql-check-upgrade (code=exited, status=0/SUCCESS)
  Process: 1895 ExecStart=/usr/libexec/mysqld --basedir=/usr (code=killed, signal=KILL)
  Process: 1858 ExecStartPre=/usr/libexec/mysql-prepare-db-dir mysqld.service (code=exited, status=0/SUCCESS
  Process: 1833 ExecStartPre=/usr/libexec/mysql-check-socket (code=exited, status=0/SUCCESS)
  Main PID: 1895 (code=**killed**, signal=KILL)
   ...

همان‌طور که می‌بینید، وضعیت failed است و سرویس به‌طور اجباری متوقف شده و دلیل آن ارسال سیگنال KILL بوده است.

سعی کنید وضعیت سرویس را چند بار بررسی کنید. هر بار سرویس به‌عنوان failed نمایش داده خواهد شد.

در واقع در این مرحله، ما یک خرابی شبیه‌سازی کردیم که در آن سرویس متوقف شده و دوباره راه‌اندازی نمی‌شود. زیرا به systemd گفته‌ایم پس از توقف غیرمنتظره سرویس، آن را دوباره راه‌اندازی نکند. اگر فایل واحد mysqld.service را ویرایش کرده و پارامتر Restart را فعال کنید، سپس تغییرات را ذخیره کرده، سیستم را مجدداً بارگذاری کنید و سرویس را راه‌اندازی مجدد کنید، عملکرد به حالت عادی بازمی‌گردد.

جمع‌بندی

در این مقاله از لیارا، شما با مفاهیم مدیریت سرویس‌ها در لینوکس و ابزارهایی مانند systemd آشنا شدید. ابتدا نحوه پیکربندی سرویس‌ها برای راه‌اندازی مجدد پس از ریستارت یا خرابی بررسی شد. در این مثال، سرویس MySQL برای راه‌اندازی خودکار پس از خرابی یا ری‌بوت پیکربندی شد. شما یاد گرفتید که چگونه از دستورات systemctl برای بررسی وضعیت سرویس‌ها و مدیریت آن‌ها استفاده کنید. در نهایت، نکات مربوط به تنظیمات Restart و RestartSec در فایل سرویس‌ها را مطرح کردیم که می‌تواند رفتار سرویس‌ها پس از خرابی را کنترل کند. این مقاله به شما کمک می‌کند تا سرویس‌های سیستم خود را به‌طور مؤثری مدیریت کنید.

دستورات پرکاربرد لینوکس

سوالات متداول

1- چگونه می‌توانم سرویس‌ها را در systemd مدیریت کنم؟

برای مدیریت سرویس‌ها در systemd، می‌توانید از دستورات مانند systemctl start <service>, systemctl stop <service>, systemctl restart <service>, systemctl status <service> و systemctl enable <service> استفاده کنید.

2- چگونه می‌توانم سرویس MySQL را طوری تنظیم کنم که پس از ریستارت سیستم خودکار راه‌اندازی شود؟

با استفاده از دستور systemctl enable mysqld می‌توانید سرویس MySQL را طوری تنظیم کنید که پس از ریستارت سیستم به‌طور خودکار شروع به کار کند.

3- اگر سرویس MySQL پس از خرابی راه‌اندازی نشد، چطور می‌توانم آن را دوباره راه‌اندازی کنم؟

برای بررسی و رفع مشکل، ابتدا می‌توانید وضعیت سرویس را با دستور systemctl status mysqld چک کنید و سپس از دستور systemctl restart mysqld برای راه‌اندازی مجدد سرویس استفاده کنید.

4- چگونه می‌توانم سرویس‌ها را برای راه‌اندازی مجدد پس از خرابی پیکربندی کنم؟ با ویرایش فایل واحد سرویس (مانند mysqld.service)، پارامتر Restart=on-failure را تنظیم کنید. این باعث می‌شود که سرویس پس از خرابی به‌طور خودکار راه‌اندازی شود.

5- چگونه می‌توانم زمان تأخیر بین تلاش‌های راه‌اندازی مجدد سرویس‌ها را تنظیم کنم؟

می‌توانید از پارامتر RestartSec در فایل واحد سرویس استفاده کنید تا زمان تأخیر بین تلاش‌های راه‌اندازی مجدد را تنظیم کنید. به‌عنوان مثال، RestartSec=5 یعنی سرویس پس از 5 ثانیه دوباره راه‌اندازی خواهد شد.

6- چگونه می‌توانم سرویس MySQL را از حالت failed خارج کنم؟

پس از خرابی، سرویس را با دستور systemctl restart mysqld راه‌اندازی مجدد کنید. اگر سرویس همچنان با مشکل مواجه است، وضعیت آن را با systemctl status mysqld بررسی کرده و خطاها را بررسی کنید.