منبع اصلی نوشتار زیر در این لینک قرار دارد

اجرای اسکریپت پایتون در زمینه (به عنوان سرویس) در هنگام بوت

زمانی که میخواین پروژه ای رو انجام بدین باید چند تا فاکتور کلی رو همیشه درنظر داشته باشین.برای مثال باید تا حدی که ممکن بود سرعت رو بالا ببرید.روی امنیت کار کنید و…

چند وقت پیش پروژه ای (تحت وب)داشتم که مجبور شدم کلی کد بنویسم که کمی هم به سرور فشار میاورد و باعث  افت کیفیت میشد.بعدها که کمی جستجو کردم متوجه شدم میتونم با چند خط کد و یک فایل ساده 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 رو وارد کنید



برچسب ها : ,

به سیاره لینوکس امتیاز دهید

به اين صفحه امتياز دهيد