آیا هنوز به rc.local نیاز دارید؟
در این راهنما گامبهگام یاد میگیریم چگونه فایل سنتی rc.local را در توزیعهای متداول لینوکس مثل ウブントゥ、 CentOS そして AlmaLinux فعال کرده و اسکریپتها یا دستورات مورد نیاز را هنگام بوت اجرا کنیم.
اگرچه システムド بهعنوان init پیشفرض رایج شده است، rc.local هنوز برای اجرای سریع و سادهٔ اسکریپتهای کوتاه هنگام بوت مفید است. در ادامه روشها، مثالها، نکات امنیتی و جایگزینهای مدرن آورده شدهاند.
فعالسازی rc.local در Ubuntu (18.04، 20.04، 22.04 و بالاتر)
در اوبونتوهای جدید که از システムド استفاده میکنند میتوان rc.local را به صورت زیر فعال کرد. مراحل کلی شامل ایجاد فایل، تنظیم مجوز و ایجاد/فعالسازی یک unit برای سازگاری با systemd است.
گامهای کلی
- ایجاد فایل /etc/rc.local و افزودن شِبانگ و دستورات مورد نظر.
- دادن مجوز اجرایی به فایل.
- ایجاد یا فعالسازی unit مربوط به rc.local در systemd (در صورت نبود).
- بارگذاری، فعالسازی و بررسی وضعیت سرویس.
مثال یک فایل نمونه /etc/rc.local (همیشه در انتها exit 0 قرار دهید):
#!/bin/bash
# Example: start Docker container named myapp
docker start myapp || docker run -d --name myapp myimage
# simple sysctl
/sbin/sysctl -w net.ipv4.ip_forward=1
exit 0سپس مجوز را تنظیم کنید:
sudo chmod +x /etc/rc.localاگر unit مربوطه وجود ندارد آن را بسازید:
sudo tee /etc/systemd/system/rc-local.service > /dev/null <<'EOF'
[Unit]
Description=/etc/rc.local Compatibility
ConditionPathExists=/etc/rc.local
After=network.target
[Service]
Type=forking
ExecStart=/etc/rc.local start
TimeoutSec=0
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
EOFو در نهایت:
sudo systemctl daemon-reload
sudo systemctl enable rc-local.service
sudo systemctl start rc-local.service
sudo systemctl status rc-local.service
sudo journalctl -u rc-local.service -b
فعالسازی rc.local در CentOS 7/8 و AlmaLinux 8/9
توزیعهای مبتنی بر RHEL مسیرهای متفاوتی دارند؛ مسیر سنتی معمولاً /etc/rc.d/rc.local است. مراحل کلی مشابه اوبونتو است اما به مسیر و نکات SELinux توجه کنید.
مسیرهای معمول
- /etc/rc.d/rc.local مسیر سنتی در RHEL/CentOS است.
- در برخی سیستمها ممکن است لینک /etc/rc.local وجود داشته باشد.
گامهای فعالسازی (CentOS / AlmaLinux)
ایجاد/ویرایش فایل:
sudo nano /etc/rc.d/rc.local
#!/bin/bash
# Example: mount NFS or start a container
mount -a
/usr/bin/my-startup-script.sh &
exit 0مجوز اجرایی:
sudo chmod +x /etc/rc.d/rc.localدر صورت نبودن unit آن را بسازید:
sudo tee /etc/systemd/system/rc-local.service > /dev/null <<'EOF'
[Unit]
Description=/etc/rc.d/rc.local Compatibility
ConditionPathExists=/etc/rc.d/rc.local
After=network.target
[Service]
Type=forking
ExecStart=/etc/rc.d/rc.local start
TimeoutSec=0
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
EOFو سپس:
sudo systemctl daemon-reload
sudo systemctl enable rc-local.service
sudo systemctl start rc-local.service
sudo systemctl status rc-local.service
sudo journalctl -u rc-local.service -bsudo restorecon -v /etc/rc.d/rc.local
# or temporarily change context
sudo chcon -t bin_t /etc/rc.d/rc.localهمچنین بهتر است در اسکریپتها از مسیرهای مطلق مانند /usr/bin/docker استفاده کنید تا وابستگی به PATH کمتر شود.
نمونههای عملی و نکات کاربردی
مثال — اجرای اسکریپت راهانداز Docker
#!/bin/bash
# start redis container at boot
/usr/bin/docker run -d --name redis-cache --restart unless-stopped redis:6
exit 0注記: استفاده از گزینه –restart unless-stopped باعث میشود Docker مدیریت بازگشت کانتینر را بر عهده بگیرد.
مثال — mount شبکهای قبل از اجرای سرویس
اگر اسکریپت نیازمند mount شدن NFS است، unit systemd را با وابستگیهای مناسب تغییر دهید:
[Unit]
After=network-online.target remote-fs.target
Wants=network-online.target remote-fs.targetاجرای اسکریپت طولانی یا سرویس دائمی — راهِ بهتر
برای کارهای طولانی یا سرویسمحور بهتر است یک unit اختصاصی systemd بسازید تا از امکاناتی مانند Restart و مانیتورینگ استفاده کنید:
sudo tee /etc/systemd/system/myjob.service > /dev/null <<'EOF'
[Unit]
Description=My Long Running Job
After=network-online.target
[Service]
Type=simple
User=myuser
ExecStart=/usr/local/bin/my-long-script.sh
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOFsudo systemctl daemon-reload
sudo systemctl enable --now myjob.service
اشکالزدایی رایج
- سرویس در وضعیت failed: から
sudo journalctl -u rc-local.service -bبرای دیدن لاگ استفاده کنید. - پرمیشن: مطمئن شوید فایل اجرایی است (
chmod +x) و شِبانگ در ابتدا وجود دارد. - مسیرهای نسبی: همیشه از مسیرهای مطلق برای باینریها استفاده کنید.
- متغیرهای محیطی: rc.local یک محیط محدود دارد؛ متغیرهایی مثل PATH را صریح تعریف کنید یا مسیر کامل بنویسید.
- SELinux: خطاهای AVC را بررسی کنید و context را تنظیم کنید.
- وابستگیها: اگر اسکریپت به شبکه یا فایلسیستم وابسته است، unit باید After= そして Wants= مناسب داشته باشد.
جایگزینها و بهترین روشها
- systemd unit اختصاصی: برای سرویسها بهترین گزینه است.
- crontab @reboot: برای وظایف ساده کاربرانه مناسب است:
@reboot /usr/local/bin/myscript.sh - cloud-init: در محیطهای ابری برای پیکربندی اولیه مناسب است.
- ابزارهای مدیریت پیکربندی مثل Ansible: برای اعمال تغییرات تکرارشونده و قابل مدیریت کاربرد دارد.
نکات امنیتی و عملیاتی
از اجرای دستورات حساس در rc.local خودداری کنید. بهتر است اسکریپتها با مالکیت مشخص اجرا شوند یا از قابلیت ユーザー= در systemd استفاده شود.
همیشه خروجی اسکریپتها را لاگ کنید و از مجوزهای محدود استفاده نمایید. مثال:/usr/local/bin/myscript.sh >> /var/log/rc.local.log 2>&1
chmod 700 /usr/local/bin/myscript.shبرای محیطهای تولید قبل از اعمال تغییرات در سرورهای مهم، در محیط staging تست انجام دهید.
رابطه این آموزش با خدمات شرکت
خدمات شرکت ما در بیش از 85 لوکیشن جهانی شامل VPS، سرور ابری، سرور گرافیکی (GPU)، سرور اختصاصی و موارد شبکهای این امکان را فراهم میکند که:
- در VPSهای مخصوص ترید یا گیم، اسکریپتهای راهانداز را سریع اجرا کنید.
- در سرورهای GPU از unitهای systemd برای راهاندازی سرویسهای سنگین استفاده کنید تا پس از ریبوت پردازش بهدرستی آغاز شود.
- در سرورهای شبکهای و ضد DDoS، unitهای systemd سفارشی برای اجرای اسکریپتهای شبکهای و iptables بسازید.
- تیم پشتیبانی در موارد SELinux، مسیرهای mount و dependencyها در دسترس است.
جمعبندی و پیشنهادات نهایی
با وجود systemd، rc.local همچنان راهی ساده برای اجرای فرمانهای سفارشی در بوت است، اما برای پایداری و مانیتورینگ بهتر است از unitهای systemd استفاده کنید.
همیشه به مجوزها، SELinux و وابستگی سرویسها توجه داشته باشید و از لاگها برای اشکالزدایی استفاده کنید.
اگر نیاز خاصی دارید (مثلاً اجرای خودکار ربات ترید، آمادهسازی محیط GPU یا پیکربندی شبکه سرور گیم)، تیم فنی ما در لوکیشنهای مختلف آماده راهنمایی است.









