اطلاعیه

بستن
هنوز اطلاعیه ای در دست نیست.

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

بستن
X
 
  • فیلتر کردن
  • زمان
  • نمایش
Clear All
پست های جدید

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

    زمانی که میخواین پروژه ای رو انجام بدین باید چند تا فاکتور کلی رو همیشه درنظر داشته باشین.برای مثال باید تا حدی که ممکن بود سرعت رو بالا ببرید. روی امنیت کار کنید و…
    چند وقت پیش پروژه ای (تحت وب)داشتم که مجبور شدم کلی کد بنویسم که کمی هم به سرور فشار میاورد و باعث افت کیفیت میشد. بعدها که کمی جستجو کردم متوجه شدم میتونم با چند خط کد و یک فایل ساده 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 رو وارد کنید.
    آخرین ویرایش توسط Habili; در تاریخ/ساعت 01-13-2020, 06:16 AM.

درباره انجمن منطقه لینوکسی ها

انجمن منطقه لینوکسی ها با هدف ارتقاء سطح علمی کاربران در سطح جهانی و همچنین کمک به بالا بردن سطح علمی عمومی در زمینه های تخصصی فوق پایه گذاری شده است. انجمن منطقه لینوکسی ها از طریق کارشناسان و متخصصان پاسخگوی سوالات گوناگون کاربران مبتدی یا پیشرفته میباشد تا حد امکان تلاش شده که محیطی متنوع و کاربر پسند و به دور از هرگونه حاشیه جهت فعالیت کاربران در این انجمن ایجاد شود. لذا ما به صورت مستمر برای پیشرفت کمی و کیفی محتوی و اطلاعات انجمنمان میکوشیم که این برای ما ارزشمند و حائز اهمیت است. کلیه حقوق،اطلاعات و مقالات در این انجمن متعلق به سایت منطقه لینوکسی ها میباشد، و هرگونه نسخه برداری بدون ذکر منبع مورد پیگرد قانونی خواهد شد.

شبکه های اجتماعی
در حال انجام ...
X