Table of Contents
ایدهٔ کلی زمانبندی اسکریپتها
گاهی میخواهید یک اسکریپت پایتون:
- هر روز در یک ساعت مشخص اجرا شود (مثلاً پشتیبانگیری)
- هر ۱۰ دقیقه یکبار اجرا شود (مثلاً چک کردن یک پوشه)
- فقط یکبار، در یک زمان مشخص آینده اجرا شود
به جای اینکه خودتان هر بار بهصورت دستی اسکریپت را اجرا کنید، میتوانید اجرای آن را «زمانبندی» کنید تا سیستم بهطور خودکار، طبق برنامهٔ شما آن را اجرا کند.
در این بخش، با چند روش رایج برای زمانبندی اسکریپتهای پایتون آشنا میشوید:
- ابزارهای داخلی سیستمعامل (Task Scheduler در ویندوز، cron در لینوکس/macOS)
- اجرای زمانبندیشده داخل خود کد پایتون (با حلقه و
time.sleepیا کتابخانهها)
در این فصل، فرض میکنیم شما بلد هستید یک اسکریپت پایتون بسازید و در ترمینال/کامندپرومت آن را اجرا کنید (مطالب اینها در فصلهای قبلی آمدهاند).
آمادهسازی اسکریپت برای زمانبندی
قبل از زمانبندی، معمولاً بهتر است اسکریپت شما:
- ورودی از کاربر نخواهد (چون قرار است خودکار و بدون حضور شما اجرا شود)
- مسیرهای فایل را بهصورت «کامل» (absolute) استفاده کند یا خودش پوشهٔ کاری را تنظیم کند
- در صورت خطا، پیام مناسب در یک فایل لاگ بنویسد تا بعداً بتوانید بررسی کنید
یک مثال ساده از اسکریپت که فقط تاریخ و زمان فعلی را در یک فایل مینویسد:
import datetime
def log_time():
now = datetime.datetime.now()
with open("log.txt", "a", encoding="utf-8") as f:
f.write(f"اجرا در: {now}\n")
if __name__ == "__main__":
log_time()
حالا هدف ما این است که این فایل، مثلاً log_time.py، طبق برنامهٔ زمانی مشخص اجرا شود.
زمانبندی اسکریپت در ویندوز با Task Scheduler
در ویندوز، ابزار اصلی زمانبندی، Task Scheduler است. ایدهٔ کار:
- یک «وظیفه» (Task) جدید میسازید.
- مشخص میکنید چه زمانی و هر چند وقت یکبار اجرا شود.
- میگویید که این وظیفه، پایتون را با یک اسکریپت خاص اجرا کند.
پیدا کردن مسیر پایتون و اسکریپت
۱. در ترمینال (Command Prompt یا PowerShell) بنویسید:
where pythonخروجی چیزی شبیه این است:
C:\Users\YourName\AppData\Local\Programs\Python\Python312\python.exeاین مسیر را بعداً در Task Scheduler نیاز دارید.
۲. مسیر کامل اسکریپت را هم بدانید، مثلاً:
C:\Users\YourName\projects\log_time.pyساختن یک Task ساده (خلاصهٔ مراحل)
۱. در منوی Start عبارت Task Scheduler را جستوجو و آن را باز کنید.
۲. از سمت راست، روی «Create Basic Task…» کلیک کنید.
۳. یک نام ساده بدهید، مثلاً: LogTimeEveryDay.
۴. در مرحلهٔ Trigger:
- انتخاب کنید
Daily(یاWeekly، یاOne timeو …) - ساعت شروع را مشخص کنید.
- در مرحلهٔ Action، گزینهٔ
Start a programرا انتخاب کنید. - حالا:
- در
Program/scriptمسیرpython.exeرا وارد کنید، مثلاً:
C:\Users\YourName\AppData\Local\Programs\Python\Python312\python.exe - در
Add arguments (optional)نام اسکریپت را بنویسید:
C:\Users\YourName\projects\log_time.py - در
Start in (optional)پوشهٔ اسکریپت را بدون نام فایل بنویسید:
C:\Users\YourName\projects - Finish را بزنید.
از این به بعد، ویندوز در زمان تعیینشده، اسکریپت شما را اجرا میکند.
نکتههای مهم در ویندوز
- اگر اسکریپت شما به مسیرهای نسبی (relative) متکی است، حتماً
Start inرا درست تنظیم کنید. - اگر برنامه نیاز به دسترسیهای خاص دارد (مثلاً نوشتن در پوشههای سیستمی)، ممکن است لازم باشد در تنظیمات پیشرفتهٔ Task، گزینهٔ «Run with highest privileges» را فعال کنید.
- برای تست، میتوانید روی Task کلیک راست کنید و «Run» را بزنید و ببینید
log.txtبهروزرسانی میشود یا نه.
زمانبندی اسکریپت در لینوکس و macOS با cron
در سیستمعاملهای شبهیونیکس (لینوکس و اغلب macOS)، ابزار کلاسیک برای زمانبندی، cron است.
ساختن یک دستور cron
هر کاربر میتواند یک «فایل زمانبندی» به نام crontab داشته باشد. برای ویرایش آن:
crontab -e
برای اولینبار ممکن است از شما بپرسد با کدام ویرایشگر (مثلاً nano)، آن را باز کند.
در این فایل، خطهایی به شکل زیر مینویسید:
* * * * * دستورپنج ستون اول زمان را مشخص میکند:
- دقیقه (۰ تا ۵۹)
- ساعت (۰ تا ۲۳)
- روز ماه (۱ تا ۳۱)
- ماه (۱ تا ۱۲)
- روز هفته (۰ تا ۷، معمولاً ۰ و ۷ هر دو به معنای یکشنبه)
سپس، دستور کامل اجرا میشود؛ مثلاً اجرای پایتون روی اسکریپت شما.
برای مثال، اگر مسیر پایتون و اسکریپت اینها باشند:
- پایتون:
/usr/bin/python3 - اسکریپت:
/home/user/projects/log_time.py
مثال ۱: اجرا هر روز ساعت ۱۰ صبح
0 10 * * * /usr/bin/python3 /home/user/projects/log_time.pyمثال ۲: اجرا هر ۵ دقیقه
*/5 * * * * /usr/bin/python3 /home/user/projects/log_time.pyمثال ۳: اجرا یکبار در ماه، روز اول، ساعت ۳ شب
0 3 1 * * /usr/bin/python3 /home/user/projects/log_time.pyبعد از ذخیره و خروج از ویرایشگر، cron بهطور خودکار از این تنظیمات استفاده میکند.
نکتههای مهم در cron
- مسیرها باید کامل (absolute) باشند؛ روی
~/و مسیرهای نسبی حساب نکنید. - محیطی که cron میبیند معمولاً سادهتر از محیطی است که شما در ترمینال دارید؛ پس اگر به متغیرهای محیطی خاص نیاز دارید، آنها را داخل اسکریپت تنظیم کنید.
- برای دیدن لیست کارهای زمانبندیشدهٔ کاربر فعلی:
crontab -l- برای حذف کل crontab:
crontab -rزمانبندی داخل خود پایتون (حلقه + sleep)
اگر نمیخواهید از ابزار سیستمعامل استفاده کنید، میتوانید «داخل خود اسکریپت» یک زمانبندی ساده بسازید. محدودیت مهم این روش:
اسکریپت باید همیشه در حال اجرا بماند (مثلاً روی یک سرور یا سیستم روشن).
استفاده از `time.sleep`
مثال: اجرای یک کار هر ۱۰ ثانیه:
import time
import datetime
def job():
now = datetime.datetime.now()
print(f"کار اجرا شد در: {now}")
while True:
job()
time.sleep(10) # مکث ۱۰ ثانیهایده:
- حلقهٔ
while Trueباعث میشود برنامه دائماً تکرار شود. time.sleep(10)اجرای حلقه را برای ۱۰ ثانیه متوقف میکند.
زمانبندی سادهٔ روزانه (تقریبی)
مثلاً میخواهید هر روز حدود ساعت ۱۰ صبح کار انجام شود. یک نسخهٔ ساده (نهچندان دقیق، ولی کاربردی):
import time
import datetime
def do_daily_task():
now = datetime.datetime.now()
print(f"کار روزانه اجرا شد در: {now}")
while True:
now = datetime.datetime.now()
if now.hour == 10 and now.minute == 0:
do_daily_task()
time.sleep(60) # برای جلوگیری از اجرای چندباره در همان دقیقه
else:
time.sleep(20) # هر ۲۰ ثانیه یکبار بررسی کنداین روش برای کارهای خانگی ساده بد نیست، ولی برای زمانبندی جدی، استفاده از ابزار سیستمعامل یا کتابخانههای مخصوص بهتر است.
آشنایی مقدماتی با کتابخانههای زمانبندی در پایتون
کتابخانههایی وجود دارند که مدیریت زمانبندی را راحتتر میکنند. یکی از سادهترینها، ماژول schedule است (خارجی است و با pip نصب میشود).
نصب و استفادهٔ خیلی خلاصه از `schedule`
نصب (در ترمینال):
pip install scheduleنمونهٔ استفاده:
import schedule
import time
def job():
print("سلام! این کار هر دقیقه اجرا میشود.")
# تعریف برنامهٔ زمانی
schedule.every(1).minutes.do(job)
while True:
schedule.run_pending() # کارهایی که نوبتشان شده را اجرا کن
time.sleep(1)ایده:
- شما با
schedule.every(...).do(...)میگویید چه کار، هر چند وقت یکبار انجام شود. - حلقه، دائماً چک میکند که آیا وقت اجرای کاری رسیده است یا نه.
این روش برای برنامههای در حال اجرا (مثل سرویسها) مناسب است، اما همچنان نیاز دارد برنامه در حال اجرا بماند.
تست و عیبیابی زمانبندی
چه از Task Scheduler استفاده کنید، چه از cron، چه از روشهای داخل پایتون، چند نکتهٔ مهم برای تست:
- ابتدا اسکریپت را دستی اجرا کنید.
مطمئن شوید بدون خطا کار میکند. - در اسکریپت، لاگ بنویسید.
مثلاً در هر اجرا، زمان را در یک فایل ثبت کنید تا ببینید آیا در زمان درست اجرا شده است یا نه.
with open("log.txt", "a", encoding="utf-8") as f:
f.write("اسکریپت اجرا شد.\n")- برای تست، فاصلهٔ زمانی را کوتاه بگیرید.
مثلاً بهجای روزانه، برای چند دقیقهٔ آینده تنظیم کنید تا مجبور نشوید یک روز صبر کنید. - پیامهای خطا را بررسی کنید.
- در ویندوز: در Task Scheduler، تاریخچه (History) و تبهای مختلف Task را ببینید.
- در لینوکس/macOS: ممکن است خروجی خطا را در
mailکاربر یا در لاگ سیستم ببینید (این بسته به تنظیمات سیستم است). اگر میخواهید خروجی را در فایل داشته باشید، در دستور cron اینطور بنویسید:
0 10 * * * /usr/bin/python3 /home/user/projects/log_time.py >> /home/user/projects/cron.log 2>&1
(این دستور خروجی استاندارد و خطا را در cron.log مینویسد.)
انتخاب روش مناسب
خلاصه:
- اگر میخواهید اسکریپت شما حتی وقتی لاگین نکردهاید هم اجرا شود
→ از Task Scheduler (ویندوز) یا cron (لینوکس/macOS) استفاده کنید. - اگر برنامهٔ شما خودش دائماً در حال اجراست و فقط لازم است هر چند وقت یکبار کاری انجام دهد
→ از حلقه وtime.sleepیا کتابخانههایی مثلscheduleاستفاده کنید. - اگر اسکریپت شما ساده است (پوشهٔ شخصی، کارهای خانگی)
→ هر دو روش جواب میدهند؛ از هر کدام با آن راحتترید استفاده کنید.
در فصلهای دیگر، یاد میگیرید چطور اسکریپتهای کاربردیتر بسازید؛ در این فصل دیدید که چطور آنها را در زمانهای مشخص بهطور خودکار اجرا کنید تا خودکارسازی شما یک قدم حرفهایتر شود.