हर एक्स मिनट में क्रोनजॉब कैसे चलाएं?


94

मैं क्रोनजोब में एक PHP स्क्रिप्ट चला रहा हूं और मैं हर 5 मिनट में ईमेल भेजना चाहता हूं

मेरा वर्तमान (क्रॉस्टैब) क्रोनजोब:

10 * * * * /usr/bin/php /mydomain.in/cromail.php > /dev/null 2>&1

Cronmail.php इस प्रकार है:

<?php
$from = 'D'; // sender
$subject = 'S';
$message = 'M';
$message = wordwrap($message, 70);
mail("myemail@gmail.com", $subject, $message, "From: $from\n");
?>

लेकिन मुझे इस कॉन्फ़िगरेशन के साथ 30 मिनट में एक ईमेल नहीं मिला है।


2
आपका पूर्ण मार्ग शायद सही नहीं है
रेने पॉट

कृपया मुझे सुझाव दें कि सही रास्ता मेरी php फ़ाइल cromail.php रूट डायरेक्टरी में है - mydomain.in/cromail.php
सावन

कभी-कभी php-cli सिर्फ इसलिए काम नहीं करना चाहती है क्योंकि आपने php.ini में वर्तमान समय-क्षेत्र निर्धारित नहीं किया है, भले ही आप तारीख का उपयोग न करें।
T00rk

यह है cromail.phpया cronmail.php?
Biffen

केवल परीक्षण के लिए cromail.php
सावन

जवाबों:


165

एक crontabफ़ाइल में, फ़ील्ड हैं:

  • घंटे का मिनट।
  • दिन का घंटा।
  • महीने का दिन।
  • वर्ष का महीना।
  • हफ्ते का दिन।

इसलिए:

10 * * * * blah

blahहर घंटे 10 मिनट अतीत में निष्पादित करें ।

यदि आप हर पांच मिनट में चाहते हैं, तो या तो उपयोग करें:

*/5 * * * * blah

हर मिनट का अर्थ है, लेकिन केवल हर पांचवें, या:

0,5,10,15,20,25,30,35,40,45,50,55 * * * * blah

पुराने cronनिष्पादनों के लिए जो */xसंकेतन को नहीं समझते हैं ।

यदि इसके बाद भी यह काम नहीं कर रहा है, तो कमांड को कुछ इस तरह बदलें:

date >>/tmp/debug_cron_pax.txt

और हर पांच मिनट में कुछ लिखा जाना सुनिश्चित करने के लिए उस फ़ाइल की निगरानी करें। यदि हां, तो आपकी PHP लिपियों में कुछ गड़बड़ है। यदि नहीं, तो आपके cronडेमॉन में कुछ गड़बड़ है ।


मैं अपडेट * / 5 * * * * mydomain.in/cronmail.php> / dev / null 2> & 1 ईमेल प्राप्त नहीं कर रहा
सावन पौन

मैंने यहां बताई गई कमांड का उपयोग किया था, लेकिन यह काम नहीं कर रहा था क्योंकि मेरे पास इसके बाद एक वापसी विवरण था। सुनिश्चित करें कि बयान को रिटर्न के साथ समाप्त न करें और एक नोट भी, जब नया क्रोन बनाया जाता है तो यह "क्रॉस्टैब: नया क्रॉस्टैब" संदेश दिखाता है।
damndemon

31

आपका CRON इस तरह दिखना चाहिए:

*/5 * * * *

CronWTF वास्तव में उपयोगी है जब आपको अपनी CRON सेटिंग्स का परीक्षण करने की आवश्यकता होती है।

एक लॉग फ़ाइल में आउटपुट को पाइप करने के लिए एक अच्छा विचार हो सकता है ताकि आप देख सकें कि क्या आपकी स्क्रिप्ट किसी भी त्रुटि को भी फेंक रही है - क्योंकि आप उन्हें अपने टर्मिनल में नहीं देखेंगे।

अपनी पीएचपी फ़ाइल के शीर्ष पर शेबंग का उपयोग करने का भी प्रयास करें, इसलिए सिस्टम को पता है कि कहां PHP ढूंढनी है। जैसे कि:

#!/usr/bin/php

इस तरह से आप इस तरह से पूरी बात कह सकते हैं

*/5 * * * * php /path/to/script.php > /path/to/logfile.log


मैं अपडेट / * 5 * * * * mydomain.in/cronmail.php> / dev / null 2> & 1 ईमेल प्राप्त नहीं कर रहा
हूं

2
क्या आपने स्क्रिप्ट को मैन्युअल रूप से चलाने की कोशिश की है और क्रोन के माध्यम से नहीं? समस्या वास्तव में स्क्रिप्ट के साथ ही हो सकती है।
गैरी जोन्स

5

आप अपने क्रोन को हर घंटे में 10 वें मिनट पर चलाने के लिए सेट कर रहे हैं।
इसे every 5 minsबदलने के लिए सेट करने के लिए*/5 * * * * /usr/bin/php /mydomain.in/cronmail.php > /dev/null 2>&1


मैं अपडेट * / 5 * * * * mydomain.in/cronmail.php> / dev / null 2> & 1 ईमेल प्राप्त नहीं कर रहा
सावन पौन

@ user3705511 आप इसे php - लापता usr/bin/phpभाग
जस्टिनस सिप

जोड़ा * / 5 * * * * usr / bin / php / mydomain.in / cronmail.php> / dev / null 2> & 1 लेकिन अभी भी ईमेल प्राप्त नहीं हुआ
सावन पौन

@ user3705511*/5 * * * * /usr/bin/php /mydomain.in/cromail.php > /dev/null 2>&1
जस्टिनस सिप

अपडेट किया गया लेकिन अभी भी ईमेल नहीं मिला * / 5 * * * * usr / bin / php / mydomain.in/cronmail.php> / dev / null 2> & 1
सावन पौन

5

यदि आप हर nमिनट क्रोन चलाना चाहते हैं , तो मूल्य के आधार पर कुछ संभावित विकल्प हैं n

n 60 (1, 2, 3, 4, 5, 6, 10, 12, 15, 20, 30) को विभाजित करता है

यहाँ, /संकेतन का उपयोग करके समाधान सीधा है :

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7)
# |  |  |  |  |
# *  *  *  *  *   command to be executed
m-59/n  *  *  *  *   command

उपर्युक्त में, nमूल्य nका mप्रतिनिधित्व करता है और किसी से छोटे मूल्य का प्रतिनिधित्व करता है nया *। यह कमांड को मिनटों में निष्पादित करेगाm,m+n,m+2n,...

n 60 को विभाजित नहीं करता है

यदि nआप 60 को विभाजित नहीं करते हैं, तो आप इसे क्रोन के साथ सफाई से नहीं कर सकते हैं लेकिन यह संभव है। ऐसा करने के लिए आपको क्रोन में एक परीक्षण लगाने की आवश्यकता है जहां परीक्षण समय की जांच करता है। यह सबसे अच्छा तब किया जाता है जब UNIX टाइमस्टैम्प को देखें, तब से कुल सेकंड 1970-01-01 00:00:00 UTC। मान लें कि हम कमांड को पहली बार चलाना शुरू करना चाहते हैं, जब मार्टी मैकफली रिवरडेल में पहुंचे और फिर इसे हर nमिनट बाद दोहराएं ।

% date -d '2015-10-21 07:28:00' +%s 
1445412480

एक cronjob के लिए हर 42nd मिनट को चलाने के लिए `2015-10-21 07:28:00 'के बाद, crontab इस तरह दिखेगा:

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7)
# |  |  |  |  |
# *  *  *  *  *   command to be executed
  *  *  *  *  *   minutetestcmd "2015-10-21 07:28:00" 42 && command

के minutetestcmdरूप में परिभाषित किया गया है

#!/usr/bin/env bash
starttime=$(date -d "$1" "+%s")
# return UTC time
now=$(date "+%s")
# get the amount of minutes (using integer division to avoid lag)
minutes=$(( (now - starttime) / 60 ))
# set the modulo
modulo=$2
# do the test
(( now >= starttime )) && (( minutes % modulo == 0 ))

टिप्पणी: UNIX समय छलांग सेकंड से प्रभावित नहीं है

टिप्पणी: cron कोई उप-दूसरी सटीकता नहीं है


यह m/nनोटेशन मेरे सिस्टम (डेबियन 9, उबंटू 16.04) पर काम नहीं करता है। केवल */nकाम करता है। उदाहरण के लिए, 5/5या 4/10दे Error: bad minute; while reading /etc/crontabsyslog में (क्रॉन वी के साथ Ubuntu में। 3.0pl1-128ubuntu2)। क्या इस m / n नोटेशन को छोड़ दिया गया है, या यह केवल कुछ प्रणालियों में उपलब्ध है?
मिवंक

@mivk इसे इंगित करने के लिए धन्यवाद। यह मेरी तरफ से एक गलती थी। इसे पढ़ना चाहिए था m-59/n। केवल एक सीमा में एक चरण आकार हो सकता है। (देखें man 5 crontab)। मैं इस सवाल का जवाब अद्यतन किया है
kvantour

3

एक क्रोनजॉब काम कर रहा है या नहीं यह जांचने के लिए 2 कदम:

  1. सर्वर पर उस उपयोगकर्ता के साथ लॉगिन करें जो क्रोनजोब को निष्पादित करता है
  2. मैन्युअल रूप से php कमांड चलाएं:

    / usr / bin / php /mydomain.in/cromail.php

और जांचें कि क्या कोई त्रुटि प्रदर्शित है


3
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed

X मिनट के लिए सेट करने के लिए हमें 1 तर्क में x मिनट सेट करने की आवश्यकता है और फिर आपकी स्क्रिप्ट का पथ

15 मिनट के लिए

*/15 * * * *  /usr/bin/php /mydomain.in/cromail.php > /dev/null 2>&1

1
यह हर बार एक्स (15) मिनट तक नहीं चलता है। यह हर 1 घंटे के बाद x (1) मिनट पर चलता है।
सिल्वर फादर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.