اجرای خودکار اسکریپت Python در Linux


۳۰ بهمن ۱۳۹۹
اجرای خودکار اسکریپت python در linux

اسکریپت‌های زمانبندی شده یک ضرورت مطلق برای اجرای فرایندهایی مانند جمع‌آوری اطلاعات برای هوش مصنوعی یا انتشار خبرنامه‌های هفتگی وبلاگ‌ است. بخش قابل توجهی از فرایند‌های قابل برنامه‌ریزی در سیستم‌عامل Linux میزبانی و توسط اسکریپت‌های Python اداره می‌شوند. در این مقاله قصد داریم تا با استفاده از Cron در Linux یک اسکریپت Python را با زمانبندی مشخصی اجرا و خروجی آن را در یک فایل ذخیره کنیم.

دستورات این مقاله مختص توزیع‌های Fedora به‌ویژه CentOS است. بااین‌حال فرایند نصب Cron در اکثر توزیع‌های محبوب یکسان است بنابراین بدون نگرانی می‌توانید به مطالعه‌ی ادامه‌ی مقاله بپردازید.

نصب Cron

به احتمال زیاد Cron از قبل بر روی سیستم‌عامل Linux شما نصب شده است. برای مشاهده فرایند‌های ثبت شده در Cron می‌توانید Terminal را باز کرده و دستور زیر را اجرا کنید:

crontab -l

اگر چیزی در خروجی نمایش داده نمی‌شود، نگران نباشید. همچنین اگر Cron را بر روی سیستم‌عامل خود نصب ندارید می‌توانید با استفاده از دستورهای زیر، به نسبت توزیعی که از آن استفاده می‌کنید این ابزار را نصب کنید:

اجرای Crond در Boot سیستم‌عاملفعال کردن اجرای Crond در Boot سیستم‌عاملدستور نصب ابزار Cronتوزیع Linux
chkconfig crond onsystemctl enable crondyum install vixie-cronCentOS 6
chkconfig crond onsystemctl enable crondyum install cronie+CentOS 7
chkconfig crond onsystemctl enable cronddnf install cronie cronie-anacron+Fedora 22
update-rc.d cron defaultssystemctl enable crondsudo apt-get install cronDebian

پیاده‌سازی اسکریپت Python

برای پیاده‌سازی اسکریپت Python یک پوشه به‌دلخواه خود ایجاد کنید. سپس فایلی با نام datetimer.py ایجاد کرده و کدهای زیر را در آن قرار دهید:

from datetime import datetime
print(datetime.now())

این اسکریپت زمان را به ما نمایش می‌دهد و مسیری که ما برای آن انتخاب کرده‌ایم /home/test است. همچنین مطمئن شوید که Python را بر روی سیستم خود نصب کرده باشید یا می‌توانید با مطالعه‌ی مقاله‌ی آموزش نصب Python، مفسر این زبان برنامه‌نویسی را بر روی سیستم‌عامل خود نصب کنید.

در حالت ایده‌آل بایستی یک Environment برای توسعه‌ی پژوه‌های Python پیکربندی کنید. به‌همین منظور با مطالعه‌ی مقاله‌ی آموزش نصب و استفاده از Virtual environment در Python اطلاعات بیشتری در این زمینه کسب خواهید کرد.

در هر صورت اگر از یک Environment استفاده می‌کنید مطمئن شوید که آن را active کرده باشید در غیر این صورت فقط Terminal را باز کرده و دستور زیر را اجرا کنید:

which python
# or 'which python3'

دستور فوق مسیر نصب مفسر Python را به ما نشان می‌دهد که در مرحله‌ی بعد، از آن برای اجرای اسکریپت استفاده خواهیم کرد.

زمانبندی اسکریپت با استفاده از Cron در Linux

زمانبندی اسکریپت با استفاده از Cron در Linux می‌تواند کمی گیج کننده به‌نظر برسد اما سعی می‌کنیم با توضیحات بیشتر مفاهیم پایه‌ای مورد نیاز را به شما آموزش دهیم تا درک کاملی از این فرایند پیدا کنید. در قدم اول Terminal سیستم‌عامل خود را باز کرده و دستور زیر را اجرا کنید:

crontab -e

با اجرای دستور فوق، فایلی باز می‌شود که می‌توانید فرایندهای مورد نیاز خود را در هر خط از آن فایل، زمانبندی و برنامه‌ریزی کنید. در حال حاضر احتمال خالی بودن این فایل بسیار زیاد است و شاید یک سری محتوای کامنت شده را مشاهده کنید چون هنوز هیچ فرایندی زمانبندی شده‌ای در Cron ثبت نشده است.

اگر برای اولین بار است که دستور فوق را اجرا می‌کنید از شما خواسته می‌شود تا یکی از ویرایشگرهای متنی موجود در سیستم‌عامل را به‌صورت پیش‌فرض برای ایجاد تغییرها انتخاب کنید که ما در این آموزش از Vim استفاده خواهیم کرد.

اگر شما هم Vim را به‌عنوان ویرایشگر پیش‌فرض انتخاب کرده باشید بایستی حرف i را از روی کیبورد فشار داده تا وضعیت ویرایشگر به حالت insert تغییر کند و قادر باشید فرایند خودکار مورد نیاز خود را به‌صورت زیر تعریف کنید:

*/5 * * * * /usr/bin/python3 /home/test/datetimer.py >> /home/test/cron.log 2>&1

برای ذخیره فایل نیز بایستی ESC را از روی کیبورد فشار داده و :wq! را تایپ کنید و سپس کلید Enter را فشار دهید تا تغییرها در آن فایل اعمال شوند. همچنین در ادامه توضیح خواهیم داد که هر بخش از کدهای بالا چه عملکردی دارند.

بخش اول یعنی */5 * * * *، پنج واحد زمانی است که می‌توانیم آن‌ها را نسبت به نیاز خودمان تنظیم کنیم:

<minutes> <hours> <day-of-month> <month> <day-of-week>

Symbolهایی که می‌توانیم در این الگوی زمانی استفاده کنیم به شرح زیر هستند:

  • *: این Symbol را می‌توان به‌معنای every دانست. برای مثال اگر از این Symbol در واحد زمانی minutes استفاده کنید یعنی هر دقیقه.
  • ,: این Symbol را می‌توان یک separator دانست. برای مشخص کردن چندین مقدار به‌طور هم‌زمان از , استفاده خواهیم کرد. برای مثال اگر بخواهیم یک فرایند در روز اول ژانویه و یک بار دیگر در اول مارس اجرا شود می‌توان الگوی زمانی را اینگونه 0 12 1 1,3 * تعریف کرد.
  • -: این Symbol را می‌توان برای تعریف یک محدوده‌ی زمانی استفاده کرد. مثلا اگر بخواهیم فرایندی در بازه‌ی زمانی ظهر دوشنبه تا جمعه هر ماه اجرا شود بایستی الگوی زمانی را به‌صورت 0 12 * * 1-5 تعریف کرد.
  • /: برای تعریف فرایندهای تکرار شونده و مرحله‌ای می‌توان از این Symbol استفاده کرد. برای مثال اگر بخواهیم فرایند ما هر پنج دقیقه اجرا شود از الگوی */5 * * * * استفاده خواهیم کرد.

ممکن است به‌خاطر سپردن همه‌ی این نکته‌ها بسیار دشوار باشد به‌همین دلیل توصیه می‌شود از سایت crontab guru استفاده کنید.

بخش دوم یعنی /usr/bin/python3 /home/test/datetimer.py دستوری است که برای اجرای اسکریپت استفاده خواهیم کرد.

بخش سوم یعنی <scheduler> <command> >> /home/test/cron.log 2>&1 به ما کمک می‌کند تا خروجی اسکریپت را در فایل cron.log ذخیره کنیم. قسمت چالش برانگیز این بخش را می‌توان 2>&1 دانست که 2 خطاهای دریافت شده برنامه است و به &1 یعنی فایل cron.log ریدایرکت می‌شود.

پیکربندی و راه‌اندازی Cron

Systemctl یک سرویس Linux است که تمام فرایند‌های درحال اجرا در پس‌زمینه‌ی سیستم‌عامل را کنترل می‌کند. حال ما در نظر داریم تا Cron را به‌عنوان یک فرایند، در پس‌زمینه‌ی سیستم‌عامل اجرا کنیم. اولین چیزی که باید بررسی کنیم این است که آیا پروسه‌ی Cron در حال اجرا است یا خیر؟ بنابراین Terminal سیستم‌عامل خود را باز کرده و دستور زیر را اجرا کنید:

systemctl status crond

اگر در خروجی دستور بالا حالت Active یا همان Runnig را مشاهده کردید یعنی فرایند Cron در حال اجرا است. بااین‌حال، برای شروع فرایند‌ خودکار اجرای اسکریپت Python بایستی Cron را مجددا راه‌اندازی کرده یا در صورت غیرفعال بودن، آن را فعال کنیم. برای راه‌اندازی مجدد می‌توانید دستور زیر را اجرا کنید:

sudo systemctl restart crond

و برای فعال کردن این فرایند می‌توانید restart را با start جایگزین کرده و دستور را اجرا کنید. با اجرای دستور فوق، وضعیت فرایند Cron مجددا در Console برای شما چاپ می‌شود.

حال با اجرای مجدد سرویس crond، خروجی اسکریپت datetimer.py در فایل cron.log در مسیر /home/test ذخیره می‌شود که می‌توانید با اجرای دستور زیر خروجی‌های ثبت شده را مشاهده کنید:

cat /home/test/cron.log

جمع‌بندی

امیدواریم این مقاله در برنامه‌ریزی و خودکارسازی فرایندهای مورد نیاز شما در سیستم‌عامل Linux به کمک Cron مفید بوده باشد. همچنین می‌توانید از این آموزش برای تعریف طیف گسترده‌ای از فرایند‌ها در پس‌زمینه‌ی سیستم‌عامل استفاده کنید.

منبع: https://medium.com/better-programming/scheduling-python-scripts-on-linux-fa0d28a8f915

برچسب‌ها:

خدمات رایگان لیارا

۲.۵ گیگابایت فضای ذخیره‌سازی ابری رایگان

۲.۵ گیگابایت Object Storage سازگار با پروتکل S3 با دیسک‌های SSD به‌صورت رایگان دریافت کنید.

هاست رایگان برای دیتابیس‌

دیتابیس‌های MariaDB، PostgreSQL و Redis را فقط با یک کلیک و به‌صورت رایگان تهیه کنید.

سرویس DNS رایگان

به سادگی دامنه‌تان را اضافه کنید و به صورت رایگان رکورد‌های آن را مدیریت کنید.

۱۰۰ هزار تومان اعتبار اولیه

بعد از ثبت نام در لیارا مبلغ ۱۰۰ هزار تومان اعتبار هدیه دریافت می‌کنید که با توجه به ساعتی بودن هزینه سرویس‌ها، می‌توانید تمامی خدمات پولی را برای چندین هفته رایگان استفاده کنید.

ارسال ۱۰۰ ایمیل تراکنشی رایگان در هر ماه

در سرویس ایمیل لیارا شما می‌توانید تا ۱۰۰ ایمیل رایگان در هر ماه ارسال کنید و فقط برای بیش از آن هزینه پرداخت کنید. (به‌همراه دسترسی SMTP)

هاست رایگان برای انواع وبسایت

تفاوتی ندارد برای وبسایت خود از Node استفاده می‌کنید یا Laravel و Django، در لیارا می‌توانید به صورت کاملا رایگان آن را میزبانی کنید.

توسعه‌دهندگان درباره‌ی ما چه می‌گویند

تجربه کار باliara_cloud@امروز خیلی خوب بود. یکی از سرویس هام رو منتقل کردم روش و راضیم. انقد سریع و جذاب کارم راه افتادم اصن باورم نمیشد! برعکس سرویس های PaaS دیگه با اون همه پیچیدگیشون. دمتون گرم
...

MohammadReza
liara testimonial
keikaavousi

بعد از بسته شدن @fandoghpaas و ناراحتی همه‌مون از اینکه یه سرویس خوب و صادق نمی‌تونه از پس هزینه‌ها بر بیاد، سرویسم رو منتقل کردم به پاس لیارا (https://liara.ir @liara_cloud) . تجربه راحت و خوب. تفاوت‌هایی داشت که کمی کار می‌خواست ولی تا الان کاملا راضی.

jadi
liara testimonial
jadi

یه خسته نباشید باید به تصمیمliara_cloud@بگم،
بعد از چندین روز سرکله زدن با سرویس های مشابه بالاخره تصمیم گرفتم لیارا رو امتحان کنم و باور نمیشه ۱۰ دقیقه بیشتر وقت نبرد،
دمتون گرم.

Arch
liara testimonial
EbadiDev

واسه سرویس PaaS با اختلاف لیارا بهترین رابط کاربری داره و یکی از مزیت‌های سرویس دیتابیس‌شون اینه که خودشون به صورت دوره‌ای بکآپ میگیرن.
...

Ali Najafi
liara testimonial
me_ali_najafi

یکی از کارهای خوبی که جدیداً میکنم اینه که یه دیتابیس روی لیارا میسازم و به پروژه وصل میکنم اینطوری هم خونه و هم محل کار دیتابیس بروز رو دارم و راحت میتونم ادامه بدم کار روliara_cloud@

Navid
liara testimonial
1navid

عاشقliara_cloud@شدم درسته در حد AWS نیست ولی خب تجربه خوبی واسه پروژه های داخل ایران ارائه میده، میتونم رو CD هم اجراش کنم

Amir H Shekari
liara testimonial
vanenshi

همراه شما هستیم

در خصوص سفارش یا استفاده از سرویس‌ها سوالی دارید؟
تلفن واحد فروش:
۰۲۵-۳۳۵۵۷۶۱۹ (روزهای کاری ۹ الی ۱۷)
تلفن واحد فروش: ۳۳۵۵۷۶۱۹-۰۲۵ (روزهای کاری ۹ الی ۱۷)