آموزش لینوکس

نحوه رفع مشکل کار نکردن اسکریپت در Crontab

Crontab ابزاری در لینوکس است که به ما امکان می‌دهد کارهای (Tasks) مختلفی را در زمان‌های مشخص اجرا کنیم. این Taskها در فایلی به نام crontab لیست می‌شوند. اما گاهی اوقات، اسکریپت‌ها در این فایل به درستی اجرا نمی‌شوند و شما را کلافه می‌کند. از تنظیم نادرست متغیرها گرفته تا خاموش بودن Cron یا نبود مجوزهای اجرا، دلایل مختلفی ممکن است باعث این مشکل شوند. در این مقاله، با زبانی ساده و راه‌حل‌هایی کاربردی، به بررسی رایج‌ترین مشکلات کار نکردن اسکریپت در Crontab می‌پردازیم و شما را قدم‌به‌قدم راهنمایی می‌کنیم تا این مشکلات را برطرف کنید. فرقی نمی‌کند تازه‌کار باشید یا حرفه‌ای، این آموزش به شما کمک می‌کند تا اسکریپت‌هایتان را به راحتی و بدون خطا اجرا کنید!

بنابراین در این مقاله ابتدا، نحوه افزودن متغییر های محیطی به Crontab را توضیح می‌دهیم. سپس، خواهیم گفت که چگونه سرویس cron را در صورت خاموش بودن، دوباره راه‌اندازی کنیم. بعد از آن، یاد می‌گیریم که چگونه خطاهای اسکریپت (stderr) را به یک لاگ فایل لینوکس ریدایرکت کنیم. در نهایت، نحوه تنظیم مجوزهای اسکریپت برای اجرای درست در Crontab را بررسی می‌کنیم.

کار نکردن اسکریپت در Crontab

وقتی کرون یک کار را اجرا می‌کند، فقط تعداد محدودی از متغیرهای محیطی را در اختیار اسکریپت قرار می‌دهد. این یعنی اگر متغیرهای مورد نیاز اسکریپت به صراحت در Crontab تعریف نشده باشند، اسکریپت ممکن است به درستی کار نکند. برای حل این مشکل ابتدا در ترمینال خود دستور زیر را اجرا کنید تا تمام متغیرهای محیطی سیستم را ببینید:

$ env
SHELL=/bin/bash
SESSION_MANAGER=local/ws-310:@/tmp/.ICE-unix/3035,unix/ws-310:/tmp/.ICE-unix/3035
QT_ACCESSIBILITY=1
COLORTERM=truecolor
...
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
LC_NUMERIC=be_BY.UTF-8
_=/usr/bin/env

این دستور لیستی طولانی از متغیرهای محیطی را نشان می‌دهد. حالا بیایید همین دستور را در Crontab اجرا کنیم. برای این کار، Crontab را با اجرای دستور زیر باز کنید:

$ crontab -e

سپس، خط زیر را به Crontab اضافه کنید تا خروجی دستور env در یک فایل ذخیره شود:

* * * * * env > /tmp/env.output

این خط باعث می‌شود هر دقیقه، دستور env اجرا شده و خروجی آن در فایل /tmp/env.output ذخیره شود. حالا محتوای این فایل را بررسی کنید:

$ cat /tmp/env.output 
HOME=/home/user
LOGNAME=user
...
SHELL=/bin/sh
PWD=/home/user

می‌بینید که بسیاری از متغیرهای محیطی که در ترمینال دیدیم، در اینجا وجود ندارند. نبود متغیرهای محیطی می‌تواند دلیل کار نکردن اسکریپت در Crontab باشد. برای رفع این مشکل، باید متغیرهای محیطی مورد نیاز را به اسکریپت اضافه کنیم. برای مثال، می توانیم متغیر PATH را به شکل زیر در ابتدای اسکریپت قرار دهیم:

#!/bin/bash
PATH=/opt/someApp/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

