💻 آخرین فرصت یادگیری برنامه‌نویسی با آفر ویژه قبل از افزایش قیمت در ۱۵ آذر ماه (🎁 به همراه یک هدیه ارزشمند )
۰ ثانیه
۰ دقیقه
۰ ساعت
۱۰ mohammad dadkhah
تمرین تمرین
جامعه لینوکس و دواپس ایجاد شده در ۱۹ فروردین ۱۴۰۲

سلام عرض ادب واحترام

سوال: من می‌خواهم هر بعدظهر ساعت 16.45 بیاید از یک سری فایل‌ها را آرشیو و فشرده کند به این شکل نوشتم

45 16 * * * tar -Jcf /home/Document/1402/notebook-Roadmap-`date +%Y/%m/%d` /home/Document/1402/notebook-Roadmap/*.txt

لطفا راهنمایی کنید که من کجا را اشتباه کردم

چون این خط کد در crontab -e قرار دادم اما عملی که می‌خواستم انجام نشد.

سلام محمد عزیز

با توجه به کدی که ارائه دادید، به نظر می‌رسد که شما از فرمت درستی برای تعیین زمان اجرای کد استفاده نکرده‌اید. برای اینکه کد شما هر بعد از ظهر ساعت 16:45 اجرا شود، باید فرمت cron را به شکل زیر تغییر دهید:

45 16 * * * tar -Jcf /home/Document/1402/notebook-Roadmap-`date +\\%Y/\\%m/\\%d` /home/Document/1402/notebook-Roadmap/*.txt

تفاوت این کد با کدی که ارائه داده‌اید، در استفاده از escape character برای کاراکترهای % است. در فرمت cron باید از علامت % به عنوان کاراکتر escape استفاده کنید.

اگر باز هم اجرای کد انجام نشد، می‌توانید لاگ‌های cron را بررسی کنید تا دلیل اجرا نشدن کد را پیدا کنید. لاگ‌های cron در مسیر /var/log/syslog وجود دارند و شما می‌توانید با دستور tail این فایل را مشاهده کنید. برای مثال:

sudo tail -f /var/log/syslog | grep CRON

این دستور باعث می‌شود تا لاگ‌های مربوط به cron در خروجی نمایش داده شوند. در صورتی که مشکل را نتوانید حل کنید، می‌توانید پیغام خطا را به من ارسال کنید تا در مورد آن راهنمایی کنم.

احمدرضا فاطمی کیا ۲۰ فروردین ۱۴۰۲، ۱۱:۲۷

سلام

syslog ام را یک نگاه کنید

Apr 12 17:28:18 md-Lenovo-G510 crontab[69712]: (m-d) LIST (m-d)
Apr 12 17:28:35 md-Lenovo-G510 crontab[69753]: (m-d) BEGIN EDIT (m-d)
Apr 12 17:28:58 md-Lenovo-G510 crontab[69753]: (m-d) REPLACE (m-d)
Apr 12 17:28:58 md-Lenovo-G510 crontab[69753]: (m-d) END EDIT (m-d)
Apr 12 17:29:01 md-Lenovo-G510 cron[892]: (m-d) RELOAD (crontabs/m-d)
Apr 12 17:30:01 md-Lenovo-G510 CRON[69905]: (root) CMD ([ -x /etc/init.d/anacron ] && if [ ! -d /run/systemd/system ]; then /usr/sbin/invoke-rc.d anacron start >/dev/null; fi)
Apr 12 17:31:09 md-Lenovo-G510 systemd[1]: Started Run anacron jobs.
Apr 12 17:31:09 md-Lenovo-G510 anacron[70029]: Anacron 2.3 started on 2023-04-12
Apr 12 17:31:09 md-Lenovo-G510 anacron[70029]: Normal exit (0 jobs run)
Apr 12 17:31:09 md-Lenovo-G510 systemd[1]: anacron.service: Deactivated successfully.

اومدم در crontab تایم اش را edit کردم در تایم 17:28:58 که لاگ اش افتاده

اما crontab ای که برای تایم 17:35:00 قرار دادم اما لاگ ای در این تایم ثبت نکرده است و اون کامند هم انجام نشده است

لطفا راهنمایی کنید


mohammad dadkhah ۲۳ فروردین ۱۴۰۲، ۱۴:۱۴
 53 17 * * * tar -zcf /home/m-d/Documents/1402/notebook-Roadmap-`date +\\%Y/\\%m/\\%d` /home/m-d/Documents/1402/notebook-Roadmap/Month*.txt
mohammad dadkhah ۲۳ فروردین ۱۴۰۲، ۱۴:۲۷

در اینجا، شما به صورت دوره‌ای یک کامند جهت فشرده‌سازی فایل‌ها با استفاده از tar را برای ساعت 17:53 تعریف کرده‌اید.

در لاگ‌هایی که ارائه داده‌اید، ابتدا کاربر m-d در crontab خودش را ویرایش کرده و سپس سیستم cron در تاریخ 12 آوریل اجرا شده است. سپس، سرویس anacron راه‌اندازی شده است و با موفقیت اجرا شده است. اما لاگی در مورد اجرای کامند تنظیم شده در crontab شما در ساعت 17:53 ذکر نشده است.

برای بررسی مشکل، می‌توانید فایل syslog یا دیگر فایل‌های لاگ مرتبط با cron و crontab را بررسی کنید تا ببینید آیا در آنجا هرگونه خطایی وجود دارد یا نه. همچنین، می‌توانید با استفاده از دستورات مانیتورینگ سیستم مانند top، ps و netstat بررسی کنید که آیا فرآیند cron در حال اجراست یا خیر.

احمدرضا فاطمی کیا ۲۳ فروردین ۱۴۰۲، ۱۶:۲۷

سلام

با ابزار‌های مانیتورینگ چه طور می‌توانم متوجه شوم که علت اجرا نشدن crontab تنظیم شده را؟

لطفا مثالی بزنید

mohammad dadkhah ۲۵ فروردین ۱۴۰۲، ۱۳:۳۶

سلام!

برای پیدا کردن علت اجرا نشدن crontab تنظیم شده، می‌توانید از ابزارهایی مانند "syslog" و "cron log" استفاده کنید. این ابزارها به شما امکان می‌دهند بررسی کنید که آیا crontab شما درست تنظیم شده است یا خیر و اگر مشکلی وجود دارد، به چه علتی است.

برای مثال، فرض کنید که یک crontab برای اجرای یک اسکریپت با نام "myscript.sh" هر دو ساعت یکبار تنظیم کرده‌اید. برای بررسی اجرا نشدن این crontab، می‌توانید به لاگ‌های سیستم عامل خود مراجعه کنید. برای مثال، اگر از سیستم عامل لینوکس استفاده می‌کنید، می‌توانید با دستور "grep CRON /var/log/syslog" و یا "grep cron /var/log/messages" لاگ‌های cron را بررسی کنید.

اگر مشکلی در اجرای crontab شما وجود داشته باشد، می‌توانید پیام‌های خطا و اطلاعات دیگری که در لاگ‌ها ذخیره شده است را بررسی کنید. برای مثال، اگر در لاگ‌های سیستم شما پیامی مانند "cannot execute script" یا "command not found" دیدید، ممکن است به دلیل عدم دسترسی به فایل اسکریپت یا عدم وجود دستور اجرای آن باشد.

به علاوه، می‌توانید از ابزارهایی مانند "crontab checker" استفاده کنید که به شما امکان می‌دهد که فرمت crontab خود را بررسی کنید و مطمئن شوید که هیچ خطایی در آن وجود ندارد.

با استفاده از این ابزارها و بررسی لاگ‌های سیستم، می‌توانید علت اجرا نشدن crontab تنظیم شده خود را پیدا کنید و مشکلات آن را برطرف کنید.

احمدرضا فاطمی کیا ۲۵ فروردین ۱۴۰۲، ۱۴:۳۲

سلام عرض ادب و احترام

ابزار "crontab checker

استفاده کردم مشکلی نداشت

متاسفانه تنها مشکلی که دارم این است که لاگ ای ثبت نمی‌شود

اگر برای تان امکان دارد یک anydesk بگیریم تا خودتان از نزدیک مشکل را مشاهده کنید

mohammad dadkhah ۲۶ فروردین ۱۴۰۲، ۰۸:۳۰

با توجه به لاگ‌هایی که ارائه داده‌اید، به نظر می‌رسد که cronjob شما اجرا نشده است و مشکلی در ساختار کد cronjob وجود دارد. برای رفع این مشکل، می‌توانید مراحل زیر را انجام دهید:

1- برای مطمئن شدن از ساختار کد cronjob خود و جلوگیری از وجود خطا در آن، می‌توانید از دستور زیر در خط فرمان استفاده کنید:

* * * * * /bin/echo "Hello World" >> /home/user/cron.log

این دستور به این صورت عمل می‌کند که هر دقیقه یکبار رشته "Hello World" را به فایل /home/user/cron.log اضافه می‌کند. در صورتی که این دستور کار کند، می‌توانید به قدم بعدی بروید.

2- به عنوان کاربر root وارد فایل /var/log/syslog شوید تا لاگ‌های cron را بررسی کنید:

sudo tail -f /var/log/syslog | grep CRON

3- دستور cronjob خود را بررسی کنید و مطمئن شوید که فرمت زمانی آن درست است و دستور شما به درستی اجرا می‌شود.

4- مطمئن شوید که مسیر فایل‌هایی که باید فشرده شوند، درست است و فایل‌هایی در آن موجود هستند.

5- در صورت بروز هر گونه خطا، پیغام خطا را دریافت کرده و آن را بررسی کنید.

6- در صورتی که مشکلی پیدا نکردید، می‌توانید به مستندات cron برای بررسی بیشتر درباره cronjob‌ها مراجعه کنید.

بهترین پاسخ
احمدرضا فاطمی کیا ۲۶ فروردین ۱۴۰۲، ۱۹:۲۱

سلام عرض ادب و احترام

این کدی که گفتید

* * * * * /bin/echo "Hello World" >> /home/user/cron.log

با permission root

منظور تان از خط فرمان همون ترمینال بش است ؟

اگه این بود زدم اما ارور میده

root@md-Lenovo-G510:~# * * * * * /bin/echo "Hello World" >> /home/m-d/cron.log
*: command not found

2-حالا با یوزر روت در crontab اجرا می‌کنم

* * * * * /bin/echo "Hello World" >> /home/user/cron.log

این کدی که گفتید در

root@md-Lenovo-G510:~# crontab -e
crontab: installing new crontab
root@md-Lenovo-G510:~# sudo tail -f /var/log/syslog | grep CRON
Apr 18 18:52:01 md-Lenovo-G510 CRON[9017]: (root) CMD (/bin/echo "Hello World" >> /home/user/cron.log)
Apr 18 18:52:01 md-Lenovo-G510 CRON[9016]: (CRON) info (No MTA installed, discarding output)
Apr 18 18:53:01 md-Lenovo-G510 CRON[9149]: (root) CMD (/bin/echo "Hello World" >> /home/user/cron.log)
Apr 18 18:53:01 md-Lenovo-G510 CRON[9148]: (CRON) info (No MTA installed, discarding output)
Apr 18 18:54:01 md-Lenovo-G510 CRON[9282]: (root) CMD (/bin/echo "Hello World" >> /home/user/cron.log)
Apr 18 18:54:01 md-Lenovo-G510 CRON[9281]: (CRON) info (No MTA installed, discarding output)
Apr 18 18:55:01 md-Lenovo-G510 CRON[9406]: (root) CMD (/bin/echo "Hello World" >> /home/user/cron.log)
Apr 18 18:55:01 md-Lenovo-G510 CRON[9405]: (CRON) info (No MTA installed, discarding output)
Apr 18 18:56:01 md-Lenovo-G510 CRON[9515]: (root) CMD (/bin/echo "Hello World" >> /home/user/cron.log)
Apr 18 18:56:01 md-Lenovo-G510 CRON[9514]: (CRON) info (No MTA installed, discarding output)
Apr 18 18:57:01 md-Lenovo-G510 CRON[9643]: (root) CMD (/bin/echo "Hello World" >> /home/user/cron.log)
Apr 18 18:57:01 md-Lenovo-G510 CRON[9640]: (CRON) info (No MTA installed, discarding output)

با یوزر روت به نظر میاد کار می‌کند اما

 /home/user/cron.log

این فایل وجود ندارد و چیزی قرار نمی‌گیرد.

3- حالا با یوزر غیر از روت اجرا میکنم

m-d@md-Lenovo-G510:~$ crontab -e
crontab: installing new crontab
m-d@md-Lenovo-G510:~$ sudo tail -f /var/log/syslog | grep CRON
[sudo] password for m-d:
Apr 18 19:03:01 md-Lenovo-G510 CRON[10338]: (m-d) CMD (/bin/echo "Hello World" >> /home/user/cron.log)
Apr 18 19:03:01 md-Lenovo-G510 CRON[10337]: (CRON) info (No MTA installed, discarding output)
Apr 18 19:04:01 md-Lenovo-G510 CRON[10443]: (m-d) CMD (/bin/echo "Hello World" >> /home/user/cron.log)
Apr 18 19:04:01 md-Lenovo-G510 CRON[10442]: (CRON) info (No MTA installed, discarding output)
Apr 18 19:05:01 md-Lenovo-G510 CRON[10546]: (m-d) CMD (/bin/echo "Hello World" >> /home/user/cron.log)
Apr 18 19:05:01 md-Lenovo-G510 CRON[10545]: (CRON) info (No MTA installed, discarding output)
Apr 18 19:06:01 md-Lenovo-G510 CRON[10651]: (m-d) CMD (/bin/echo "Hello World" >> /home/user/cron.log)
Apr 18 19:06:01 md-Lenovo-G510 CRON[10650]: (CRON) info (No MTA installed, discarding output)


این ارور

No MTA installed, discarding output

سرچ کردم میگن postfix نصب کنی مشکل حل میشه؟

mohammad dadkhah ۲۹ فروردین ۱۴۰۲، ۱۲:۱۲

سلام عرض ادب و احترام

postfix را نصب کردم مشکل حل شد و اون cronjob شما دارد اجرا می‌شود ولاگ می‌اندازد

یک سوال این bin/ ای که قبل از echo گذاشتید اجباری است؟

حالا می‌رم سراق cronjob خودم

mohammad dadkhah ۲۹ فروردین ۱۴۰۲، ۱۲:۲۹