نحوه پیکربندی لینوکس برای شروع خودکار بعد از خرابی یا راهاندازی مجدد
۳۰ اسفند ۱۴۰۳
در این آموزش، از دستور 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
بررسی کرده و خطاها را بررسی کنید.