زمانی که میخواین پروژه ای رو انجام بدین باید چند تا فاکتور کلی رو همیشه درنظر داشته باشین.برای مثال باید تا حدی که ممکن بود سرعت رو بالا ببرید. روی امنیت کار کنید و…
چند وقت پیش پروژه ای (تحت وب)داشتم که مجبور شدم کلی کد بنویسم که کمی هم به سرور فشار میاورد و باعث افت کیفیت میشد. بعدها که کمی جستجو کردم متوجه شدم میتونم با چند خط کد و یک فایل ساده bash (به اصطلاح اسکریپت init) میتونم همون کار رو با سرعت و کیفیت خیلی بیشتر انجام بدم.
اسکریپت های init در /etc/init.d ذخیره میشن. داخل این مسیر شما میتونین تمام سرویس هاتون رو ببینید.
با استفاده از اسکریپت init زیر میتونین یک اسکریپت پایتون(و یا حتی یک اسکریپت پرل) رو در هنگام بوت بدون مشکل اجرا کنید. سرویس ها به صورت daemons اجرا میشن. کسانی که با پایتون آشنایی دارند میدونن که این کار در خود پایتون به نسبت سخت تر هستش(برای مثال اینجا و اینجا رو مشاهده کنید). بجای اینکار میتونیم از امکان خود لینوکس مستقیم استفاده کنیم( فرمان start-stop-daemon ) و هر برنامه ای رو که خواستیم به راحتی در زمینه اجرا کنیم :
#!/bin/sh
### BEGIN INIT INFO
# Provides: myservice
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Put a short description of the service here
# Description: Put a long description of the service here
### END INIT INFO
# سه خط بعدی رو متناسب با اسکریپت خودتون تغییر بدین
DIR=/usr/local/bin/myservice
DAEMON=$DIR/myservice.py
DAEMON_NAME=myservice
# خط بعد مشخص میکنه که فایل به عنوان کدوم کاربر اجرا بشه.
# گذاشتن کاربر به عنوان روت توصیه نمیشه ولی بعضی مواقع لازم هستش
DAEMON_USER=root
# آیدی پردازش اینجا ذخیره میشه
PIDFILE=/var/run/$DAEMON_NAME.pid
. /lib/lsb/init-functions
do_start () {
log_daemon_msg "Starting system $DAEMON_NAME daemon"
start-stop-daemon --start --background --pidfile $PIDFILE --make-pidfile --user $DAEMON_USER --chuid $DAEMON_USER --startas $DAEMON
log_end_msg $?
}
do_stop () {
log_daemon_msg "Stopping system $DAEMON_NAME daemon"
start-stop-daemon --stop --pidfile $PIDFILE --retry 10
log_end_msg $?
}
case "$1" in
start|stop)
do_${1}
;;
restart|reload|force-reload)
do_stop
do_start
;;
status)
status_of_proc "$DAEMON_NAME" "$DAEMON" && exit 0 || exit $?
;;
*)
echo "Usage: /etc/init.d/$DAEMON_NAME {start|stop|restart|status}"
exit 1
;;
esac
exit 0
تغییرات در اسکریپت init :
خط ۱۴ و ۱۵ مشخص میکنه که کجا باید فایل پایتون رو پیدا کنه. در این مورد من گفتم که یک فولدری به اسم /usr/local/bin/myservice وجود داره و فایل myscript.py درون آن قرار دارد(به این صورت میتونین فایل های دیگه ای رو هم داخل دایرکتوری مورد نظر قرار بدین که کار سختی نیست).
در خط ۱۶ نامی رو مشخص میکنیم که بعدا با همین نام سرویس رو برای اجرا یا توقف صدا میزنیم.
در خط ۲۰ باید مشخص کنیم که اسکریپت با چه عنوانی اجرا بشه.من اینجا کاربر رو root گذاشتم که معمولا کار درستی نیست ولی بعضی مواقع لازم هستش. اگر کاربری با نام myusername دارین میتونین به جای root از نام یوزرتون که همون myusername هستش استفاده کنید.
استفاده از اسکریپت init :
برای اینکه بتونین از اسکریپت init استفاده کنید, اسکریپت پایتون خودتون رو در جایی که میخواین قرار بدین (یادتون نره آدرس رو تغییر بدین در اسکریپ init). مطمئن بشین که سطح دسترسی فایل پایتون و همچنین فایل bash اجرا شدنی یعنی ۷۵۵ باشه. باید به کامپیوتر بگین که این فایل یک فایل پایتون هستش و باید با پایتون اجرا بشه (برای مثال باید در خط اول e.g. #!/usr/bin/env python رو قرار بدین). فایل رو داخل /etc/init.d کپی کنید. برای مثال میتونین از دستور sudo cp myservice.sh /etc/init.d استفاده کنید. بازم میگم که مطمئن شوید فایل دسترسی اجرا شدن رو داشته باشد.
حالا باید قادر باشین که اسکریپت پایتونتون رو با دستور sudo /etc/init.d/myservice.sh start اجرا کنید.
میتونین با دستور sudo /etc/init.d/myservice.sh status چک کنین که سرویس در حال اجرا می باشد یا خیر.
میتونین با دستور sudo /etc/init.d/myservice.sh stop سرویس رو متوقف کنید.
البته میتونین به جای /etc/init.d فقط از service استفاده کنید.
کار انجام شده ولی برای اینکه بخواین در یک زمان درستی اسکریپت اجرا بشه باید دستور sudo update-rc.d myservice.sh رو وارد کنید.
چند وقت پیش پروژه ای (تحت وب)داشتم که مجبور شدم کلی کد بنویسم که کمی هم به سرور فشار میاورد و باعث افت کیفیت میشد. بعدها که کمی جستجو کردم متوجه شدم میتونم با چند خط کد و یک فایل ساده bash (به اصطلاح اسکریپت init) میتونم همون کار رو با سرعت و کیفیت خیلی بیشتر انجام بدم.
اسکریپت های init در /etc/init.d ذخیره میشن. داخل این مسیر شما میتونین تمام سرویس هاتون رو ببینید.
با استفاده از اسکریپت init زیر میتونین یک اسکریپت پایتون(و یا حتی یک اسکریپت پرل) رو در هنگام بوت بدون مشکل اجرا کنید. سرویس ها به صورت daemons اجرا میشن. کسانی که با پایتون آشنایی دارند میدونن که این کار در خود پایتون به نسبت سخت تر هستش(برای مثال اینجا و اینجا رو مشاهده کنید). بجای اینکار میتونیم از امکان خود لینوکس مستقیم استفاده کنیم( فرمان start-stop-daemon ) و هر برنامه ای رو که خواستیم به راحتی در زمینه اجرا کنیم :
#!/bin/sh
### BEGIN INIT INFO
# Provides: myservice
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Put a short description of the service here
# Description: Put a long description of the service here
### END INIT INFO
# سه خط بعدی رو متناسب با اسکریپت خودتون تغییر بدین
DIR=/usr/local/bin/myservice
DAEMON=$DIR/myservice.py
DAEMON_NAME=myservice
# خط بعد مشخص میکنه که فایل به عنوان کدوم کاربر اجرا بشه.
# گذاشتن کاربر به عنوان روت توصیه نمیشه ولی بعضی مواقع لازم هستش
DAEMON_USER=root
# آیدی پردازش اینجا ذخیره میشه
PIDFILE=/var/run/$DAEMON_NAME.pid
. /lib/lsb/init-functions
do_start () {
log_daemon_msg "Starting system $DAEMON_NAME daemon"
start-stop-daemon --start --background --pidfile $PIDFILE --make-pidfile --user $DAEMON_USER --chuid $DAEMON_USER --startas $DAEMON
log_end_msg $?
}
do_stop () {
log_daemon_msg "Stopping system $DAEMON_NAME daemon"
start-stop-daemon --stop --pidfile $PIDFILE --retry 10
log_end_msg $?
}
case "$1" in
start|stop)
do_${1}
;;
restart|reload|force-reload)
do_stop
do_start
;;
status)
status_of_proc "$DAEMON_NAME" "$DAEMON" && exit 0 || exit $?
;;
*)
echo "Usage: /etc/init.d/$DAEMON_NAME {start|stop|restart|status}"
exit 1
;;
esac
exit 0
تغییرات در اسکریپت init :
خط ۱۴ و ۱۵ مشخص میکنه که کجا باید فایل پایتون رو پیدا کنه. در این مورد من گفتم که یک فولدری به اسم /usr/local/bin/myservice وجود داره و فایل myscript.py درون آن قرار دارد(به این صورت میتونین فایل های دیگه ای رو هم داخل دایرکتوری مورد نظر قرار بدین که کار سختی نیست).
در خط ۱۶ نامی رو مشخص میکنیم که بعدا با همین نام سرویس رو برای اجرا یا توقف صدا میزنیم.
در خط ۲۰ باید مشخص کنیم که اسکریپت با چه عنوانی اجرا بشه.من اینجا کاربر رو root گذاشتم که معمولا کار درستی نیست ولی بعضی مواقع لازم هستش. اگر کاربری با نام myusername دارین میتونین به جای root از نام یوزرتون که همون myusername هستش استفاده کنید.
استفاده از اسکریپت init :
برای اینکه بتونین از اسکریپت init استفاده کنید, اسکریپت پایتون خودتون رو در جایی که میخواین قرار بدین (یادتون نره آدرس رو تغییر بدین در اسکریپ init). مطمئن بشین که سطح دسترسی فایل پایتون و همچنین فایل bash اجرا شدنی یعنی ۷۵۵ باشه. باید به کامپیوتر بگین که این فایل یک فایل پایتون هستش و باید با پایتون اجرا بشه (برای مثال باید در خط اول e.g. #!/usr/bin/env python رو قرار بدین). فایل رو داخل /etc/init.d کپی کنید. برای مثال میتونین از دستور sudo cp myservice.sh /etc/init.d استفاده کنید. بازم میگم که مطمئن شوید فایل دسترسی اجرا شدن رو داشته باشد.
حالا باید قادر باشین که اسکریپت پایتونتون رو با دستور sudo /etc/init.d/myservice.sh start اجرا کنید.
میتونین با دستور sudo /etc/init.d/myservice.sh status چک کنین که سرویس در حال اجرا می باشد یا خیر.
میتونین با دستور sudo /etc/init.d/myservice.sh stop سرویس رو متوقف کنید.
البته میتونین به جای /etc/init.d فقط از service استفاده کنید.
کار انجام شده ولی برای اینکه بخواین در یک زمان درستی اسکریپت اجرا بشه باید دستور sudo update-rc.d myservice.sh رو وارد کنید.