برنامه‌نویسی

اجرای خودکار اسکریپت 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