چرا اسکریپت های crontab کار نمی کنند؟


به جواب پذیرفته شده بروید




اغلب ، crontab اسکریپت ها به صورت برنامه یا مطابق آنچه انتظار می رود اجرا نمی شوند. دلایل متعددی برای آن وجود دارد:

  1. نشانه گذاری اشتباه crontab
  2. مشکل مجوزها
  3. متغیرهای محیطی

این ویکی جامعه قصد دارد دلایل اصلی عدم اجرای crontab اسکریپت ها را همانطور که انتظار می رود جمع کند. هر دلیل را در یک پاسخ جداگانه بنویسید.

لطفاً یک دلیل را برای هر پاسخ درج کنید - جزئیات مربوط به دلیل عدم اجرای آن - و دلایل اصلی آن را حل کنید.

لطفاً فقط مسائل مربوط به Cron را بنویسید ، به عنوان مثال ، دستوراتی که مطابق آنچه انتظار می رود از پوسته باشد ، انجام می دهد اما به اشتباه توسط cron انجام می شود.


534









30 :تعداد پاسخها


محیط متفاوت

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

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

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

"gotcha" متداول در اینجا PATH متغیر محیط متفاوت است. شاید اسکریپت خود را با استفاده از دستور somecommand یافت در /opt/someApp/bin ، که شما به آن اضافه کردهاید PATH در /etc/environment ؟ cron PATH از آن پرونده چشم پوشی می کند ، بنابراین somecommand هنگام اجرا با cron ، اجرای برنامه از اسکریپت شما ناکام می ماند ، اما در یک ترمینال کار می کنید. شایان ذکر است که متغیرهای /etc/environment مربوط به کار به cron منتقل می شوند ، فقط متغیرهای cron به طور خاص خود را تعیین نمی کنند ، مانند PATH .

برای دستیابی به آن ، فقط PATH متغیر مورد نظر خود را در بالای اسکریپت تنظیم کنید. به عنوان مثال

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

# rest of script follows
 

برخی ترجیح می دهند در عوض فقط از مسیرهای مطلق برای همه دستورات استفاده کنند. من مخالف آن توصیه می کنم در نظر بگیرید که اگر می خواهید اسکریپت خود را بر روی یک سیستم دیگر اجرا کنید و در /opt/someAppv2.2/bin عوض ، آن دستور را انجام دهید . شما می خواهم که از طریق تمام اسکریپت جایگزین رفتن /opt/someApp/bin با /opt/someAppv2.2/bin به جای فقط انجام یک ویرایش کوچک در خط اول از اسکریپت.

همچنین می توانید متغیر PATH را در پرونده crontab تنظیم کنید ، که در مورد همه کارهای cron اعمال خواهد شد. به عنوان مثال

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

15 1 * * * backupscript --incremental /home /root
 

512



top got من: اگر فراموش کردید که در انتهای crontab فایل خط جدیدی اضافه کنید. به عبارت دیگر ، پرونده crontab باید با یک خط خالی پایان یابد.

در زیر بخش مربوطه در صفحات man برای این شماره ( man crontab سپس به آخر بروید):

    Although cron requires that each entry in a crontab end  in  a  newline
   character,  neither the crontab command nor the cron daemon will detect
   this error. Instead, the crontab will appear to load normally. However,
   the  command  will  never  run.  The best choice is to ensure that your
   crontab has a blank line at the end.

   4th Berkeley Distribution      29 December 1993               CRONTAB(1)
 

341



کرون Daemon در حال اجرا نیست. من واقعاً چند ماه پیش با این کار پیچیدم.

نوع:

 pgrep cron 
 

اگر شماره ای نبینید ، cron در حال اجرا نیست. sudo /etc/init.d/cron start می تواند مورد استفاده قرار گیرد برای شروع cron.

ویرایش: به جای فراخوانی اسکریپت های اولیه از طریق /etc/init.d ، از ابزار سرویس استفاده کنید ، به عنوان مثال

 sudo service cron start
 

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

 sudo systemctl start cron
 

139