# The rest of the script follows

در اینجا، متغیر PATH را درست زیر خط #!/bin/bash اضافه کردیم. به همین ترتیب، می‌توانید هر متغیر محیطی دیگری که اسکریپت به آن نیاز دارد را اضافه کنید. حالا دوباره فایل /tmp/env.output را با اجرای دستور زیر بررسی کنید:

$ cat /tmp/env.output 
HOME=/home/user
LOGNAME=user
...
PATH=/opt/someApp/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/home/user

می‌بینید که متغیر PATH حالا به محیط کرون اضافه شده است.

یکی دیگر از دلایل رایج کار نکردن اسکریپت در Crontab این است که سرویس کرون (cron daemon) اجرا نمی‌شود. برای بررسی اینکه آیا کرون فعال است یا نه، از دستور زیر استفاده کنید:

$ pgrep cron

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

$ sudo systemctl start cron

حالا دوباره بررسی کنید:

$ pgrep cron
1405

عدد 1405 نشان‌دهنده شماره PID کرون است، یعنی سرویس کرون حالا به درستی اجرا می‌شود.

یکی دیگر از مشکلات رایج، نداشتن مجوز اجرایی (executable permission) برای اسکریپت است که باعث می‌شود اسکریپت در Crontab اجرا نشود. چرا که اغلب، اسکریپتی که توسط cron اجرا می‌شود، فاقد مجوزهای اجرایی است. برای رفع این مشکل، ابتدا نحوه ریدایرکت stderr به یک اسکریپت در crontab را توضیح می دهیم و سپس، از یک دستور برای رفع مشکل مجوزها استفاده خواهیم کرد.

اسکریپت‌های Crontab گاهی اوقات اطلاعاتی درباره خطاها ارائه نمی‌دهند. برای مثال، فرض کنید خط زیر را در Crontab داریم:

* * * * * /path/to/script >> /tmp/output

این خط اسکریپت را هر دقیقه اجرا می‌کند و خروجی آن را به فایل /tmp/output می‌فرستد. اما اگر اسکریپت کار نکند، خطاهای آن (stderr) در این فایل ثبت نمی‌شوند. برای ثبت خطاها، باید stderr را به فایل خروجی ریدایرکت کنیم. برای این کار، عبارت 2>&1 را به انتهای خط اضافه کنید:

* * * * * /path/to/script >> /tmp/output 2>&1

حالا هر خطایی که اسکریپت تولید کند، در فایل /tmp/output ذخیره می‌شود.

اگر خطایی مثل زیر در فایل /tmp/output ببینید یعنی اسکریپت مجوز اجرایی ندارد.

bash: /path/to/script: Permission denied

برای رفع این مشکل، از دستور زیر استفاده کنید:

$ chmod +x /path/to/script

حالا با اجرای دستور زیر مجوزهای اسکریپت را بررسی کنید:

$ ls -l /path/to/script 
-rwxrwxr-x 1 user user 20 Dec 11 13:24 script

حرف x در خروجی نشان می‌دهد که اسکریپت حالا قابل اجرا است و نباید دیگر خطایی در Crontab ایجاد کند.

در این مقاله، یاد گرفتیم که چگونه مشکل کار نکردن اسکریپت در Crontab را برطرف کنیم. ابتدا نحوه افزودن متغیرهای محیطی را بررسی کردیم. سپس، چگونگی بررسی و راه‌اندازی سرویس کرون را آموختیم. در نهایت ، روش ریدارکت خطاها به فایل لاگ را یاد گرفتیم. در نهایت، نحوه تنظیم مجوزهای اسکریپت برای اجرا شدن درست را توضیح دادیم. با این راه‌حل‌ها، می‌توانید مشکلات رایج Crontab را به راحتی برطرف کنید و اسکریپت‌های خود را بدون مشکل اجرا کنید.

فاطمه صحرائیان

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

نوشته های مشابه

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

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا