دانشنامه مارال هاست دانشنامه مارال هاست
  • صفحه اصلی
  • مقالات
    • هاست اشتراکی
    • دامنه
    • سرور مجازی
    • کنترل پنل سی‌پنل
    • کنترل پنل پلسک
    • کنترل پنل دایرکت ادمین
    • ایمیل
    • CloudLinux
    • Cloudflare
  • تماس با ما
دانشنامه مارال هاست دانشنامه مارال هاست
دانشنامه مارال هاست دانشنامه مارال هاست
  • صفحه اصلی
  • مقالات
    • هاست اشتراکی
    • دامنه
    • سرور مجازی
    • کنترل پنل سی‌پنل
    • کنترل پنل پلسک
    • کنترل پنل دایرکت ادمین
    • ایمیل
    • CloudLinux
    • Cloudflare
  • تماس با ما
لینوکس
  • Folder icon closed Folder open iconآشنایی با لینوکس (Linux Fundamentals)
  • Folder icon closed Folder open iconتوزیع‌های مختلف لینوکس (Linux Distributions)
  • Folder icon closed Folder open iconFHS؛ آشنایی با ساختار فایل‌ و پوشه‌های لینوکسی
  • Folder icon closed Folder open iconمهم‌ترین دستورات پایه‌ای برای هر sysadmin
  • Folder icon closed Folder open iconمدیریت فایل و پوشه (file & directory management) در لینوکس
  • Folder icon closed Folder open iconآموزش ویرایش فایل‌های متنی در لینوکس با Nano و Vim
  • Folder icon closed Folder open iconآشنایی با users، groups و ساختار مدیریت کاربران در لینوکس
  • Folder icon closed Folder open iconآموزش Permission و Ownership در لینوکس
  • Folder icon closed Folder open iconآشنایی با Root و sudo
  • Folder icon closed Folder open iconآشنایی با Processها در لینوکس
  • Folder icon closed Folder open iconتغییر Hostname در لینوکس
  • Folder icon closed Folder open iconتنظیم Timezone در لینوکس
  • Folder icon closed Folder open iconتنظیم NTP در لینوکس
  • Folder icon closed Folder open iconبروزرسانی سیستم در لینوکس
  • Folder icon closed Folder open iconساخت کاربر جدید در لینوکس
  • Folder icon closed Folder open iconایجاد کاربران و گروه ها در لینوکس
  • Folder icon closed Folder open iconآموزش ACL در لینوکس؛ مدیریت سطح دسترسی پیشرفته برای کاربران و گروه‌ها
  • Folder icon closed Folder open iconآموزش umask در لینوکس؛ تعیین مجوز پیش‌فرض فایل‌ها و پوشه‌های جدید
  • Folder icon closed Folder open iconآموزش فایل sudoers؛ مدیریت دسترسی کاربران به دستورات مدیریتی در لینوکس
  • Folder icon closed Folder open iconآموزش دستور chown در لینوکس
  • Folder icon closed Folder open iconآموزش دستور chmod در لینوکس
  • Folder icon closed Folder open iconSticky Bit در لینوکس چیست؟ آموزش افزایش امنیت پوشه‌های اشتراکی
  • Folder icon closed Folder open iconآموزش SUID در لینوکس؛ اجرای برنامه‌ها با دسترسی مالک فایل
  • Folder icon closed Folder open iconآموزش SGID در لینوکس؛ مدیریت دسترسی گروه‌ها و اجرای برنامه‌ها
  • Folder icon closed Folder open iconآموزش ریست پسورد ubuntu
  • Folder icon closed Folder open iconآموزش ریست پسورد Debian
  • Folder icon closed Folder open iconاگر منابع سرور لینوکسی کامل درگیر شد چکار کنیم ؟
  • Folder icon closed Folder open iconآموزش تست استرس سرور لینوکس
  • Folder icon closed Folder open iconآموزش کامل systemctl
  • Folder icon closed Folder open iconساخت سرویس سفارشی در Systemd
  • Folder icon closed Folder open iconآموزش کامل cron
  • Folder icon closed Folder open iconآموزش کامل OpenSSL در لینوکس
  • Folder icon closed Folder open iconآموزش کامل htop در لینوکس
  • Folder icon closed Folder open iconآموزش کامل دستور kill در لینوکس
  • Folder icon closed Folder open iconآموزش کامل دستور df در لینوکس
  • Folder icon closed Folder open iconآموزش کامل دستور du در لینوکس
  • Folder icon closed Folder open iconآموزش کامل دستور lsblk در لینوکس
  • Folder icon closed Folder open iconآموزش کامل journalctl در لینوکس
  • Folder icon closed Folder open iconپیدا کردن فایل‌های حجیم در لینوکس
  • Folder icon closed Folder open iconپیدا کردن فایل‌های حجیم در لینوکس
  • Folder icon closed Folder open iconپیدا کردن پردازش‌های مصرف‌کننده CPU
  • Folder icon closed Folder open iconTerminal Multiplexer چیست؟ آشنایی با Screen، tmux و ابزارهای مشابه
    • آموزش Screen در لینوکس؛ مدیریت Sessionها و پردازش‌های طولانی
    • آموزش tmux در لینوکس؛ مدیریت Session، Window و Pane
    • اجرای پردازش‌های طولانی پس از قطع SSH با Screen و tmux
    • شخصی‌سازی Screen با فایل .screenrc
    • شخصی‌سازی tmux با فایل .tmux.conf
    • مقایسه Screen و tmux؛ کدام Terminal Multiplexer مناسب‌تر است؟
    • تفاوت nohup، Screen، tmux و systemd؛ کدام روش برای اجرای پردازش‌ها مناسب است؟
  • Folder icon closed Folder open iconتست SMTP در لینوکس به سمت مقصد
  • Folder icon closed Folder open iconآموزش بررسی وضعیت ارسال ایمیل در Track Delivery
  • Folder icon closed Folder open iconآموزش انتقال خودکار ایمیل‌ها به یک پوشه(mailenable , roundcube)
  • Folder icon closed Folder open iconآموزش مسدود کردن یک فرستنده در Webmail (Roundcube و MailEnable)
  • Folder icon closed Folder open iconآموزش تعریف Email Filter در cPanel
  • Folder icon closed Folder open iconآموزش بررسی فایل‌های لاگ در /var/log لینوکس
  • Folder icon closed Folder open iconآموزش grep برای جستجوی خطا در لاگ‌های لینوکس
  • Folder icon closed Folder open iconjournalctl -b؛ بررسی خطاهای Boot در لینوکس
  • Folder icon closed Folder open iconlogrotate؛ مدیریت و چرخش لاگ‌ها در لینوکس
  • Folder icon closed Folder open iconآموزش ریست پسورد centos 7
  • Folder icon closed Folder open iconآموزش ریست پسورد فراموش‌شده root در AlmaLinux 8.7 و AlmaLinux 9.1
  • Folder icon closed Folder open iconچرا در سرور لینوکس فضای دیسک آزاد نمی‌شود؟ آموزش کامل عیب‌یابی فضای Disk
لینوکس

آموزش کامل cron

آموزش کامل cron

مقدمه

در مدیریت سرورهای لینوکسی، بسیاری از کارها باید به‌صورت خودکار و در زمان مشخص انجام شوند. برای مثال:

  • تهیه Backup هر شب
  • اجرای Script هر 5 دقیقه
  • حذف فایل‌های قدیمی
  • اجرای یک PHP Script
  • ارسال گزارش روزانه
  • پاک‌سازی Cache
  • Sync اطلاعات
  • اجرای دستورات مدیریتی در ساعت مشخص

یکی از ابزارهای اصلی لینوکس برای این کار Cron است.

Cron یک سرویس زمان‌بندی است که دستورات و Scriptها را براساس زمان تعریف‌شده اجرا می‌کند. تنظیمات هر کار زمان‌بندی‌شده نیز معمولاً با نام Cron Job شناخته می‌شود.

در این مقاله با ساختار Cron، دستورات crontab، زمان‌بندی‌های مختلف، اجرای Script، مدیریت Log، Environment Variableها، Cron سیستمی و روش عیب‌یابی Cron Jobهای اجرا‌نشده آشنا می‌شویم.


Cron چیست؟

Cron یک Scheduler در سیستم‌های Unix و Linux است که دستورات را در زمان‌های مشخص اجرا می‌کند.

برای مثال می‌توان تنظیم کرد:

Run backup every day at 02:00

یا:

Run script every 5 minutes

یا:

Run cleanup every Sunday

وظایفی که توسط Cron اجرا می‌شوند در اصطلاح Cron Job نام دارند.


بررسی نصب و اجرای Cron

در Ubuntu و Debian معمولاً نام سرویس:

systemctl status cron

در AlmaLinux، Rocky Linux و RHEL معمولاً:

systemctl status crond

اگر سرویس فعال باشد، خروجی مشابه زیر دیده می‌شود:

Active: active (running)

Start کردن Cron

Ubuntu و Debian:

sudo systemctl start cron

AlmaLinux و Rocky Linux:

sudo systemctl start crond

فعال‌سازی Cron هنگام Boot

Ubuntu:

sudo systemctl enable --now cron

RHEL-based:

sudo systemctl enable --now crond

بررسی:

systemctl is-enabled cron

یا:

systemctl is-enabled crond

دستور crontab چیست؟

دستور اصلی مدیریت Cron Jobهای کاربران:

crontab

هر User می‌تواند Crontab مخصوص خود را داشته باشد.

برای ویرایش Cron Jobهای User فعلی:

crontab -e

برای مشاهده:

crontab -l

برای حذف تمام Cron Jobهای User:

crontab -r

در استفاده از crontab -r دقت کنید؛ زیرا تمام Cron Jobهای آن User حذف می‌شوند.


اولین Cron Job

برای شروع:

crontab -e

سپس خط زیر را اضافه کنید:

* * * * * date >> /tmp/cron-test.log

این دستور هر دقیقه تاریخ و زمان فعلی را داخل فایل زیر ذخیره می‌کند:

/tmp/cron-test.log

چند دقیقه بعد:

cat /tmp/cron-test.log

نمونه:

Tue Aug 18 17:30:01 +0330 2026
Tue Aug 18 17:31:01 +0330 2026
Tue Aug 18 17:32:01 +0330 2026

اگر این خروجی ایجاد شد، Cron صحیح کار می‌کند.


ساختار Cron Job

ساختار معمول:

* * * * * command

پنج بخش اول زمان اجرا را مشخص می‌کنند.

┌───────────── Minute
│ ┌─────────── Hour
│ │ ┌───────── Day of Month
│ │ │ ┌─────── Month
│ │ │ │ ┌───── Day of Week
│ │ │ │ │
* * * * * command

جدول:

بخشمحدوده
دقیقه0-59
ساعت0-23
روز ماه1-31
ماه1-12
روز هفته0-7
دستورCommand یا Script

در Day of Week معمولاً:

0 = Sunday
1 = Monday
2 = Tuesday
3 = Wednesday
4 = Thursday
5 = Friday
6 = Saturday
7 = Sunday

اجرای Cron هر دقیقه

* * * * * /path/to/script.sh

اجرای Cron هر 5 دقیقه

*/5 * * * * /path/to/script.sh

هر 10 دقیقه

*/10 * * * * /path/to/script.sh

هر 30 دقیقه

*/30 * * * * /path/to/script.sh

هر ساعت

در دقیقه صفر هر ساعت:

0 * * * * /path/to/script.sh

برای مثال:

01:00
02:00
03:00
04:00

هر روز ساعت 2 بامداد

0 2 * * * /path/to/backup.sh

هر روز ساعت 23:30

30 23 * * * /path/to/script.sh

هر روز ساعت 8 صبح

0 8 * * * /path/to/script.sh

هر روز ساعت 8:15

15 8 * * * /path/to/script.sh

هر دو ساعت

0 */2 * * * /path/to/script.sh

هر 6 ساعت

0 */6 * * * /path/to/script.sh

هر روز دو بار

برای مثال ساعت 8 و 20:

0 8,20 * * * /path/to/script.sh

اجرای Cron در روز مشخص هفته

هر دوشنبه ساعت 3 بامداد:

0 3 * * 1 /path/to/script.sh

هر جمعه ساعت 23:

0 23 * * 5 /path/to/script.sh

هر روز کاری

دوشنبه تا جمعه:

0 9 * * 1-5 /path/to/script.sh

هر آخر هفته

شنبه و یکشنبه:

0 10 * * 6,0 /path/to/script.sh

اولین روز هر ماه

ساعت 2:

0 2 1 * * /path/to/script.sh

روز پانزدهم هر ماه

0 2 15 * * /path/to/script.sh

اجرای Cron در ماه مشخص

برای مثال اول ژانویه:

0 0 1 1 * /path/to/script.sh

اجرای چند دقیقه مشخص

برای مثال دقیقه‌های 0، 15، 30 و 45:

0,15,30,45 * * * * /path/to/script.sh

این تقریباً معادل:

*/15 * * * * /path/to/script.sh

است.


استفاده از Range

از ساعت 8 تا 18، هر ساعت:

0 8-18 * * * /path/to/script.sh

ترکیب Range و Step

هر 10 دقیقه بین ساعت 8 تا 18:

*/10 8-18 * * * /path/to/script.sh

کلمات اختصاری Cron

بعضی Cronها از Syntaxهای ویژه زیر پشتیبانی می‌کنند:

دستورمعادل تقریبی
@rebootهنگام Boot
@yearlyسالانه
@annuallyسالانه
@monthlyماهانه
@weeklyهفتگی
@dailyروزانه
@midnightروزانه
@hourlyساعتی

اجرای Script هنگام Boot

@reboot /opt/myapp/start.sh

برای ایجاد کمی تأخیر:

@reboot sleep 30 && /opt/myapp/start.sh

برای سرویس‌های دائمی بهتر است به‌جای @reboot از systemd Service استفاده شود؛ زیرا systemd قابلیت Restart، Dependency و Logging بهتری دارد.


اجرای روزانه

@daily /opt/scripts/backup.sh

اجرای ساعتی

@hourly /opt/scripts/check.sh

اجرای ماهانه

@monthly /opt/scripts/report.sh

مشاهده Cron Jobهای User فعلی

crontab -l

نمونه:

0 2 * * * /root/backup.sh
*/5 * * * * /root/check.sh

ویرایش Crontab کاربر دیگر

با دسترسی root:

crontab -u USERNAME -e

مثال:

crontab -u ali -e

مشاهده:

crontab -u ali -l

Cron مربوط به root

برای Cron Jobهایی که نیازمند دسترسی مدیریتی هستند:

sudo crontab -e

یا اگر با root وارد شده‌اید:

crontab -e

Cronهای root می‌توانند دستورات مدیریتی سیستم را اجرا کنند، بنابراین باید با دقت تنظیم شوند.


تفاوت User Crontab و System Crontab

User Crontab:

crontab -e

ساختار:

minute hour day month weekday command

اما فایل‌های سیستمی مانند:

/etc/crontab

یک فیلد اضافی برای User دارند:

minute hour day month weekday user command

مثال:

0 2 * * * root /root/backup.sh

این تفاوت بسیار مهم است.


فایل /etc/crontab

مشاهده:

cat /etc/crontab

ساختار نمونه:

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

17 * * * * root command

در این فایل باید User اجراکننده نیز مشخص شود.


پوشه /etc/cron.d

Cron Jobهای سرویس‌ها و Packageها معمولاً ممکن است در:

/etc/cron.d/

قرار داشته باشند.

مشاهده:

ls -la /etc/cron.d/

فایل‌های این مسیر نیز معمولاً مانند /etc/crontab دارای ستون User هستند.

مثال:

*/5 * * * * root /usr/local/bin/check-service

پوشه‌های cron.hourly و cron.daily

در بسیاری از توزیع‌ها مسیرهای زیر وجود دارند:

/etc/cron.hourly/
/etc/cron.daily/
/etc/cron.weekly/
/etc/cron.monthly/

برای مثال:

ls -la /etc/cron.daily/

Scriptهای موجود در این مسیرها توسط سیستم زمان‌بندی مربوط اجرا می‌شوند.


اجرای Bash Script با Cron

فرض کنید فایل زیر را داریم:

/root/backup.sh

محتوا:

#!/bin/bash

date >> /var/log/my-backup.log
echo "Backup started" >> /var/log/my-backup.log

Permission اجرا:

chmod +x /root/backup.sh

Cron:

0 2 * * * /root/backup.sh

بهتر است Shell را صریح مشخص کنیم؟

برای Script بهتر است Shebang داشته باشید:

#!/bin/bash

و فایل Executable باشد:

chmod +x script.sh

روش دیگر:

0 2 * * * /bin/bash /root/backup.sh

این روش حتی اگر فایل Execute Permission نداشته باشد می‌تواند Script را توسط Bash اجرا کند، به شرط وجود Permission خواندن.


استفاده از مسیر کامل Commands

یکی از مهم‌ترین نکات Cron این است که Environment آن با Terminal شما متفاوت است.

به‌جای:

0 2 * * * mysqldump database > backup.sql

بهتر است مسیر کامل Binary استفاده شود:

0 2 * * * /usr/bin/mysqldump database > /backup/database.sql

مسیر Command:

command -v mysqldump

نمونه:

/usr/bin/mysqldump

مشکل PATH در Cron

ممکن است دستور در Terminal کار کند:

python3 script.py

اما در Cron اجرا نشود.

علت ممکن است PATH محدود Cron باشد.

در ابتدای Crontab می‌توان تعریف کرد:

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

مثال کامل:

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

*/5 * * * * /opt/scripts/check.sh

تعریف SHELL

می‌توان Shell مورد استفاده را نیز مشخص کرد:

SHELL=/bin/bash

مثال:

SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

0 2 * * * /root/backup.sh

Working Directory در Cron

Cron به‌صورت خودکار وارد Directory پروژه نمی‌شود.

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

* * * * * python3 app.py

بهتر است:

* * * * * cd /opt/myapp && /usr/bin/python3 app.py

یا مسیر کامل:

* * * * * /usr/bin/python3 /opt/myapp/app.py

اگر برنامه فایل‌های Relative Path دارد، استفاده از cd مفید است.


اجرای PHP با Cron

ابتدا مسیر PHP CLI را پیدا کنید:

command -v php

نمونه:

/usr/bin/php

Cron:

*/5 * * * * /usr/bin/php /var/www/example.com/script.php

اجرای Laravel Scheduler

نمونه رایج:

* * * * * cd /var/www/example.com && /usr/bin/php artisan schedule:run >> /dev/null 2>&1

این Cron هر دقیقه Scheduler لاراول را اجرا می‌کند و خود Laravel تصمیم می‌گیرد چه Jobهایی در آن دقیقه اجرا شوند.


اجرای Python Script

*/10 * * * * /usr/bin/python3 /opt/scripts/check.py

اگر Virtual Environment دارید:

*/10 * * * * /opt/myapp/venv/bin/python /opt/myapp/check.py

نیازی نیست:

source venv/bin/activate

اجرا شود.


اجرای Curl

مثال:

*/5 * * * * /usr/bin/curl -fsS https://example.com/cron.php

برای جلوگیری از نمایش خروجی:

*/5 * * * * /usr/bin/curl -fsS https://example.com/cron.php > /dev/null 2>&1

اجرای wget

*/10 * * * * /usr/bin/wget -q -O /dev/null https://example.com/cron.php

در سرویس‌های Production معمولاً اجرای مستقیم CLI Script بهتر از فراخوانی URL عمومی است، مگر اینکه معماری برنامه نیاز به HTTP داشته باشد.


Redirect کردن خروجی Cron

اگر Command خروجی داشته باشد می‌توان آن را داخل فایل ذخیره کرد:

*/5 * * * * /opt/scripts/check.sh >> /var/log/check.log 2>&1

معنی:

>> = Append standard output
2>&1 = Send standard error to the same destination

حذف کامل خروجی

*/5 * * * * /opt/scripts/check.sh > /dev/null 2>&1

این روش تمام خروجی و خطاها را دور می‌ریزد.

برای Jobهای مهم بهتر است حداقل خطاها Log شوند.


ذخیره فقط Error

*/5 * * * * /opt/scripts/check.sh > /dev/null 2>> /var/log/check-error.log

Log همراه تاریخ

می‌توانید Logging را داخل Script انجام دهید:

#!/bin/bash

LOG="/var/log/myjob.log"

echo "$(date '+%F %T') - Job started" >> "$LOG"

/usr/bin/some-command >> "$LOG" 2>&1

echo "$(date '+%F %T') - Job finished" >> "$LOG"

این روش برای عیب‌یابی بسیار کاربردی است.


Cron Email چیست؟

Cron به‌صورت سنتی خروجی Job را می‌تواند از طریق Mail برای User ارسال کند، مشروط به اینکه Mail Transport روی سیستم تنظیم باشد.

می‌توان متغیر:

MAILTO=root

را داخل Crontab تعریف کرد.

مثال:

MAILTO=root

0 2 * * * /root/backup.sh

برای غیرفعال‌کردن Mail:

MAILTO=""

جلوگیری از اجرای هم‌زمان Cron Job

فرض کنید Script هر 5 دقیقه اجرا می‌شود:

*/5 * * * * /root/backup.sh

اما اجرای Backup 10 دقیقه طول می‌کشد.

در این صورت نسخه دوم Script قبل از پایان نسخه اول اجرا می‌شود.

این وضعیت ممکن است باعث:

  • مصرف زیاد CPU
  • چند Backup هم‌زمان
  • Lock شدن فایل‌ها
  • افزایش Load
  • خراب‌شدن خروجی

شود.


استفاده از flock

برای جلوگیری از اجرای هم‌زمان:

*/5 * * * * /usr/bin/flock -n /tmp/myjob.lock /root/backup.sh

اگر Lock در اختیار اجرای قبلی باشد، Job جدید اجرا نمی‌شود.


استفاده از File Descriptor با flock

نمونه:

*/5 * * * * /usr/bin/flock -n /var/lock/myjob.lock /root/backup.sh

برای Jobهای مهم بسیار توصیه می‌شود.


پیدا کردن مسیر flock

command -v flock

نمونه:

/usr/bin/flock

Timeout برای Cron Job

اگر نمی‌خواهید یک Script بیش از مدت مشخص اجرا شود:

*/5 * * * * /usr/bin/timeout 300 /root/check.sh

عدد:

300

یعنی 300 ثانیه یا 5 دقیقه.


ترکیب timeout و flock

*/5 * * * * /usr/bin/flock -n /var/lock/check.lock /usr/bin/timeout 240 /root/check.sh

در این حالت:

  • اجرای هم‌زمان جلوگیری می‌شود.
  • Script حداکثر 240 ثانیه فرصت اجرا دارد.

نمونه Backup دیتابیس با Cron

فرض کنید می‌خواهیم هر شب ساعت 2 از MySQL Backup بگیریم.

Script:

sudo nano /root/mysql-backup.sh

محتوا:

#!/bin/bash

BACKUP_DIR="/backup/mysql"
DATE="$(date +%F-%H%M)"

mkdir -p "$BACKUP_DIR"

/usr/bin/mysqldump example_database \
| /usr/bin/gzip \
> "$BACKUP_DIR/example_database-$DATE.sql.gz"

Permission:

chmod 700 /root/mysql-backup.sh

Cron:

0 2 * * * /root/mysql-backup.sh >> /var/log/mysql-backup.log 2>&1

حذف Backupهای قدیمی با Cron

برای حذف فایل‌های قدیمی‌تر از 7 روز:

30 3 * * * /usr/bin/find /backup/mysql -type f -mtime +7 -delete

قبل از استفاده از -delete بهتر است ابتدا دستور را بدون حذف تست کنید:

find /backup/mysql -type f -mtime +7 -print

بعد از تأیید:

find /backup/mysql -type f -mtime +7 -delete

اجرای Cron فقط در روزهای خاص

مثلاً Backup کامل فقط شنبه:

0 3 * * 6 /root/full-backup.sh

Backup سبک روزانه:

0 2 * * 0-5 /root/daily-backup.sh

زمان سیستم و Cron

Cron براساس زمان سیستم اجرا می‌شود.

بررسی زمان:

date

بررسی Timezone:

timedatectl

نمونه:

Time zone: Asia/Tehran (+0330)

اگر Cron در ساعت اشتباه اجرا می‌شود، Timezone سیستم را بررسی کنید.


تغییر Timezone

مثال:

sudo timedatectl set-timezone Asia/Tehran

بررسی:

timedatectl

تغییر Timezone روی تمام Jobهایی که براساس Local Time اجرا می‌شوند اثر می‌گذارد.


CRON_TZ

در برخی Cron implementationها می‌توان Timezone مخصوص Crontab تعریف کرد:

CRON_TZ=UTC

و سپس:

0 2 * * * /root/script.sh

قبل از استفاده باید پشتیبانی Cron نصب‌شده روی توزیع خود را بررسی کنید.


تست Script قبل از Cron

قبل از اینکه یک Command را داخل Crontab قرار دهید، آن را دستی با همان User اجرا کنید.

مثلاً اگر Cron برای User www-data است:

sudo -u www-data /opt/scripts/job.sh

اگر همین دستور دستی Fail شود، Cron نیز احتمالاً موفق نخواهد شد.


شبیه‌سازی Environment محدود Cron

برای بررسی مشکلات Environment می‌توانید Script را با Environment ساده اجرا کنید:

env -i \
HOME="$HOME" \
PATH=/usr/bin:/bin \
/bin/bash /root/script.sh

این کار به پیدا کردن Dependencyهای پنهان روی Environment Shell کمک می‌کند.


مشاهده Logهای Cron در Ubuntu و Debian

بسته به تنظیمات Logging:

grep CRON /var/log/syslog

برای مثال:

grep CRON /var/log/syslog | tail -n 50

مشاهده Logهای Cron در AlmaLinux و Rocky Linux

ممکن است Log در مسیر زیر باشد:

/var/log/cron

مشاهده:

tail -f /var/log/cron

یا:

tail -n 100 /var/log/cron

مشاهده Log با journalctl

Ubuntu:

journalctl -u cron

RHEL-based:

journalctl -u crond

آخرین 100 خط:

journalctl -u crond -n 100 --no-pager

یا:

journalctl -u cron -n 100 --no-pager

Cron اجرا نمی‌شود؛ از کجا شروع کنیم؟

اول وضعیت سرویس:

Ubuntu:

systemctl status cron

AlmaLinux:

systemctl status crond

سپس Crontab:

crontab -l

بعد Script را دستی اجرا کنید:

/path/to/script.sh

و در نهایت Log را بررسی کنید.


مشکل Permission

اگر Script قابل اجرا نباشد:

ls -l /root/script.sh

Permission مناسب:

chmod +x /root/script.sh

اگر Script با User دیگری اجرا می‌شود، آن User باید به تمام Parent Directoryها و فایل‌های موردنیاز دسترسی داشته باشد.

برای بررسی:

namei -l /path/to/script.sh

خطای Command not found

ممکن است Script دارای:

mysqldump

باشد ولی Cron آن را پیدا نکند.

مسیر را پیدا کنید:

command -v mysqldump

سپس:

/usr/bin/mysqldump

را داخل Script استفاده کنید.


Cron اجرا می‌شود ولی فایل ساخته نمی‌شود

ممکن است Relative Path استفاده شده باشد.

نامناسب:

echo test > output.log

بهتر:

echo test > /var/log/myjob-output.log

در Cron تا حد امکان از Absolute Path استفاده کنید.


Cron Script روی Terminal کار می‌کند ولی در Cron نه

دلایل رایج:

  • PATH متفاوت
  • Environment Variable موجود نیست
  • Working Directory متفاوت
  • Permission مشکل دارد
  • Shell متفاوت است
  • SSH Agent وجود ندارد
  • HOME متفاوت است
  • فایل Config با Relative Path فراخوانی شده است

در ابتدای Script می‌توان Environment مهم را صریح تعریف کرد.

مثال:

#!/bin/bash

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
export PATH

Cron برای SSH یا Git

Jobهایی که به SSH Key نیاز دارند ممکن است در Terminal کار کنند ولی در Cron نه.

بهتر است Pathها را صریح تعریف کنید:

/usr/bin/git
/usr/bin/ssh

و Permission Key را بررسی کنید:

chmod 600 /home/user/.ssh/id_ed25519

در صورت نیاز:

HOME=/home/user

را داخل Crontab یا Script تعریف کنید.


مشکل اجرای Cron به دلیل Line Ending

اگر Script روی Windows ساخته شده باشد ممکن است دارای CRLF باشد.

بررسی:

file script.sh

تبدیل:

dos2unix script.sh

یا:

sed -i 's/\r$//' script.sh

Syntax اشتباه Cron

مثال اشتباه:

60 * * * *

دقیقه باید بین:

0-59

باشد.

یا:

25 * * * *

به معنی دقیقه 25 هر ساعت است، نه هر 25 دقیقه.

برای هر 25 دقیقه:

*/25 * * * *

البته در این حالت اجرا در دقیقه‌های:

0
25
50

انجام می‌شود.


اجرای هر 90 دقیقه

Cron پنج‌فیلدی برای بعضی بازه‌های غیرمنطبق مثل دقیقاً «هر 90 دقیقه از زمان آخرین اجرا» مناسب نیست.

می‌توان از:

  • چند Schedule مشخص
  • systemd Timer
  • Script با State
  • Scheduler داخلی Application

استفاده کرد.

برای زمان‌بندی‌های پیچیده، systemd timer معمولاً کنترل دقیق‌تری ارائه می‌کند.


Cron یا Systemd Timer؟

| ویژگی | Cron | systemd Timer |
|:—:|:—:|
| راه‌اندازی ساده | بسیار خوب | متوسط |
| Syntax کوتاه | بله | خیر |
| Dependency | محدود | قوی |
| Logging | جداگانه | Journal |
| اجرای Job از دست‌رفته بعد از Boot | محدود | قابل تنظیم |
| کنترل User/Resource | محدود | گسترده |
| هماهنگی با Service | محدود | بسیار خوب |

برای کارهای ساده:

Cron

مناسب است.

برای Jobهای سیستمی مهم و پیچیده:

systemd Timer

می‌تواند انتخاب بهتری باشد.


مدیریت دسترسی Cron

در برخی سیستم‌ها فایل‌های زیر وجود دارند:

/etc/cron.allow
/etc/cron.deny

این فایل‌ها می‌توانند مشخص کنند چه Userهایی اجازه استفاده از crontab داشته باشند.

بررسی:

ls -l /etc/cron.allow /etc/cron.deny 2>/dev/null

تنظیم دقیق آن‌ها به Cron implementation و توزیع سیستم بستگی دارد.


بکاپ گرفتن از Crontab

برای User فعلی:

crontab -l > crontab-backup.txt

برای root:

sudo crontab -l > root-crontab-backup.txt

Restore:

crontab crontab-backup.txt

قبل از Restore محتوا را بررسی کنید.


کپی Crontab اشتباه است؟

نباید خروجی Crontab User را بدون بررسی مستقیم داخل /etc/crontab کپی کنید؛ زیرا ساختار این دو متفاوت است.

User Crontab:

0 2 * * * /root/backup.sh

System Crontab:

0 2 * * * root /root/backup.sh

در System Crontab ستون User وجود دارد.


نمایش Cronهای تمام کاربران

با Root می‌توانید Spoolهای Cron را بررسی کنید، اما مسیر آن بسته به توزیع متفاوت است.

روش امن‌تر برای User مشخص:

crontab -u USERNAME -l

برای پیدا کردن Cronهای سیستمی نیز مسیرهای زیر را بررسی کنید:

/etc/crontab
/etc/cron.d/
/etc/cron.hourly/
/etc/cron.daily/
/etc/cron.weekly/
/etc/cron.monthly/

پیدا کردن Cronهای مشکوک

در بررسی امنیتی سرور، Cron Jobها را فراموش نکنید.

بررسی Root:

crontab -l

بررسی فایل‌های سیستمی:

cat /etc/crontab
ls -la /etc/cron.d/

جست‌وجوی Commandهای مشکوک:

grep -RniE 'curl|wget|nc|bash -c|python|perl' \
/etc/cron.d \
/etc/crontab \
/var/spool/cron 2>/dev/null

وجود این Commandها الزاماً مخرب نیست، اما باید علت آن‌ها مشخص باشد.


نکات امنیتی Cron

  • Cron Script را فقط برای Userهای مجاز قابل‌نوشتن کنید.
  • Scriptهای root نباید توسط User عادی قابل تغییر باشند.
  • از Absolute Path استفاده کنید.
  • Password را مستقیم داخل Crontab قرار ندهید.
  • Output Jobهای مهم را Log کنید.
  • فایل‌های Backup را در مسیر عمومی سایت قرار ندهید.
  • برای Jobهای طولانی از flock استفاده کنید.
  • برای Jobهای حساس از Timeout استفاده کنید.
  • Crontabهای root را دوره‌ای بررسی کنید.
  • Jobهای قدیمی و بدون استفاده را حذف کنید.
  • Script را قبل از اضافه‌کردن به Cron دستی تست کنید.

نمونه Cron امن برای Backup

SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

0 2 * * * /usr/bin/flock -n /var/lock/mysql-backup.lock /root/mysql-backup.sh >> /var/log/mysql-backup.log 2>&1

این Job:

  • هر روز ساعت 2 اجرا می‌شود.
  • از اجرای هم‌زمان جلوگیری می‌کند.
  • Output و Error را Log می‌کند.
  • PATH مشخص دارد.

دستورات پرکاربرد Cron

دستورکاربرد
crontab -eویرایش Cron
crontab -lمشاهده Cron
crontab -rحذف تمام Cronهای User
crontab -u user -eویرایش Cron User دیگر
crontab -u user -lمشاهده Cron User دیگر
systemctl status cronوضعیت Cron در Ubuntu
systemctl status crondوضعیت Cron در RHEL-based
journalctl -u cronLog سرویس Cron
journalctl -u crondLog سرویس crond
command -v CMDپیدا کردن مسیر Command
flockجلوگیری از اجرای هم‌زمان
timeoutمحدودکردن زمان اجرا

چند نمونه کاربردی آماده

هر دقیقه:

* * * * * /root/script.sh

هر 5 دقیقه:

*/5 * * * * /root/script.sh

هر ساعت:

0 * * * * /root/script.sh

روزانه ساعت 2:

0 2 * * * /root/script.sh

هر دوشنبه ساعت 3:

0 3 * * 1 /root/script.sh

روز اول ماه:

0 2 1 * * /root/script.sh

هنگام Boot:

@reboot /root/script.sh

هر 10 دقیقه با Log:

