सही पेट्स में कॉल करने के लिए CRON कैसे प्राप्त करें


124

मैं सही पेट्स में कॉल करने के लिए क्रोन लेने की कोशिश कर रहा हूं। जब मैं शेल से एक पायथन स्क्रिप्ट चलाता हूं, तो स्क्रिप्ट ठीक चलती है क्योंकि यह बैशके में सेट किए गए पैट्स का उपयोग करती है, लेकिन जब मैं क्रॉन का उपयोग करता हूं तो सभी पीएटीएच का उपयोग बैशकेन से नहीं किया जाता है। क्या कोई फाइल है जो मैं बैशकेन की तरह क्रैच के लिए पाथ्स में दर्ज कर सकता हूं या बैशकेन से पेट्स को कॉल करने का तरीका?

क्षमा करें, मुझे नहीं लगता कि मैंने इसे सही ढंग से लिखा है, मैं चलाने के लिए सही स्क्रिप्ट प्राप्त कर सकता हूं (मतलब Crontab में स्क्रिप्ट के लिए पथ यहाँ समस्या नहीं है), यह सिर्फ तब है जब स्क्रिप्ट चल रही है मैं एक बिल्ड चलाता हूं और यह उपयोग करता है पैठों में स्थापित .bashrc। जब मैं लॉग इन होने के दौरान स्क्रिप्ट चलाता हूं, तो .bashrcPATH को अंदर खींच लिया जाता है। चूंकि क्रोन प्रति शेल में नहीं चलता है, इसलिए वह अंदर नहीं खींचता है .bashrc। क्या बिना बैश स्क्रिप्ट के रैपर लिखने के बिना इसे खींचने का एक तरीका है?



2
जादू, सरल और सही कमांड आपके प्रोफाइल को वर्तमान परिवेश में शामिल करने के लिए है source /etc/profile, इसे खाना चाहिए .bashrcऔर आपके लिए बहुत सारी अन्य संभावित लापता चीजें होनी चाहिए । स्पष्ट प्रोफ़ाइल सोर्सिंग बहुत उपयोगी हो जाती है यदि आप कुछ स्क्रिप्ट "स्टैंडअलोन" को चलाना चाहते हैं, तो यह अजीब वातावरण से भी बचाता है और इसलिए ...
ex

1
@exa + 100 यह shस्क्रिप्ट को क्रॉस्टैब वर्क द्वारा बुलाया गया है। आप इसकी पुष्टि कर सकते हैं कि यह नौकरी जोड़कर पथ को अपडेट करता है * * * * * echo $PATH > ~/crontab_path.txtऔर एक मिनट के बाद फ़ाइल की जांच करता है।
जियोथैरी

जवाबों:


177

मैंने इस्तेमाल किया /etc/crontab। मैंने viइस फ़ाइल में आवश्यक पैट्स में उपयोग किया और प्रवेश किया और इसे रूट के रूप में चलाया। सामान्य Crontab आपके द्वारा सेट किए गए PATH को अधिलेखित कर देता है। यह कैसे करना है पर एक अच्छा ट्यूटोरियल

सिस्टमवाइड क्रोन फ़ाइल इस तरह दिखाई देती है:

This has the username field, as used by /etc/crontab.
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file.
# This file also has a username field, that none of the other crontabs do.

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

# m h dom mon dow user   command
42 6 * * *   root    run-parts --report /etc/cron.daily
47 6 * * 7   root    run-parts --report /etc/cron.weekly
52 6 1 * *   root    run-parts --report /etc/cron.monthly
01 01 * * 1-5 root python /path/to/file.py

17
यह उपयोगकर्ता स्तर पर crontab -e के साथ काम करता है और यह इस तरह से सुरक्षित भी है।
रॉबर्ट ब्रिसिटा

2
क्या मैं श के बजाय बैश का उपयोग कर सकता हूं?
QED

1
यह अजीब (मेरे लिए) है कि डिफ़ॉल्ट PATH / etc / crontab में @chrissygormley द्वारा दिखाया गया है, और यह भी मेरे (Ubuntu) crontab में सेट है, पथ / etc / वातावरण में अलग है, विशेष रूप से यह / sbin और डालता है / बिन आगे / usr / sbin और / usr / बिन। मैंने अब इसे अपने / etc / crontab में बदल दिया है ताकि इसे उपयोगकर्ता पर्यावरण के समान बनाया जा सके।
scoobydoo

मेरे लिए काम नहीं कर रहा हूँ..मैं एक फ़ाइल में क्रोन सामग्री का उत्पादन कर रहा हूँ। क्रोन चलता है, फ़ाइल बनाता है, लेकिन यह इसमें कोई सामग्री नहीं डाल रहा है।
वोलेटिल 3

2
ऐसा लगता है कि /etc/crontabउबंटू 14.04 में रूट के रूप में चलने पर क्रोन के लिए निर्धारित सभी रास्ते उपलब्ध नहीं हैं। ( sudo crontab -e)
डेविड ओलिवर

50

सबसे अधिक संभावना है, क्रोन बहुत विरल वातावरण में चल रहा है। पर्यावरण चर की जांच करें कि क्रोन एक डमी नौकरी को जोड़कर उपयोग कर रहा है, जो envइस तरह से एक फ़ाइल में जाती है:

* * * * * env > env_dump.txt

envएक सामान्य शेल सत्र में आउटपुट के साथ तुलना करें ।

आप अपने स्वयं के वातावरण चर को अपने कॉन्टैब के शीर्ष पर परिभाषित करके स्थानीय क्रॉटाब पर रख सकते हैं।

यहाँ $PATHवर्तमान क्रेस्टैब के लिए एक त्वरित समाधान है :

# echo PATH=$PATH > tmp.cron
# echo >> tmp.cron
# crontab -l >> tmp.cron
# crontab tmp.cron

परिणामस्वरूप क्रॉस्टैब क्रिस्गोर्मले के उत्तर के समान होगा, जिसमें पैट्रा को क्रॉस्टैब नियमों से पहले परिभाषित किया गया है।


22

आपको अपने रास्ते पूरे करने चाहिए crontab। यह सबसे सुरक्षित विकल्प है।
यदि आप ऐसा नहीं करना चाहते हैं, तो आप अपने कार्यक्रमों के आसपास एक रैपर स्क्रिप्ट रख सकते हैं, और वहां पेट को सेट कर सकते हैं।

जैसे

01 01 * * * command

हो जाता है:

01 01 * * * /full/path/to/command

इसके अलावा जो कुछ भी कहा जाता है cronउसे चलने वाले कार्यक्रमों के बारे में बहुत सावधान रहना चाहिए, और शायद PATHचर के लिए अपनी पसंद निर्धारित करें ।

संपादित करें:

यदि आप नहीं जानते हैं कि कमांड कहाँ है जिसे आप which <command>अपने शेल से निष्पादित करना चाहते हैं और यह आपको रास्ता बताएगा।

EDIT2:

इसलिए एक बार जब आपका प्रोग्राम चल रहा होता है, तो पहली चीज़ जो उसे करनी चाहिए, वह सेट होती है और स्क्रिप्ट को चलाने के लिए आवश्यक मानों के लिए PATHकोई अन्य आवश्यक चर (जैसे LD_LIBRARY_PATH)।
मूल रूप से यह सोचने के बजाय कि क्रोन वातावरण को अपने कार्यक्रम / स्क्रिप्ट के लिए अधिक उपयुक्त बनाने के लिए कैसे संशोधित किया जाए - अपनी स्क्रिप्ट को उसके द्वारा दिए गए वातावरण को संभाल कर बनाएं, जब वह शुरू होता है।


1
अगर आपके रास्ते में इसका इस्तेमाल 'कौन सी आज्ञा' है और यह आपको पूरा रास्ता देगा
पॉल व्हेलन

@ डगलस लीडर - जब आप कहते हैं कि पूरे रास्ते को क्रोन में डाल दें, तो क्या इसका मतलब है कि इसे क्रॉस्टैब या किसी अन्य फाइल में डाल दिया जाए? यदि यह है कि आप इस बारे में कैसे जाएंगे यदि क्रोन कमांड है: '01 01 * * * कमांड '। धन्यवाद
chrissygormley

@chrissygormley - हाँ crontab
डगलस लीडर

क्षमा करें, कुछ भ्रम होना चाहिए। मैंने ऊपर दिए गए प्रश्न को फिर से प्रस्तुत किया है।
क्रिस्चोगर्मले

16

मेरे साथ काम करने वाले कमांड लाइन के सामने PATH की स्थापना मेरे लिए काम की:

* * * * * PATH=$PATH:/usr/local/bin:/path/to/some/thing

इस तरह से पसंद करें। या स्क्रिप्ट का पूर्ण पथ निर्दिष्ट करें।
zw963

5
मुझे नहीं लगता कि रास्ता बढ़ता रहेगा, हर बार इसका रन एक नया वातावरण होगा, PATH की एक नई प्रति के साथ ...
jjcf89

यह पुष्टि कर सकता है कि @ jjcf89 सही है, प्रत्येक रन पर पैट ताजा है।
विद्युत्वीर

14

सही मूल्यों के साथ उपयोगकर्ता crontab में एक पाथ परिभाषा जोड़ने से मदद मिलेगी ... मैं बस के साथ मेरा भर गया है:

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

और यह मेरी सभी लिपियों को काम करने के लिए पर्याप्त है ... यदि आवश्यक हो तो वहां कोई भी कस्टम पथ शामिल करें।


1
एक उपयोगकर्ता crontab के लिए यह सही उत्तर होना चाहिए। सिस्टम पर हर कोई एडिट नहीं कर सकता /etc/crontab। यह उपयोगकर्ता के स्तर पर सबसे आसान उत्तर है। अच्छी नौकरी @ त्रेवियो। यदि आप सहमत हैं तो इसे वोट करें।
frederickjh

14

अपने चरों को आपके लिए काम करें, यह एक्सेस टी की अनुमति देगा

अपने PATH को /etc/profile.d/*.sh में परिभाषित करें

सिस्टम-वाइड वातावरण चर

/Etc/profile.d निर्देशिका में .sh एक्सटेंशन वाली फ़ाइलों को तब भी निष्पादित किया जाता है जब कोई बैश लॉगिन शेल दर्ज किया जाता है (जैसे कंसोल से या ssh में लॉगिंग करते समय), साथ ही साथ डेस्कटॉप सत्र लोड होने पर DisplayManager द्वारा।

आप उदाहरण के लिए फ़ाइल /etc/profile.d/myenvvars.sh बना सकते हैं और इस तरह चर सेट कर सकते हैं:

export JAVA_HOME=/usr/lib/jvm/jdk1.7.0
export PATH=$PATH:$JAVA_HOME/bin

लॉगिन ऑप्शन के साथ एक्सेक्यूट क्रस्टैब!

CRONTAB पर्यावरण चर के साथ स्क्रिप्ट या कमांड चलाते हैं

0 9 * * * cd /var/www/vhosts/foo/crons/; bash -l -c 'php -f ./download.php'
0 9 * * * cd /var/www/vhosts/foo/crons/; bash -l -c download.sh

11

संकट

आपकी स्क्रिप्ट तब काम करती है जब आप इसे कंसोल से चलाते हैं, लेकिन क्रोन में विफल रहता है।

कारण

आपके क्रेस्टैब में सही पथ चर नहीं हैं (और संभवतः शेल)

उपाय

अपने वर्तमान शेल को जोड़ें और क्रॉस्टैब को पथ दें

आपके लिए यह करने के लिए स्क्रिप्ट

#!/bin/bash
#
# Date: August 22, 2013
# Author: Steve Stonebraker
# File: add_current_shell_and_path_to_crontab.sh
# Description: Add current user's shell and path to crontab
# Source: http://brakertech.com/add-current-path-to-crontab
# Github: hhttps://github.com/ssstonebraker/braker-scripts/blob/master/working-scripts/add_current_shell_and_path_to_crontab.sh

# function that is called when the script exits (cleans up our tmp.cron file)
function finish { [ -e "tmp.cron" ] && rm tmp.cron; }

#whenver the script exits call the function "finish"
trap finish EXIT

########################################
# pretty printing functions
function print_status { echo -e "\x1B[01;34m[*]\x1B[0m $1"; }
function print_good { echo -e "\x1B[01;32m[*]\x1B[0m $1"; }
function print_error { echo -e "\x1B[01;31m[*]\x1B[0m $1"; }
function print_notification { echo -e "\x1B[01;33m[*]\x1B[0m $1"; }
function printline { 
  hr=-------------------------------------------------------------------------------------------------------------------------------
  printf '%s\n' "${hr:0:${COLUMNS:-$(tput cols)}}"
}
####################################
# print message and exit program
function die { print_error "$1"; exit 1; }

####################################
# user must have at least one job in their crontab
function require_gt1_user_crontab_job {
        crontab -l &> /dev/null
        [ $? -ne 0 ] && die "Script requires you have at least one user crontab job!"
}


####################################
# Add current shell and path to user's crontab
function add_shell_path_to_crontab {
    #print info about what's being added
    print_notification "Current SHELL: ${SHELL}"
    print_notification "Current PATH: ${PATH}"

    #Add current shell and path to crontab
    print_status "Adding current SHELL and PATH to crontab \nold crontab:"

    printline; crontab -l; printline

    #keep old comments but start new crontab file
    crontab -l | grep "^#" > tmp.cron

    #Add our current shell and path to the new crontab file
    echo -e "SHELL=${SHELL}\nPATH=${PATH}\n" >> tmp.cron 

    #Add old crontab entries but ignore comments or any shell or path statements
    crontab -l | grep -v "^#" | grep -v "SHELL" | grep -v "PATH" >> tmp.cron

    #load up the new crontab we just created
    crontab tmp.cron

    #Display new crontab
    print_good "New crontab:"
    printline; crontab -l; printline
}

require_gt1_user_crontab_job
add_shell_path_to_crontab

स्रोत

https://github.com/ssstonebraker/braker-scripts/blob/master/working-scripts/add_current_shell_and_path_to_crontab.sh

नमूना आउटपुट

add_curent_shell_and_path_to_crontab.sh उदाहरण आउटपुट


3

मेरे AIX क्रोन पर /। / वातावरण से पर्यावरणीय चर-अचर होता है जो कि .profile में सेट की गई अनदेखी है।

संपादित करें: मैंने विभिन्न युगों के कुछ लिनक्स बॉक्सों की भी जाँच की और ये इस फ़ाइल के रूप में भी दिखाई देते हैं, इसलिए यह AIX विशिष्ट नहीं है।

मैंने इसे joemaller के क्रॉन सुझाव का उपयोग करके चेक किया और PATH चर को / etc / वातावरण में संपादित करने से पहले और बाद में आउटपुट की जाँच की।


3

यदि आप विभिन्न स्थानों पर एक ही संपादन नहीं करना चाहते हैं, तो मोटे तौर पर ऐसा करें:

* * * * * . /home/username/.bashrc && yourcommand all of your args

द। अंतरिक्ष और फिर .bashrc और && कमांड का पथ आपके पर्यावरण को चल रहे बैश शेल में बदलने के लिए जादू है। भी, यदि आप वास्तव में चाहते हैं कि शेल को कोसना है, तो यह एक अच्छा विचार है कि आपके क्रॉस्टेब में एक पंक्ति है:

SHELL=/bin/bash

आशा है कि यह किसी की मदद करता है!


2

क्रोन नौकरियों के लिए डिफ़ॉल्ट वातावरण बहुत विरल है और आपके द्वारा अपनी अजगर लिपियों को विकसित करने वाले वातावरण से बहुत भिन्न हो सकता है। क्रोन में चलाई जा सकने वाली स्क्रिप्ट के लिए, आपके द्वारा निर्भर किसी भी वातावरण को स्पष्ट रूप से सेट किया जाना चाहिए। क्रोन फ़ाइल में, अजगर के निष्पादन के लिए पूर्ण पथ और आपकी अजगर लिपियों में शामिल हैं।


2

मुझे पता है कि इसका उत्तर पहले ही दिया जा चुका है, लेकिन मैंने सोचा कि उसका कुछ काम आएगा। मेरे पास इसी तरह का मुद्दा था जिसे मैंने हाल ही में हल किया ( यहां पाया गया ) और यहां इस प्रश्न का उत्तर देने के लिए उठाए गए कदमों पर प्रकाश डाला गया है:

  1. सुनिश्चित करें कि आपके पास PYTHONPATH में आवश्यक चर (यहां और यहां और अधिक जानकारी के लिए) हैं। किसी भी शेल के लिए .profash या .bash_profile के अंदर आप यह सुनिश्चित करने के लिए अपनी स्क्रिप्ट का परीक्षण करना चाहते हैं कि यह काम करता है।

  2. क्रोन जॉब में अपनी स्क्रिप्ट को चलाने के लिए आवश्यक निर्देशिकाओं को शामिल करने के लिए अपने क्रॉस्टैब को संपादित करें (यहां और यहां पाया गया)

    a) रूट निर्देशिका को PATH वैरिएबल (।) में शामिल करना सुनिश्चित करें, जैसा कि यहां बताया गया है (मूल रूप से यदि आप अपने कमांड के साथ एक निष्पादन योग्य चला रहे हैं तो इसे रूट या निर्देशिका को खोजने में सक्षम होने की आवश्यकता है जहां निष्पादन योग्य संग्रहीत है) और शायद ये (/ sbin: / बिन: / usr / sbin: / usr / bin)

  3. अपनी crontab फ़ाइल में, एक क्रोनजॉब बनाएँ, जो निर्देशिका को उस निर्देशिका में बदलेगा जहाँ आपने पहले स्क्रिप्ट को सफलतापूर्वक चलाया है (यानी उपयोगकर्ता / उपयोगकर्ता / दस्तावेज़ / foo)

    क) यह निम्नलिखित की तरह दिखेगा:

    * * * * cd /Users/user/Documents/foo; bar -l doSomething -v 
    

2

@Trevino: आपके जवाब से मुझे अपनी समस्या हल करने में मदद मिली। हालाँकि, एक शुरुआत के लिए, एक कदम से कदम देने की कोशिश कर रहा है।

  1. के माध्यम से जावा की अपनी वर्तमान स्थापना प्राप्त करें $ echo $JAVA_HOME
  2. $ crontab -e
  3. * * * * * echo $PATH- इससे आप समझ सकते हैं कि वर्तमान में Crontab द्वारा उपयोग किए जा रहे PATH मूल्य क्या है। Crontab चलाएं और crontab द्वारा उपयोग किए गए $ PATH मूल्य को पकड़ो।
  4. अब अपने वांछित जावा बिन पथ को सेट करने के लिए फिर से क्रॉस्टैब को संपादित करें: ए) crontab -e; बी) PATH=<value of $JAVA_HOME>/bin:/usr/bin:/bin(इसका एक नमूना पथ); ग) अब आपकी निर्धारित नौकरी / स्क्रिप्ट जैसे */10 * * * * sh runMyJob.sh &; d) echo $PATHकॉट्रेब से हटा दें क्योंकि अब इसकी आवश्यकता नहीं है।

2

अपने पेट में आवश्यक पेट सेट करें

crontab -e

संपादित करें: दबाएँ i

PATH=/usr/local/bin:/usr/local/:or_whatever

10 * * * * your_command

सुरषित और बहार :wq


1

सबसे सरल वर्कअराउंड मैंने ऐसा पाया है:

* * * * * root su -l -c command

यह उदाहरण suरूट उपयोगकर्ता के रूप में आक्रमण करता है और $ PATH सहित उपयोगकर्ता के पूर्ण वातावरण के साथ शेल को शुरू करता है, जैसे कि वे लॉग इन थे। यह विभिन्न डिस्ट्रो पर समान कार्य करता है, सोर्सिंग की तुलना में अधिक विश्वसनीय है। मुझे) और हार्डकोडिंग विशिष्ट रास्तों से बचा जाता है जो एक समस्या हो सकती है यदि आप एक उदाहरण या सेटअप टूल प्रदान कर रहे हैं और यह नहीं जानते कि उपयोगकर्ता के सिस्टम पर क्या डिस्ट्रो या फ़ाइल लेआउट है।

suयदि आप रूट से भिन्न उपयोगकर्ता चाहते हैं तो आप उपयोगकर्ता नाम भी निर्दिष्ट कर सकते हैं , लेकिन आपको कमांड से rootपहले पैरामीटर को छोड़ देना चाहिए suक्योंकि यह सुनिश्चित करता है suकि आपके द्वारा निर्दिष्ट किसी भी उपयोगकर्ता पर स्विच करने के लिए पर्याप्त विशेषाधिकार हैं।


-3

क्या आपको उपयोग करना चाहिए webminतो ये हैं कि PATHमूल्य कैसे निर्धारित करें :

System
  -> Scheduled Cron Jobs
       -> Create a new environment variable
            -> For user: <Select the user name>
            -> Variable name: PATH
            -> Value: /usr/bin:/bin:<your personal path>
            -> Add environment variable: Before all Cron jobs for user
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.