نام فایل اسکریپت در cron.d/ ، cron.daily/ ، cron.hourly/ ، و غیره، نه حاوی نقطه ( . )، در غیر این صورت اجرا قطعات جست و خیز آنها خواهد شد.

قطعات یدکی (8) را مشاهده کنید:

    If neither the --lsbsysinit option nor the --regex option is given then
   the names must consist entirely of upper and lower case  letters,  dig‐
   its, underscores, and hyphens.

   If  the  --lsbsysinit  option  is given, then the names must not end in
   .dpkg-old  or .dpkg-dist or .dpkg-new or .dpkg-tmp, and must belong  to
   one  or more of the following namespaces: the LANANA-assigned namespace
   (^[a-z0-9]+$);   the   LSB   hierarchical   and   reserved   namespaces
   (^_?([a-z0-9_.]+-)+[a-z0-9]+$);  and  the  Debian cron script namespace
   (^[a-zA-Z0-9_-]+$).
 

بنابراین ، اگر یک اسکریپت cron دارید backup.sh ، analyze-logs.pl در cron.daily/ فهرست ، بهتر است اسامی پسوند را حذف کنید.


92



در بسیاری از محیط ها cron دستورهایی را با استفاده از آن اجرا می کند sh ، در حالی که بسیاری از افراد تصور می کنند از آن استفاده می کنند bash .

پیشنهاداتی برای آزمایش یا رفع این مشکل برای یک فرمان ناقص:

  • دستور را اجرا کنید sh تا ببینید که آیا این کار دارد:

     sh -c "mycommand"
     
  • دستور را در زیر برگه bash بپیچید تا مطمئن شوید که در bash اجرا شده است:

     bash -c "mybashcommand"
     
  • با تنظیم پوسته در بالای crontab خود ، به cron بگویید که تمام دستورات را در حالت bash اجرا کند:

     SHELL=/bin/bash
     
  • اگر دستور اسکریپت است ، اطمینان حاصل کنید که این اسکریپت حاوی shebang است:

     #!/bin/bash
     

68



من در حوزه های زمانی مشکلاتی داشتم. کرون با منطقه زمان نصب جدید در حال اجرا بود. راه حل شروع مجدد كرون بود:

 sudo service cron restart
 

41



مسیر مطلق باید برای اسکریپت ها استفاده شود:

به عنوان مثال ، /bin/grep باید به جای استفاده شود grep :

 # m h  dom mon dow   command
0 0 *  *  *  /bin/grep ERROR /home/adam/run.log &> /tmp/errors
 

بجای:

 # m h  dom mon dow   command
0 0 *  *  *  grep ERROR /home/adam/run.log &> /tmp/errors
 

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


36



اگر دستور crontab شما % نمادی در آن دارد ، cron سعی می کند آن را تفسیر کند. بنابراین اگر از هر دستوری با % آن استفاده می کنید (مانند مشخصات قالب به دستور date) باید از آن فرار کنید.

این و سایر موارد خوب اینجا:
http://www.pantz.org/software/cron/croninfo.html


33



کرون اسکریپتی را فراخوانی می کند که قابل اجرا نیست.

با اجرای chmod +x /path/to/scrip فیلمنامه اجرایی می شود و باید این مسئله را برطرف کرد.


25



همچنین ممکن است رمز عبور کاربر منقضی شده باشد. حتی رمز عبور root می تواند منقضی شود. می توانید tail -f /var/log/cron.log مشاهده کنید که cron با گذشت رمز عبور خراب است. با این کار می توانید گذرواژه را تنظیم کنید که هرگز منقضی نشود: passwd -x -1 <username>

در بعضی از سیستم ها (Debian ، Ubuntu) ورود به سیستم به طور پیش فرض فعال نیست. در /etc/rsyslog.conf یا /etc/rsyslog.d/50-default.conf خط:

 # cron.*                          /var/log/cron.log
 

باید ویرایش شود ( sudo nano /etc/rsyslog.conf ) بدون شرح برای:

 cron.*                          /var/log/cron.log
 

پس از آن ، باید راه اندازی مجدد rsyslog را از طریق انجام دهید

 /etc/init.d/rsyslog restart
 

یا

 service rsyslog restart 
 

منبع: ورود به سیستم crontab را در Debian Linux فعال کنید

در بعضی از سیستم ها (اوبونتو) پرونده جداگانه برای cron به طور پیش فرض فعال نمی شود ، اما پرونده های مربوط به cron در پرونده syslog ظاهر می شوند. ممکن است شخصی استفاده کند

 cat /var/log/syslog | grep cron -i
 

برای مشاهده پیامهای مربوط به cron


24



اگر درخواست شما از برنامه های GUI فراخوانی شده است ، باید به آنها بگویید که از چه DISPLAY استفاده کنند.

مثال: پرتاب Firefox با cron.

فیلمنامه شما باید export DISPLAY=:0 جایی باشد.


18



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

توجه داشته باشید که یک راه حل معمول اجرای همه موارد با استفاده از crontab root است که گاهی اوقات ایده ای بد واقعاً بد است. تعیین مجوزهای مناسب قطعاً موضوعی است که نادیده گرفته می شود.


15



مجوز جدول ناامن Cron

اگر مجوز آن ناامن باشد ، جدول كرون رد می شود

 sudo service cron restart
grep -i cron /var/log/syslog|tail -2
2013-02-05T03:47:49.283841+01:00 ubuntu cron[49906]: (user) INSECURE MODE (mode 0600 expected) (crontabs/user)
 

مشکل با آن حل شده است

 # correct permission
sudo chmod 600 /var/spool/cron/crontabs/user
# signal crond to reload the file
sudo touch /var/spool/cron/crontabs
 

14



فیلمنامه حساس به مکان است. این مربوط به همیشه استفاده از مسیرهای مطلق در یک فیلمنامه است ، اما کاملاً یکسان نیست. ممکن است کار cron شما cd قبل از اجرا نیاز به یک فهرست خاص داشته باشد ، برای مثال ممکن است یک وظیفه چنگک در برنامه Rails برای یافتن وظیفه صحیح نیاز به ریشه برنامه داشته باشد ، نه به ذکر پیکربندی مناسب بانک اطلاعاتی ، و غیره.

بنابراین یک ورودی crontab از

23 3 * * * /usr/bin/rake db:session_purge RAILS_ENV=production

بهتر خواهد بود

23 3 * * * cd / var / www / تولید / جریان && / usr / سطل / شیب db: session_purge RAILS_ENV = تولید

یا ، برای حفظ ورودی کرنتاب ساده تر و شکننده تر:

23 3 * * * /home/<user>/scripts/session-purge.sh

با کد زیر در /home/<user>/scripts/session-purge.sh :

cd / var / www / تولید / جریان
/ usr / bin / rake db: session_purge RAILS_ENV = تولید

12



مشخصات Crontab که در گذشته کار می کردند می توانند هنگام انتقال از پرونده crontab به پرونده دیگر شکسته شوند. بعضی اوقات دلیل این است که شما مشخصات را از یک فایل crontab سیستم به پرونده crontab کاربر یا برعکس منتقل کرده اید.

قالب مشخصات کاری cron بین پرونده های crontab ((var / spool / cron / username) یا / var / spool / cron / crontabs / username) و crontabs سیستم ( /etc/crontab و پرونده های موجود در /etc/cron.d ) متفاوت است.

crontab های سیستم درست قبل از اجرای دستور ، دارای یک "کاربر" اضافی هستند.

این امر باعث ایجاد خطا در بیان مواردی از قبیل george; command not found وقتی می توانید یک فرمان را از داخل /etc/crontab یا یک پرونده /etc/cron.d به پرونده crontab کاربر منتقل کنید.

برعکس ، /usr/bin/restartxyz is not a valid username هنگام وقوع معکوس ، cron خطاهایی مانند یا مشابه را ارائه می دهد.


11



cron script از یک فرمان با گزینه --verbose استفاده می کند

من یک اسکریپت cron روی من شکست خورد زیرا من هنگام تایپ فیلمنامه در حالت خلبان اتوماتیک بودم و گزینه --verbose را نیز شامل می شدم:

 #!/bin/bash
some commands
tar cvfz /my/archive/file.tar.gz /my/shared/directory
come more commands
 

این اسکریپت هنگام اجرا از پوسته خوب اجرا شد ، اما هنگام اجرا از crontab شکست خورد زیرا خروجی فعل در هنگام اجرا از پوسته به سمت stdout می رود ، اما هیچ جا در هنگام اجرا از crontab نیست. رفع آسان برای حذف "v":

 #!/bin/bash
some commands
tar cfz /my/archive/file.tar.gz /my/shared/directory
some more commands
 

10



شایع ترین دلیلی که من در یک برنامه نادرست اعلام شده شکست خوردم. مشخص کردن شغل برنامه ریزی شده برای ساعت 11:15 بعد از ظهر یا به 15 23 * * * جای آن عملی است . روز هفته برای مشاغل بعد از نیمه شب نیز اشتباه می گیرد MF بعد از نیمه شب است ، نه . تاریخ های خاص معمولاً یک مشکل هستند زیرا بندرت از آنها استفاده نمی کنیم ، 3 مارس نیست. اگر مطمئن نیستید ، برنامه های Cron خود را بصورت آنلاین در https://crontab.guru/ بررسی کنید . * * 11 15 * 11 15 * * * 2-6 1-5 * * 3 1 * https://crontab.guru/

اگر کار شما با سیستم عامل های مختلف با استفاده از گزینه های پشتیبانی نشده مانند 2/3 مشخصات زمان نیز می تواند باعث خرابی شود. این یک گزینه بسیار مفید است اما در دسترس جهانی نیست. من همچنین با لیست هایی مانند 1-5 یا مشکلاتی را مشاهده کرده ام 1,3,5 .

استفاده از مسیرهای غیرمجاز نیز باعث بروز مشکلاتی شده است. مسیر پیش فرض معمولاً /bin:/usr/bin به این صورت است که فقط دستورات استاندارد اجرا می شوند. این دایرکتوری ها معمولاً دستور مورد نظر را ندارند. این همچنین بر اسکریپت ها با استفاده از دستورات غیر استاندارد تأثیر می گذارد. سایر متغیرهای محیط نیز می توانند از دست نروند.

قلاب زدن به یک crontab موجود کاملاً برایم مشکلاتی ایجاد کرده است. اکنون از یک کپی پرونده بارگیری می کنم. در صورت لخته شدن ، می توانید با استفاده از crontab موجود بهبود crontab -l یابید. کپی crontab را در ~ / bin نگه می دارم. در کل اظهار نظر می شود و با خط پایان می یابد # EOF . این روزانه بارگیری می شود از ورودی crontab مانند:

#! / usr / bin / crontab
# بارگیری مجدد این crontab
#
54 12 * * * $ {خانه} / بن / کرنتاب

فرمان بارگذاری مجدد در بالا متکی به یک کرتابل اجرا شده با یک مسیر انفجار در حال اجرا است. برخی از سیستم ها به فرمان crontab در حال اجرا و مشخص کردن پرونده نیاز دارند. اگر دایرکتوری به اشتراک گذاشته شده در شبکه باشد ، من اغلب از آن crontab.$(hostname) به عنوان نام پرونده استفاده می کنم. این در نهایت مواردی را که بارگذاری اشتباه crontab روی سرور اشتباه انجام می شود ، اصلاح می کند.

با استفاده از فایل ، نسخه پشتیبان تهیه شده از crontab را فراهم می کند ، و به ویرایش های موقت (تنها زمانی که استفاده می کنم crontab -e ) اجازه می دهد تا بصورت خودکار از آنها نسخه پشتیبان تهیه شود. هدرهایی در دسترس است که به درستی گرفتن پارامترهای برنامه ریزی کمک می کند. من وقتی کاربران بی تجربه می توانند crontab را ویرایش کنند ، آنها را اضافه کردم.

به ندرت ، من دستوراتی را اجرا کردم که به ورودی کاربر نیاز دارند. این موارد در زیر crontab انجام می شوند ، اگرچه برخی از آنها با تغییر مسیر ورودی کار می کنند.