*/10 * * * * /root/script.sh >> /var/log/script.log 2>&1

هر 5 دقیقه بدون اجرای هم‌زمان:

*/5 * * * * /usr/bin/flock -n /var/lock/script.lock /root/script.sh

چک‌لیست عیب‌یابی Cron

  • سرویس cron یا crond فعال است.
  • Cron Job با crontab -l وجود دارد.
  • Syntax زمان‌بندی صحیح است.
  • Script به‌صورت دستی اجرا می‌شود.
  • User صحیح Cron را اجرا می‌کند.
  • Permission فایل و Directoryها صحیح است.
  • Shebang Script صحیح است.
  • Path Commandها کامل است.
  • PATH موردنیاز تعریف شده است.
  • Working Directory در صورت نیاز تعیین شده است.
  • Environment Variableهای لازم وجود دارند.
  • Log خروجی تعریف شده است.
  • Timezone سرور صحیح است.
  • Job قبلی هنوز در حال اجرا نیست.
  • flock در صورت نیاز استفاده شده است.
  • Logهای Cron بررسی شده‌اند.

مطالعات بیشتر

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

  • مستندات crontab(5) در Linux man-pages — ساختار فایل Crontab و فیلدهای زمان‌بندی
  • مستندات crontab(1) — مدیریت Crontab کاربران
  • مستندات Cron مربوط به توزیع Linux مورد استفاده
  • آموزش کامل systemctl در لینوکس — مقاله مرتبط در دانش‌نامه
  • ساخت سرویس سفارشی در systemd — مقاله مرتبط در دانش‌نامه
  • آموزش کامل دستور chmod در لینوکس — مقاله مرتبط در دانش‌نامه
  • آموزش کامل دستور chown در لینوکس — مقاله مرتبط در دانش‌نامه
  • آموزش فایل sudoers در لینوکس — مقاله مرتبط در دانش‌نامه

جمع‌بندی

Cron یکی از ابزارهای اصلی Linux برای اجرای خودکار دستورات و Scriptها در زمان مشخص است.

برای ویرایش Cron Jobهای User فعلی:

crontab -e

برای مشاهده آن‌ها:

crontab -l

ساختار اصلی Cron:

Minute Hour Day-of-Month Month Day-of-Week Command

برای مثال اجرای Backup هر روز ساعت 2:

0 2 * * * /root/backup.sh

و اجرای Script هر 5 دقیقه:

*/5 * * * * /root/check.sh

یکی از مهم‌ترین نکات Cron این است که Environment آن با Terminal معمولی متفاوت است. بنابراین بهتر است از مسیر کامل Commandها استفاده شود و در Jobهای مهم Output و Error داخل Log ذخیره شوند.

برای Jobهایی که ممکن است بیش از فاصله زمان‌بندی طول بکشند نیز استفاده از flock توصیه می‌شود:

*/5 * * * * /usr/bin/flock -n /var/lock/job.lock /root/job.sh

در زمان عیب‌یابی ابتدا وضعیت سرویس Cron، سپس crontab -l، اجرای دستی Script و در نهایت Logهای cron یا crond را بررسی کنید.

Cron برای زمان‌بندی‌های ساده و روزمره بسیار مناسب است؛ اما برای Jobهای پیچیده‌ای که به Dependency، Logging دقیق، Restart Policy یا کنترل بیشتر نیاز دارند، استفاده از systemd Timer می‌تواند انتخاب مناسب‌تری باشد.

هنوز نیاز به کمک دارید؟

آیا سوالی دارید؟

آیا این مقاله برای شما مفید بود؟ بله خیر

نظرات خود را بنویسید... لغو پاسخ

اشتراک گذاری این مقاله

آموزش کامل cron

کپی کردن لینک

Clipboard Icon

جدیدترین مقالات

آموزش نصب و راه‌اندازی RustDesk Server با Docker
آموزش نصب و راه‌اندازی RustDesk Server با Docker
2 minutes جولای 2, 2026
آموزش نصب و راه‌اندازی Matrix Synapse + Element Web + Coturn با Docker روی ...
4 minutes جولای 2, 2026
CXS چیست و چگونه کار می‌کند
1 minute می 3, 2026
ساخت سرور چت المنت بروی لینوکس
5 minutes آوریل 25, 2026
Geo Routing و Geo DNS
2 minutes آوریل 22, 2026

تقویم

سپتامبر 2026
شیدسچپج
 1234
567891011
12131415161718
19202122232425
2627282930 
« جولای    

عضویت

جدیدترین پست‌ها

آموزش نصب و راه‌اندازی RustDesk Server با Docker
آموزش نصب و راه‌اندازی RustDesk Server با Docker
2 minutes جولای 2, 2026
آموزش نصب و راه‌اندازی Matrix Synapse + Element Web + Coturn با Docker روی Ubuntu 24.04
4 minutes جولای 2, 2026
CXS چیست و چگونه کار می‌کند
1 minute می 3, 2026
ساخت سرور چت المنت بروی لینوکس
5 minutes آوریل 25, 2026
Geo Routing و Geo DNS
2 minutes آوریل 22, 2026

سلام