Crontab ابزاری در لینوکس است که به ما امکان میدهد کارهای (Tasks) مختلفی را در زمانهای مشخص اجرا کنیم. این Taskها در فایلی به نام crontab لیست میشوند. اما گاهی اوقات، اسکریپتها در این فایل به درستی اجرا نمیشوند و شما را کلافه میکند. از تنظیم نادرست متغیرها گرفته تا خاموش بودن Cron یا نبود مجوزهای اجرا، دلایل مختلفی ممکن است باعث این مشکل شوند. در این مقاله، با زبانی ساده و راهحلهایی کاربردی، به بررسی رایجترین مشکلات کار نکردن اسکریپت در Crontab میپردازیم و شما را قدمبهقدم راهنمایی میکنیم تا این مشکلات را برطرف کنید. فرقی نمیکند تازهکار باشید یا حرفهای، این آموزش به شما کمک میکند تا اسکریپتهایتان را به راحتی و بدون خطا اجرا کنید!
بنابراین در این مقاله ابتدا، نحوه افزودن متغییر های محیطی به Crontab را توضیح میدهیم. سپس، خواهیم گفت که چگونه سرویس cron را در صورت خاموش بودن، دوباره راهاندازی کنیم. بعد از آن، یاد میگیریم که چگونه خطاهای اسکریپت (stderr) را به یک لاگ فایل لینوکس ریدایرکت کنیم. در نهایت، نحوه تنظیم مجوزهای اسکریپت برای اجرای درست در Crontab را بررسی میکنیم.
1. مشکلات مربوط به متغیرهای محیطی (Environment Variables)
وقتی کرون یک کار را اجرا میکند، فقط تعداد محدودی از متغیرهای محیطی را در اختیار اسکریپت قرار میدهد. این یعنی اگر متغیرهای مورد نیاز اسکریپت به صراحت در 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 حالا به محیط کرون اضافه شده است.
2. بررسی فعال بودن سرویس cron
یکی دیگر از دلایل رایج کار نکردن اسکریپت در Crontab این است که سرویس کرون (cron daemon) اجرا نمیشود. برای بررسی اینکه آیا کرون فعال است یا نه، از دستور زیر استفاده کنید:
$ pgrep cron
اگر هیچ خروجیای دریافت نکردید، یعنی کرون اجرا نمیشود. برای راهاندازی آن، از دستور زیر با دسترسی sudo استفاده کنید:
$ sudo systemctl start cron
حالا دوباره بررسی کنید:
$ pgrep cron
1405
عدد 1405 نشاندهنده شماره PID کرون است، یعنی سرویس کرون حالا به درستی اجرا میشود.
3. بررسی مجوزهای اسکریپت
یکی دیگر از مشکلات رایج، نداشتن مجوز اجرایی (executable permission) برای اسکریپت است که باعث میشود اسکریپت در Crontab اجرا نشود. چرا که اغلب، اسکریپتی که توسط cron اجرا میشود، فاقد مجوزهای اجرایی است. برای رفع این مشکل، ابتدا نحوه ریدایرکت stderr به یک اسکریپت در crontab را توضیح می دهیم و سپس، از یک دستور برای رفع مشکل مجوزها استفاده خواهیم کرد.
ریدایرکت stderr در کرون جاب
اسکریپتهای 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 را به راحتی برطرف کنید و اسکریپتهای خود را بدون مشکل اجرا کنید.