10



اگر نظمی مانند این دارید:

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

و کار نمی کند و شما نمی توانید هیچ خروجی را ببینید ، لزوماً به این معنی نیست که cron کار نمی کند. اسکریپت می تواند شکسته شود و خروجی به stderr برسد که به / tmp / خروجی منتقل نشود. با گرفتن این خروجی نیز بررسی کنید که چنین نیست:

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

برای دیدن اینکه آیا این به شما کمک می کند مشکل خود را جلب کنید یا خیر.


8



اگر به یک حساب کاربری از طریق کلیدهای SSH دسترسی دارید امکان ورود به حساب کاربری وجود دارد اما متوجه نیستید که رمز ورود در حساب قفل شده است (به عنوان مثال به دلیل تلاش منقضی یا نامعتبر بودن رمز ورود)

اگر سیستم از PAM استفاده می کند و اکانت قفل شده است ، این می تواند مانع از اجرای آن شود. (من این را در سولاریس آزمایش کردم ، اما نه در اوبونتو)

ممکن است پیامهایی مانند این را در / var / adm / پیام پیدا کنید:

24 اکتبر 07:51:00 mybox cron [29024]: [ID 731128 auth.notice] pam_unix_account: cron در صدد اعتبارسنجی myuser حساب قفل شده از میزبان محلی
24 اکتبر 07:52:00 mybox cron [29063]: [ID 731128 auth.notice] pam_unix_account: cron در صدد اعتبارسنجی myuser حساب قفل شده از میزبان محلی
24 اکتبر 07:53:00 mybox cron [29098]: [ID 731128 auth.notice] pam_unix_account: cron در صدد اعتبارسنجی myuser حساب قفل شده از میزبان محلی
24 اکتبر 07:54:00 mybox cron [29527]: [ID 731128 auth.notice] pam_unix_account: cron در صدد اعتبارسنجی myuser حساب قفل شده از میزبان محلی

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

# passwd -u <USERNAME>

به عنوان root برای باز کردن حساب ، و crontab باید دوباره کار کند.


7



=== هشدار داکر ===

اگر از docker استفاده می کنید ،

من فکر می کنم مناسب است که اضافه کنم که من نتوانستم موفق به ایجاد cron برای اجرای در پس زمینه شوم.

برای اجرای یک کار cron در داخل ظرف ، من از سرپرست استفاده کردم و به cron -f همراه روند دیگر دویدم .

ویرایش: مسئله دیگر - من همچنین نتوانستم آنرا اجرا کنم که کانتینر را با شبکه HOST اجرا کردم. همچنین این شماره را در اینجا مشاهده کنید: https://github.com/phusion/baseimage-docker/issues/144


3



من مشغول نوشتن اسکریپت shell shell هستم که اسکریپت دیگری را برای پاک کردن داده های معاملات قدیمی از یک پایگاه داده ایجاد می کند. به عنوان بخشی از کار ، مجبور شد پیکربندی cron کار روزانه را برای اجرای در زمان دلخواه ، زمانی که بار بانک اطلاعات کم بود ، انجام دهیم.

من یک فایل mycronjob با برنامه cron ، نام کاربری و دستور ایجاد کردم و آن را در /etc/cron.d فهرست راهنمایی کپی کردم . دو گیت من:

  1. mycronjob پرونده باید برای اجرای آن متعلق به root باشد
  2. مجوزهای پرونده را باید به 644 تنظیم می کردم - 664 اجرا نمی شود.

مشکلی در مورد مجوز به نظر می رسد /var/log/syslog چیزی شبیه به:

 Apr 24 18:30:01 ip-11-22-33-44 cron[40980]: (*system*) INSECURE MODE (group/other writable) (/etc/crontab)
Apr 24 18:30:01 ip-11-22-33-44 cron[40980]: (*system*) INSECURE MODE (group/other writable) (/etc/cron.d/user)
 

خط اول مربوط به /etc/crontab پرونده و دومی به پرونده ای است که من در زیر قرار داده ام /etc/cront.d .


3



خط به روشی که crontab آن را درک نمی کند. باید به طور صحیح نوشته شود. اینجا CrontabHowTo است .


2



کرون دمون می تواند در حال اجرا باشد ، اما در واقع کار نمی کند. راه اندازی مجدد cron را امتحان کنید:

 sudo /etc/init.d/cron restart
 

2



نوشتن برای cron از طریق "crontab -e" با استدلال نام کاربری در یک خط. من نمونه هایی از کاربران (یا sysadmins) را مشاهده کرده ام که اسکریپت های پوسته خود را می نویسند و نمی فهمند که چرا آنها خودکار نمی شوند. استدلال "کاربر" در / etc / crontab وجود دارد ، اما فایلهای تعریف شده توسط کاربر نیست. بنابراین ، برای مثال ، پرونده شخصی شما چیزی شبیه به این موارد خواهد بود:

 # m h dom mon dow command

* * */2  *   *  /some/shell/script
 

در حالی که / و غیره / crontab خواهد بود:

 # m h dom mon dow user   command

* * */2  *   *  jdoe   /some/shell/script
 

بنابراین ، چرا شما دومی را انجام می دهید؟ خوب ، بسته به اینکه چگونه می خواهید مجوزهای خود را تنظیم کنید ، این می تواند بسیار پیچیده شود. من اسکریپت هایی را برای خودکار سازی وظایف برای کاربرانی که پیچیدگی های آن را درک نمی کنند ، نوشتم یا نمی خواهم با زحمت کشی کنید. با تنظیم مجوزها --x------ ، می توانم فیلمنامه را عملی کنم بدون اینکه آنها بتوانند آنرا بخوانند (و شاید بطور تصادفی آن را تغییر دهند). با این وجود ، ممکن است بخواهم این دستور را با چند نفر دیگر از یک پرونده اجرا کنم (بنابراین حفظ آن را آسان تر می کنم) اما مطمئن شوید که خروجی پرونده به صاحب مناسب اختصاص داده شده است. انجام این کار (حداقل در اوبونتو 10.10) باعث عدم توانایی در خواندن پرونده و همچنین اجرای آن می شود ، به علاوه موضوع فوق با قرار دادن دوره های در / etc / crontab (که به طرز حیرت انگیزی ، باعث می شود در هنگام عبور خطایی ایجاد نشود crontab -e ). .

به عنوان نمونه ، مواردی را دیده ام sudo crontab -e که برای اجرای یک اسکریپت با مجوزهای ریشه ، دارای متن مربوط chown username file_output به اسکریپت پوسته هستند. شل و ول ، اما کار می کند. IMHO ، گزینه بسیار برازنده تر این است که آن را /etc/crontab با نام کاربری اعلام شده و مجوزهای مناسب وارد کنید ، بنابراین file_output به سمت مکان و مالک مناسب بروید.


2



با خاموش کردن آنچه Aaron Peart در مورد حالت فعل و انفعال ذکر کرده است ، اگر رفتار پیش فرض یک دستور شامل خروجی یک خط یا تعداد بیشتری از صفحه به محض شروع کار باشد ، گاهی اوقات اسکریپت هایی که در حالت فعل نیستند آغاز می شوند. به عنوان مثال ، من یک اسکریپت پشتیبان برای Intranet خود نوشتم که از curl استفاده می کرد ، ابزاری که در سرورهای راه دور فایل را بارگیری یا بارگذاری می کند ، و اگر فقط بتوانید از طریق HTTP به فایلهای راه دور دسترسی داشته باشید ، بسیار مفید است. استفاده از 'curl http://something.com/somefile.xls ' باعث شد اسکریپتی که من نوشتم برای قطع و هرگز کامل نباشد زیرا خط جدیدی را دنبال می کند که به دنبال آن یک خط پیشرفت است. مجبور شدم از پرچم خاموش (-s) استفاده کنم تا به آن بگویم که هیچ گونه اطلاعاتی را بیرون نمی آورم و با کد خودم می نوشتم تا در صورت عدم موفقیت در بارگیری پرونده ، آن را مدیریت کنم.


2



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

 SOME_DIR=/var/log
MY_LOG_FILE=${SOME_LOG}/some_file.log

BIN_DIR=/usr/local/bin
MY_EXE=${BIN_DIR}/some_executable_file

0 10 * * * ${MY_EXE} some_param >> ${MY_LOG_FILE}
 

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

در عوض شما باید تمام متغیرهای محیط خود را مستقیماً تعریف کنید:

 SOME_DIR=/var/log
MY_LOG_FILE=/var/log/some_file.log

BIN_DIR=/usr/local/bin
MY_EXE=/usr/local/bin/some_executable_file

0 10 * * * ${MY_EXE} some_param >> ${MY_LOG_FILE}
 

2



وقتی یک کار درون کرون اجرا می شود ، stdin بسته می شود. برنامه هایی که بر اساس این که stdin در دسترس است یا خیر ، متفاوت عمل می کنند ، بین جلسه پوسته و Cron متفاوت رفتار خواهند کرد.

مثال آن برنامه ای goaccess برای تجزیه و تحلیل پرونده های ورود به وب سرور است. این کار در cron کار نمی کند:

 goaccess -a -f /var/log/nginx/access.log > output.html
 

و goaccess به جای ایجاد گزارش ، صفحه راهنما را نشان می دهد. در پوسته این را می توان با تولید مثل کرد

 goaccess -a -f /var/log/nginx/access.log > output.html < /dev/null
 

رفع مشکل این goaccess است که به جای خواندن از پرونده ، سیاهه را از stdin بخوانید ، بنابراین راه حل تغییر ورودی crontab به

 cat /var/log/nginx/access.log | goaccess -a > output.html
 

2



در مورد من ، cron و crontab صاحبان مختلفی داشتند.

کار نمی کنم من این را داشتم:

 [email protected] ~ $ ps -ef | grep cron | grep -v grep
User    2940    7284 pty1     19:58:41 /usr/bin/crontab
SYSTEM   11292     636 ?        22:14:15 /usr/sbin/cro 
 

اصولاً مجبور شدم cron-config را اجرا کنم و به سؤالات پاسخ صحیح بدهم. نکته ای وجود دارد که از من خواسته شده است که رمزعبور کاربر Win7 خود را برای حساب "کاربر" خود وارد کنم. از خواندن من ، به نظر می رسد این یک مسئله امنیتی بالقوه است اما من تنها سرپرست یک شبکه خانگی واحد هستم بنابراین تصمیم گرفتم که خوب باشد.

در اینجا ترتیب دستور است که مرا به حرکت درآورد:

 [email protected] ~ $ cron-config
The cron daemon can run as a service or as a job. The latter is not recommended.
Cron is already installed as a service under account LocalSystem.
Do you want to remove or reinstall it? (yes/no) yes
OK. The cron service was removed.

Do you want to install the cron daemon as a service? (yes/no) yes
Enter the value of CYGWIN for the daemon: [ ] ntsec

You must decide under what account the cron daemon will run.
If you are the only user on this machine, the daemon can run as yourself.
   This gives access to all network drives but only allows you as user.
To run multiple users, cron must change user context without knowing
  the passwords. There are three methods to do that, as explained in
  http://cygwin.com/cygwin-ug-net/ntsec.html#ntsec-nopasswd1
If all the cron users have executed "passwd -R" (see man passwd),
  which provides access to network drives, or if you are using the
  cyglsa package, then cron should run under the local system account.
Otherwise you need to have or to create a privileged account.
  This script will help you do so.
Do you want the cron daemon to run as yourself? (yes/no) no

Were the passwords of all cron users saved with "passwd -R", or
are you using the cyglsa package ? (yes/no) no

Finding or creating a privileged user.
The following accounts were found: 'cyg_server' .
This script plans to use account cyg_server.
Do you want to use another privileged account name? (yes/no) yes
Enter the other name: User

Reenter: User


Account User already exists. Checking its privileges.
INFO: User is a valid privileged account.
INFO: The cygwin user name for account User is User.

Please enter the password for user 'User':
Reenter:
Running cron_diagnose ...
... no problem found.

Do you want to start the cron daemon as a service now? (yes/no) yes
OK. The cron daemon is now running.

In case of problem, examine the log file for cron,
/var/log/cron.log, and the Windows event log (using /usr/bin/cronevents)
for information about the problem cron is having.

Examine also any cron.log file in the HOME directory
(or the file specified in MAILTO) and cron related files in /tmp.

If you cannot fix the problem, then report it to [email protected]
Please run the script /usr/bin/cronbug and ATTACH its output
(the file cronbug.txt) to your e-mail.

WARNING: PATH may be set differently under cron than in interactive shells.
         Names such as "find" and "date" may refer to Windows programs.


[email protected] ~ $ ps -ef | grep cron | grep -v grep
    User    2944   11780 ?        03:31:10 /usr/sbin/cron
    User    2940    7284 pty1     19:58:41 /usr/bin/crontab

[email protected] ~ $
 

2



در سرورهای RHEL7 من ، کارهای ریشه متناوب اجرا می شوند ، اما شغل های کاربر چنین نیست. من فهمیدم که بدون یک فهرست خانه ، مشاغل اجرا نمی شوند (اما خطاهای خوبی را در / var / log / cron مشاهده خواهید کرد). وقتی دایرکتوری خانه را ایجاد کردم ، مشکل حل شد.


2



اگر پرونده crontab خود را با استفاده از ویرایشگر ویندوز (از طریق سامبا یا چیزی) ویرایش کرده اید و خطوط جدید را با \ n \ r یا فقط \ r جایگزین کرده است ، cron اجرا نخواهد شد.

همچنین ، اگر از /etc/cron.d/* استفاده می کنید و یکی از آن پرونده ها \ r را در آن دارد ، cron از طریق پرونده ها حرکت می کند و هنگام برخورد با یک پرونده بد متوقف می شود. مطمئن نیستید که این مشکل است؟

استفاده کنید:

 od -c /etc/cron.d/* | grep \r
 

2



انتشارات مرتبط


چرا آپاچی من بعد از به روزرسانی در اوبونتو 14.04 کار نمی کند؟

چرا چسباندن بعضی اوقات در ترمینال gnome کار نمی کند؟

چرا دستور pssh کار نمی کند؟

چرا ctrl + v در ترمینال کار نمی کند [کپی]

چرا برخی از برنامه های ضبط / ضبط صفحه (یا ویژگی های برنامه) من بعد از ارتقا به اوبونتو 17.10 کار نمی کنند؟

CTRL + ALT + L و CTRL + ALT + DEL در اوبونتو 12.04 کار نمی کنند؟

چرا mount.cifs بعد از بروزرسانی از 16.04 تا 18.04 در fstab دیگر کار نمی کند؟

کلید های میانبر کلید alt در Pycharm روی Ubuntu 16.04 کار نمی کنند

چرا برخی از برنامه های ضبط / ضبط صفحه (یا ویژگی های برنامه) من بعد از ارتقا به اوبونتو 17.10 کار نمی کنند؟

چرا "ساخت gconfig" در حین تهیه هسته کار نمی کند؟

[cron] سوال برچسب


log cron / crontab کجاست؟

متن را با استفاده از دستورات متن را پیدا کرده و جایگزین کنید

چگونه روند کار را بعد از پایان جلسه ssh ادامه دهیم؟

کلیدهای میانبر صفحه کلید و ماوس Unity چیست؟

چگونه مقدار فضای خالی را در هارد دیسک خود پیدا کنم؟

چگونه تصاویر GIF متحرک از یک صفحه نمایش ایجاد کنیم؟

چکمه رایانه من به صفحه سیاه است ، چه گزینه هایی برای رفع آن دارم؟

کدام یک بهتر است: استفاده؛ یا && برای اجرای چندین دستور در یک خط؟

چگونه می توانم یک رشته base64 را از خط فرمان رمزگشایی کنم؟

چگونه می توان اندازه پرونده یک فایل PDF اسکن شده را کاهش داد؟