تغییرات اخیر

در اینجا اطلاعیه‌ها، نسخه‌ها و تغییرات جدید لیارا فهرست می‌شوند.

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


۳۰ بهمن ۱۳۹۹

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

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

همین الان، بدون هیچ‌گونه پیچیدگی، هاست Python خود را در کمتر از ۳۰ ثانیه راه‌اندازی کنید.
✅ استقرار سریع و آسان ✅ پشتیبانی از فریم‌ورک‌های مختلف ✅ عملکرد پایدار
خرید هاست Python

آنچه در ادامه خواهید خواند:

  • نصب Cron
  • پیاده‌ سازی اسکریپت Python
  • زمانبندی اسکریپت با استفاده از Cron در Linux
  • پیکربندی و راه‌اندازی Cron
  • سوالات متداول
  • جمع بندی

نصب Cron

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

crontab -l
اجرای خودکار اسکریپت python در linux

اگر چیزی در خروجی نمایش داده نمی‌شود، نگران نباشید. همچنین اگر 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 ریدایرکت می‌شود.

نحوه اتصال به سرور مجازی با استفاده از WebSSH در پایتون Python
WebSSH در پایتون Python

پیکربندی و راه‌ اندازی 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

سوالات متداول

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

چگونه یک اسکریپت Python را با Cron در لینوکس زمان‌ بندی کنیم؟

برای زمان‌بندی اجرای یک اسکریپت Python با Cron، باید مسیر مفسر Python و فایل اسکریپت را در یک دستور crontab قرار دهید.

*/5 * * * * /usr/bin/python3 /home/user/script.py

چگونه خروجی اجرای Cron را در یک فایل لاگ ذخیره کنیم؟

با استفاده از علامت‌های ریدایرکت در انتهای دستور Cron می‌توانید خروجی را ذخیره کنید.

>> /path/to/logfile.log 2>&1

چگونه بفهمیم Cron روی سیستم لینوکس فعال است یا خیر؟

برای بررسی وضعیت Cron، دستور زیر را در ترمینال اجرا کنید.

systemctl status crond

چرا اسکریپت Python در Cron اجرا نمی‌شود؟

  • فعال نبودن Cron
  • اشتباه بودن مسیر Python یا اسکریپت
  • عدم وجود دسترسی‌های لازم
  • فعال نبودن virtualenv
چگونه یک اسکریپت پایتون را در اوبونتو اجرا کنیم
اسکریپت پایتون

جمع‌ بندی

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

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

به اشتراک بگذارید

برچسب‌ها: