ابزارها یا برنامههایی که اسکریپتهای راهاندازی لینوکس نامیده میشوند، هر بار که رایانه شما راهاندازی میشود، توسط هسته لینوکس اجرا میشوند.
پس از راهاندازی سیستم، کاربران میتوانند از هر دستور اجرای لینوکس در هنگام راهاندازی برای پیکربندی برنامهها یا انجام وظایف خاص استفاده کنند.
برای اجرای اسکریپت در هنگام راهاندازی لینوکس یا دستور، میتوانید از ۵ روش مختلف استفاده کنید:
۱. فایل /etc/rc.d/rc.local (rc.local)
۲. کرون جاب (Cron Job)
۳. واحد سرویس systemd
۴. init.d
۵. .bashrc یا .bash_profile
۶. Upstart
۷. برنامههای راهاندازی
پس از خرید سرور اختصاصی لینوکس و انتخاب توزیع مورد نظر خود، یکی از فعالیتهای جالب این است که شما این گزینه را دارید که به سیستم عامل دستور دهید تا در هنگام راهاندازی، ورود به سیستم و خروج از سیستم، وظایف خاصی را انجام دهد.
۱. نصب و استفاده از فایل rc.local برای اجرای خودکار اسکریپت در هنگام راهاندازی در لینوکس
یک دنباله از اسکریپتهای rc در طول هر سطح اجرا برای آمادهسازی سیستم برای استفاده یا خاموش شدن اجرا میشود.
در توزیعهای مدرن لینوکس، ممکن است فایل اسکریپت rc.local به طور پیشفرض در دسترس نباشد، بنابراین باید آن را به صورت دستی پیکربندی کنید.
به مدیر سیستم اجازه داده میشود تا اسکریپت rc.local را اجرا کند. در نتیجه، اجرای یک اسکریپت یا دستور به عنوان روت سادهتر است.
ابتدا، یک دستور ساده را به اسکریپتی که در نظر دارید پس از راهاندازی سیستم اجرا شود، اضافه کنید:
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Ensure that the script will "exit 0" on success or any other
# value on error.
#
# To enable or disable this script, just change the execution
# bits.
#
# By default, this script does nothing.
pgrep -x $(teamviewerd) || teamviewerd
exit 0
ما یک خط به اسکریپت اضافه کردیم که دیمون TeamViewer را به محض راهاندازی سیستم اجرا میکند.
توجه داشته باشید که دستوراتی که پس از exit 0 آمدهاند، اجرا نخواهند شد. این مورد گاهی اوقات حتی اگر دستورات اسکریپت معتبر باشند، رخ میدهد.
در آن صورت، باید مجوزهای اجرایی فایل را بررسی کرده و در صورت لزوم آنها را تنظیم کنید.
اگر یک فرآیند ساده systemd با نام “rc-local” ایجاد کنید، میتوانید اسکریپت rc.local را در هنگام راهاندازی اجرا کنید.
برای انجام این کار، یک فایل جدید در /etc/systemd/system/rc-local.service ایجاد کنید و محتویات زیر را در آن قرار دهید:
[Unit]
Description=/etc/rc.local Compatibility
ConditionPathExists=/etc/rc.local
[Service]
Type=forking
ExecStart=/etc/rc.local start
TimeoutSec=0
StandardOutput=tty
RemainAfterExit=yes
SysVStartPriority=99
[Install]
WantedBy=multi-user.target
سپس، پس از ذخیره فایل، باید از systemctl برای فعالسازی این سرویس استفاده کنید.
$ systemctl enable rc.local
پس از فعالسازی سرویس، فایل rc.local را ایجاد کرده و مجوزهای لازم را به آن اعطا کنید.
توجه: این روش همچنین در سیستم systemd کار میکند.
۲. نصب و استفاده از Cron Job برای اجرای اسکریپت در هنگام راهاندازی در لینوکس
یک فایل به نام crontab مجموعهای از دستورات را ارائه میدهد که میتوانند برای اجرای منظم برنامهریزی شوند. وظایفی که ما در این فایل تعریف میکنیم، همان Cron Job ها هستند.
معمولاً یک دیمون cron، که در اکثر توزیعها نصب شده است، آنها را اجرا میکند.
برنامههای cron مختلفی وجود دارد که همگی به یک شیوه عمل میکنند و از همان فرمت crontab استفاده میکنند.
شما باید تصمیم بگیرید که کدام یک را استفاده کنید و چگونه آن را راهاندازی کنید.
برای نصب آن در اوبونتو و دبیان:
apt install cronie
در فدورا و RHEL:
yum install cronie
پس از اتمام نصب، به بررسی آن بپردازید:
$ crond -V
اکنون باید سرویس crond، که در واقع دیمونی است که در هنگام راهاندازی سیستم اجرا میشود، را فعال کنید. بنابراین، تایپ کنید:
# systemctl enable crond
به این ترتیب، میتوانید از این پس Cron Job ها را در crontab برنامهریزی کنید.
یک crontab ساده میتواند شامل یک یا چند خط باشد. هر خط نشاندهنده یک وظیفه روتین است که انجام میشود.
بیایید با استفاده از دستور crontab یک crontab ایجاد کنیم:
$ crontab -e
ابتدا باید یک فایل خالی باشد. برای اجرای آن در هر بار راهاندازی سیستم، از دستورات زیر استفاده کنید:
@reboot pulseaudio -k && pulseaudio
@reboot redshift -c ~/.config/redshift/config.conf
یک ورودی crontab از دو فیلد تشکیل شده است: فیلد زمان و فیلد دستور. فیلد زمان مشخص میکند که چه زمانی دستور مرتبط باید اجرا شود.
ما نماد @reboot را به crontab خود اضافه کردیم تا نشان دهیم که میخواهیم عملیاتها در هنگام راهاندازی سیستم اجرا شوند. دستورات بالا به عنوان کاربران عادی اجرا خواهند شد.
گزینه -e به crontab دستور میدهد تا crontab را برای کاربر فعلی ویرایش کند.
برای ایجاد یک crontab جدید بهویژه برای کاربر روت و اجرای دستورات به عنوان روت، دستور crontab را به عنوان روت اجرا کنید:
$ sudo crontab -e
برای ایجاد یک وظیفه که یک اسکریپت شل را به عنوان روت در هنگام راهاندازی اجرا میکند، تایپ کنید:
@reboot . /root/upgrade-system.sh
اگر میخواهید اسکریپت را در زمان یا بازه زمانی دیگری برنامهریزی کنید، میتوانید @reboot را با زمان یا بازه زمانی خاصی جایگزین کنید.
۳. نصب و استفاده از systemd برای اجرای اسکریپت در هنگام راهاندازی در لینوکس
Systemd مدیر init و سرویس است که توسط اکثر توزیعهای محبوب لینوکس استفاده میشود.
این یک جزء از تمام توزیعهای لینوکس پرکاربرد مانند Fedora، Ubuntu، Mint، Debian و غیره است.
Systemd در هنگام راهاندازی، روش منحصر به فردی برای اجرای اسکریپتهای سفارشی دارد.
برای ایجاد اسکریپت راهاندازی، ابتدا باید یک فایل اسکریپت با دستور(ات) مورد نظر خود برای اجرا در هنگام راهاندازی رایانه داشته باشید.
این فایل بعداً برای اجرا در یک سرویس systemd خاص تعیین خواهد شد.
اکنون یک فایل اسکریپت ایجاد کنید که در واقع یک دیمون اعلان را راهاندازی میکند و مطمئن شوید که این اسکریپت را اجرا میکنید:
pgrep dunst || setsid -f dunst
به محض اینکه اسکریپت شما کامل شد، باید یک سرویس systemd ایجاد کنید که از آن به عنوان منبع استفاده میکند.
بنابراین، ابتدا یک فایل startup.service را در پوشه /lib/systemd/system ایجاد کنید:
$ touch /lib/systemd/system/startup.service
به این ترتیب، میتوانید یک سرویس systemd ایجاد کنید. سپس، سرویس خود را در این فایل تعریف کنید:
[Unit]
Description=Startup Script
[Service]
ExecStart=/root/.local/bin/startup.sh
[Install]
WantedBy=multi-user.target
با تغییر ستون ExecStart، میتوانید مکان اسکریپت راهاندازی خود را مشخص کنید.
پس از اتمام، فایل را ذخیره کنید، سپس سرویس را فعال کنید تا با رایانه ما راهاندازی شود:
# systemctl enable startup.service --now
ما گزینه `–now` را معرفی کردهایم و systemd اکنون این سرویس را فعال و شروع خواهد کرد.
همین روال برای ایجاد چندین سرویس که در هنگام راهاندازی اجرا میشوند و کارکردهای مختلفی دارند، صدق میکند.
برای اجرای اسکریپت در هنگام راهاندازی لینوکس با systemd، باید یک توصیفگر سرویس به نام unit file را در /etc/systemd/system ایجاد کنید:
[Unit]
Description=Reboot message systemd service.
[Service]
Type=simple
ExecStart=/bin/bash /home/ec2-user/reboot_message.sh
[Install]
WantedBy=multi-user.target
این سند به چند بخش تقسیم میشود:
Unit – شامل متادیتای عمومی مانند یک توضیح قابل خواندن برای انسان است.
Service – اطلاعاتی در مورد فرآیند دیمونسازی و دستور برای شروع سرویس ارائه میدهد.
Install – به سرویس اجازه میدهد تا در هنگام راهاندازی لینوکس دستورات را با مدیریت وابستگیها با استفاده از پوشهای که در WantedBy مشخص شده است، اجرا کند.
مرحله بعدی استفاده از systemctl برای فعالسازی سرویس ما و تنظیم مجوزهای فایل به ۶۴۴ است.
$ chmod 644 /etc/systemd/system/reboot_message.service
$ systemctl enable reboot_message.service
۴. استفاده از init.d برای اجرای اسکریپت در هنگام راهاندازی در لینوکس
پوشه /etc/init.d محل اجراییهای چرخه عمر برای سرویسهایی است که سیستم آنها را مدیریت میکند، درست مانند ترتیب rc.local.
با ایجاد یک wrapper مطابق با LSB که سرویس ما را راهاندازی میکند، میتوانید سرویس خود را نیز اضافه کنید:
#! /bin/sh
# chkconfig: 345 99 10
case "$1" in
start)
# Executes our script
sudo sh /home/ec2-user/reboot_message.sh
;;
*)
;;
esac
exit 0
هنگامی که این wrapper با آرگومان start فراخوانی شود، کد ما اجرا خواهد شد.
با این حال، باید یک خط با تنظیم chkconfig را اضافه کنید که سطح اجرای سرویس و اولویت شروع/توقف را مشخص میکند.
پس از اضافه کردن wrapper به پوشه init.d، باید سرویس خود را برای اجرا در هنگام راهاندازی پیکربندی کنید:
$ chkconfig --add service_wrapper.sh
سیستمهای دبیان میتوانند از update-rc.d به عنوان جایگزین استفاده کنند، زیرا دستور chkconfig در آنجا در دسترس نیست:
$ update-rc.d service_wrapper.sh defaults
۵. استفاده از Upstart برای اجرای اسکریپت در هنگام راهاندازی در لینوکس
دیمون Upstart مشکلات مربوط به system V init را کاهش میدهد و امکانات زیادی برای سفارشیسازی ارائه میکند.
Upstart یک معماری انعطافپذیر رویداد-محور را ارائه میدهد و به اسکریپتهای پیچیده برای بارگیری سرویسها در هنگام راهاندازی متکی نیست.
به عنوان مثال، سرویس Upstart زیر باعث اجرای دستور echo در هنگام راهاندازی سیستم میشود.
ابتدا، فایل پیکربندی را با پسوند .conf در پوشه /etc/init ایجاد کنید.
از آنجا که آنها پوشههای جداگانه فایلسیستم لینوکس هستند، آنها را با /etc/init.d اشتباه نگیرید.
$ nano test.conf
description "testing Linux startup commands"
start on runlevel [2345]
stop on runlevel [!2345]
expect fork
respawn
exec echo "This is a test run!"
چگونه به طور خودکار یک اسکریپت را در لینوکس اجرا کنم؟
اجرای خودکار اسکریپت در هنگام راهاندازی لینوکس در زیر توضیح داده شده است:
#!/bin/bash
while [ true ]
do
currentoutput="$(lsusb)"
if [ "$currentoutput" != "$lastoutput" ]
then
echo "" date and Time >> test.log
date +%x_r >> test.log
lastoutput="$(lsusb)"
lsusb >> test.log
fi
sleep 5
done
این اسکریپت خروجی آخرین lsusb را در $lastoutput ذخیره میکند و در صورتی که برابر نباشند، آن را اضافه میکند.
همچنین میتوانید از Systemd برای خودکارسازی اسکریپتها و دستورات لینوکس در هنگام راهاندازی و استفاده از اسکریپت راهاندازی خودکار لینوکس استفاده کنید:
mkdir -p ~/.config/systemd/user
nano ~/.config/systemd/user/update-notifier.service
پس از باز شدن ویرایشگر nano، دستور زیر را وارد کنید:
[unit]
Description=Reminder to Update System
PartOf=graphical-session-target
[Service]
ExecStart=bash -c 'sleep 50; notify-send "Please, Update your System Now"
Type=oneshot
[Install]
WantedBy=graphical-session.target
برای اجرایی کردن آن، دستورات زیر را اجرا کنید:
chmod 644 ~/.config/systemd/user/update-notifier.service
systemctl --user enable update-notifier.service
systemctl --user daemon-reload
reboot
چگونه یک اسکریپت Bash را در هنگام راهاندازی اجرا کنم؟
برای مثال، اگر این فایل /etc/rc.local شما است و شما chmod +x /etc/rc.local را امتحان کردهاید، آنگاه اجرا کنید:
$ cat /etc/rc.local
#!/bin/bash
touch /var/lock/subsys/local
echo "hickory stick"
برای مشاهده این لاگ پس از راهاندازی سیستم خود از طریق باش، اجرا کنید:
$ logger hi
سپس میتوانید آن را در /var/log/messages یا /var/log/syslog یا journal -xef مشاهده کنید.
$ journalctl -xef
برای دریافت خروجی از دستورات در اسکریپت، تایپ کنید:
$ cat /etc/rc.local
#!/bin/bash
touch /var/lock/subsys/local
echo "hickory stick" | logger
اکنون، پس از راهاندازی مجدد:
$ journalctl -xef
شما باید پیام خود را از طریق logger که به /etc/rc.local اضافه کردهاید، در آنجا مشاهده کنید.
در لینوکس Bash ، دو روش برای اجرای اسکریپت وجود دارد:
بررسی مجوزهای اجرایی (بدون Interpreter)
برای استفاده از مجوزهای اجرایی برای اجرای یک اسکریپت باش در لینوکس، از دستور زیر استفاده کنید و your_script.sh را با نام واقعی اسکریپت خود جایگزین کنید:
chmod +x your_script.sh
برای اجرای اسکریپت در هنگام راهاندازی لینوکس، تایپ کنید:
./myscript.sh
استفاده از Interpreter :
هر زبان اسکریپتنویسی یک مفسر دارد که فایلهای اسکریپت را خط به خط اجرا میکند. اگر خطایی وجود داشته باشد، اجرای اسکریپت در همان خط متوقف میشود.
شما میتوانید شل مورد استفاده را برای اسکریپتهای نوشته شده در باش فراخوانی کنید.
اگر یک اسکریپت باش نوشتهاید، میتوانید آن را با تایپ کردن sh یا bash به همراه نام اسکریپت اجرا کنید:
bash your_script.sh
یا
sh your_script.sh
هنگام استفاده از مفسر، نیازی به تغییر مجوزهای فایل نیست. فراموش نکنید که نام واقعی اسکریپت خود را به جای your_script.sh جایگزین کنید.
نتیجهگیری
روشهای اجرای اسکریپت شل در هنگام راهاندازی لینوکس به شما کمک میکند تا مناسبترین روش برای اجرای یک دستور یا اسکریپت در هنگام راهاندازی مجدد یا راهاندازی در لینوکس را پیدا کنید.
اجرای دستور در هنگام راهاندازی لینوکس مزایا و معایبی دارد، و به طور کلی باید از systemd و cron استفاده شود، زیرا در دسترس هستند.
این روش همچنین برای اجرای دستور در هنگام راهاندازی دبیان نیز کار میکند. در نتیجه، rc.local و init.d باید به عنوان راهحلهای جایگزین استفاده شوند.