সঠিক প্যাথ-এ কল করতে সিআরএন কীভাবে পাবেন


124

আমি সঠিক PATHs এ কল করার জন্য ক্রোন পাওয়ার চেষ্টা করছি। আমি যখন শেল থেকে পাইথন স্ক্রিপ্টটি চালিত করি তখন স্ক্রিপ্টটি ঠিকঠাক হয়ে যায় কারণ এটি বাশার্কে সেট করা PATHs ব্যবহার করে তবে যখন আমি ক্রোন ব্যবহার করি তখন সমস্ত PATHs বাশার্ক থেকে ব্যবহৃত হয় না। বাশার্কের মতো ক্রোন বা PATHs কে বাশার্ক থেকে কল করার কোনও উপায়ের মধ্যে আমি কী PATHs প্রবেশ করতে পারি?

দুঃখিত, আমি এটি সঠিকভাবে বলেছি বলে মনে করি না, চালানোর জন্য আমি সঠিক স্ক্রিপ্টটি পেতে পারি (ক্রোনটব স্ক্রিপ্টে প্যাথ এটি এখানে সমস্যা নয়), যখন স্ক্রিপ্টটি চলছে তখন আমি একটি বিল্ড চালনা করি এবং এটি ব্যবহার করে PATHs সেট আপ হয়েছে .bashrc। আমি যখন লগ ইন করি তখন আমি স্ক্রিপ্টটি চালিত করি, .bashrcPATH গুলি টান হয় Since যেহেতু ক্রোন ক্রমটি শেল প্রতি চালায় না বলে বলে যে এটি টানছে না .bashrc। বাশ স্ক্রিপ্টের মোড়ক না লিখে এটিকে টানানোর কোনও উপায় আছে কি?


: এছাড়াও এখানে কিভাবে cronjobs জন্য কাজ করার bashrc সেটিংস পেতে জন্য দেওয়া পরামর্শ কটাক্ষপাত আছে stackoverflow.com/q/15557777/1025391
moooeeeep

2
আপনার পরিবেশটিকে বর্তমান পরিবেশে অন্তর্ভুক্ত করার জন্য যাদু, সহজ এবং সঠিক কমান্ডটি হ'ল source /etc/profile, এটি খাওয়া উচিত .bashrcএবং আপনার জন্য অন্যান্য সম্ভাব্য নিখোঁজ জিনিসগুলি পুরোপুরি পাওয়া উচিত । আপনি যদি কিছু স্ক্রিপ্ট "স্ট্যান্ডেলোন" চালাতে চান তবে সুস্পষ্ট প্রোফাইল সোর্সিং বেশ কার্যকর হয়ে যায়, এটি অদ্ভুত পরিবেশ এবং তাই থেকেও সুরক্ষা দেয় ...
এক্সা

1
@exa +100 এটি ক্রন্টব shকাজের দ্বারা লিখিত স্ক্রিপ্টগুলি তৈরি করে। আপনি * * * * * echo $PATH > ~/crontab_path.txtএক মিনিটের পরে ফাইলটি পরীক্ষা করে পরীক্ষা পছন্দ করে এটিকে নিশ্চিত করতে পারেন path
ভূগোলিক

উত্তর:


177

আমি ব্যবহৃত /etc/crontab। আমি viএই ফাইলটিতে আমার প্রয়োজনীয় প্যাথএইচএস ব্যবহার এবং প্রবেশ করেছি এবং এটি মূল হিসাবে চালিয়েছি। আপনি যে সেট আপ করেছেন সেটি স্বাভাবিক ক্রোনটব 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
এটি ব্যবহারকারী পর্যায়ে ক্রন্টব-ইয়ের সাথে কাজ করে এবং এটি সেভাবেও নিরাপদ।
রবার্ট ব্রিসিটা

2
আমি কি sh এর পরিবর্তে ব্যাশ ব্যবহার করতে পারি?
কেয়েড

1
অবাক করা বিষয় (আমার কাছে) @Crissygormley দ্বারা দেখানো হিসাবে ডিফল্ট PATH / etc / crontab এ সেট করা হয়েছে এবং আমার (উবুন্টু) ক্রন্টব এ সেট করাও / ইত্যাদি / পরিবেশের পথ থেকে পৃথক, বিশেষত এটি / sbin রাখে এবং / বিন / usr / sbin এবং / usr / বিন এর আগে। এটি এখন ব্যবহারকারীর পরিবেশের মতো করে তুলতে আমি আমার / ইত্যাদি / ক্রন্টব এ পরিবর্তন করেছি।
স্কুবিডু

আমার জন্য কাজ করছে না .. আমি কোনও ফাইলে ক্রোন সামগ্রী আউটপুট করছি। ক্রোন রান করে, ফাইল তৈরি করে তবে এটি এতে কোনও সামগ্রী রাখছে না।
ভোল্টিল 3

2
মনে হচ্ছে /etc/crontabউবুন্টু 14.04-এ মূল হিসাবে চলার সময় সেট করা সমস্ত পাথ ক্রোন-তে উপলব্ধ নয় to ( 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

ক্রোনট্যাব বিধিগুলির আগে PATH সংজ্ঞায়িত হওয়ার ফলে ক্রোনসটব ক্রিসিসগর্মলির উত্তরের মতো দেখাবে।


22

আপনার নিজের মধ্যে পুরো পথ রাখা উচিত crontab। এটি সবচেয়ে নিরাপদ বিকল্প।
আপনি যদি এটি না করতে চান তবে আপনি আপনার প্রোগ্রামগুলির চারপাশে একটি র‌্যাপার স্ক্রিপ্ট রাখতে পারেন এবং সেখানে PATH সেট করতে পারেন।

যেমন

01 01 * * * command

হয়ে:

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

এছাড়াও যে কিছু থেকে ডাকা হয়েছে cronসেগুলি চালিত প্রোগ্রামগুলি সম্পর্কে খুব সতর্কতা অবলম্বন করা উচিত এবং সম্ভবত PATHভেরিয়েবলের জন্য নিজস্ব পছন্দ নির্ধারণ করা উচিত ।

সম্পাদনা করুন:

কমান্ডটি কোথায় তা আপনি যদি না জানেন তবে আপনি which <command>নিজের শেল থেকে কার্যকর করতে চান এবং এটি আপনাকে পথটি বলে দেবে।

EDIT2:

সুতরাং একবার আপনার প্রোগ্রামটি চালু হয়ে গেলে, প্রথমে এটি করা উচিত সেট করা উচিত এবং স্ক্রিপ্টটি চালানোর জন্য প্রয়োজনীয় মানগুলির সাথে PATHঅন্য কোনও প্রয়োজনীয় ভেরিয়েবল (উদাঃ LD_LIBRARY_PATH) স্থাপন করা উচিত ।
মূলত ক্রোন পরিবেশকে কীভাবে আপনার প্রোগ্রাম / স্ক্রিপ্টের জন্য আরও উপযুক্ত করে তুলতে হবে তা চিন্তা করার পরিবর্তে - আপনার স্ক্রিপ্টটি প্রদত্ত পরিবেশটিকে হ্যান্ডেল করে তুলুন, যখন এটি শুরু হয় তখন একটি উপযুক্ত সেট করে setting


1
যদি এটি আপনার পথে থাকে তবে 'কোন আদেশ' ব্যবহার করে এবং এটি আপনাকে পুরো পথ দেবে
পল হিলান

@ ডগলাস লিডার - আপনি যখন বলছেন যে পুরো পথটি ক্রোনটিতে রেখেছেন, তখন আপনার অর্থ কি এটি ক্রন্টব বা অন্য কোনও ফাইলে রাখা হয়েছে? যদি ক্রোন কমান্ডটি হয়: '01 01 * * * কমান্ড 'এটি কীভাবে হয়। ধন্যবাদ
খ্রিস্টসগর্মলি 16

@chrissygormley - হ্যা crontab
ডগলাস লিডার

দুঃখিত কিছু বিভ্রান্তি অবশ্যই আছে। আমি উপরের প্রশ্নটি উচ্চারণ করেছি।
ক্রাইসিসগর্মলি

16

আমার ক্রন্টবায় কমান্ড লাইনের ঠিক আগে PATH নির্ধারণ করা আমার পক্ষে কাজ করেছিল:

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

এইভাবে পছন্দ করুন। বা স্ক্রিপ্টের পুরো পথ নির্দিষ্ট করুন।
zw963

5
আমি মনে করি না যে পথটি ক্রমবর্ধমান থাকবে, প্রতিবারই এটি একটি নতুন পরিবেশ হয়ে
উঠবে

@ Jjcf89 সঠিক কিনা তা নিশ্চিত করতে পারেন, প্রতিটি রান প্যাথ টাটকা।
ইলেক্ট্রোভিয়ার

14

সঠিক ক্রিয়াকলাপ সহ ব্যবহারকারী ক্রন্টবায় একটি PATH সংজ্ঞা যুক্ত করা সহায়তা করবে ... আমি আমার সাথে খালি পূরণ করেছি:

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

এবং আমার সমস্ত স্ক্রিপ্টগুলি কাজ করার জন্য এটি যথেষ্ট ... আপনার যদি প্রয়োজন হয় তবে কোনও কাস্টম পাথ অন্তর্ভুক্ত করুন।


1
ব্যবহারকারীর ক্রন্টাবের জন্য এটি সঠিক উত্তর হওয়া উচিত। কোনও সিস্টেমের প্রত্যেকেই সম্পাদনা করতে পারে না /etc/crontab। এটি ব্যবহারকারীর স্তরের সবচেয়ে সহজ উত্তর। ভাল কাজ @ ট্রেভিও। আপনি যদি রাজি হন তবে এটিকে ভোট দিন।
ফ্রেডেরিক্জেহ

14

আপনার ভেরিয়েবলগুলি আপনার জন্য কাজ করুন, এটি অ্যাক্সেসের অনুমতি দেবে

আপনার PATH /etc/profile.d/*.sh এ সংজ্ঞায়িত করুন

সিস্টেম-ব্যাপী পরিবেশের ভেরিয়েবল

/Etc/profile.d ডিরেক্টরিতে .sh এক্সটেনশানযুক্ত ফাইলগুলি যখনই কোনও ব্যাশ লগইন শেল প্রবেশ করা হয় (যেমন কনসোল থেকে লগ ইন করার সময় বা ssh ওভার), পাশাপাশি ডেস্কটপ সেশন লোড হওয়ার পরে ডিসপ্লে ম্যানেজার দ্বারা চালিত হয়।

আপনি উদাহরণস্বরূপ /etc/profile.d/myenvvars.sh ফাইলটি তৈরি করতে পারেন এবং এর মতো ভেরিয়েবল সেট করতে পারেন:

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

লগইন বিকল্পের সাথে ক্রন্টব চালাও!

সিআরএনএটিএবি এনভায়রনমেন্ট ভেরিয়েবলগুলির সাথে স্ক্রিপ্ট বা কমান্ড চালান

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

আমার এআইএনএক্স ক্রোন এটি / ইত্যাদি / পরিবেশ থেকে পরিবেশগত পরিবর্তনশীলগুলি চয়ন করে।

সম্পাদনা: আমি বিভিন্ন বয়সের কয়েকটি লিনাক্স বাক্সও পরীক্ষা করে দেখেছি এবং এগুলিতে এই ফাইলটি উপস্থিত রয়েছে বলে মনে হয় এটি সম্ভবত এআইএক্স নির্দিষ্ট নয়।

আমি জোমলারের ক্রোন পরামর্শ ব্যবহার করে এবং / ইত্যাদি / পরিবেশে PATH ভেরিয়েবল সম্পাদনা করার আগে এবং পরে আউটপুট পরীক্ষা করে দেখেছি checking


3

আপনি যদি বিভিন্ন জায়গায় একই সম্পাদনা করতে না চান তবে মোটামুটিভাবে এটি করুন:

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

দ্য . আপনার পরিবেশকে চলমান বাশ শেলের পরিবর্তনের জন্য স্থান এবং তারপরে .bashrc এবং && কমান্ডের জাদু। খুব বেশি, যদি আপনি সত্যিই শেলটি বাশ করতে চান তবে আপনার ক্রন্টবায় একটি লাইন থাকা ভাল ধারণা:

SHELL=/bin/bash

আশা করি এটি কাউকে সাহায্য করবে!


2

ক্রোন জবগুলির জন্য ডিফল্ট পরিবেশটি খুব বিচ্ছিন্ন এবং আপনার পাইথন স্ক্রিপ্টগুলির বিকাশকারী পরিবেশের থেকে খুব আলাদা। ক্রোন চালিত স্ক্রিপ্টের জন্য, আপনি যে কোনও পরিবেশের উপর নির্ভর করেন তা পরিষ্কারভাবে সেট করা উচিত। ক্রোন ফাইলে নিজেই অজগর এক্সিকিউটেবল এবং আপনার পাইথন স্ক্রিপ্টগুলির পুরো পথ অন্তর্ভুক্ত করুন।


2

আমি জানি এটি ইতিমধ্যে জবাব দেওয়া হয়েছে, তবে আমি ভেবেছিলাম যে এটি কারও পক্ষে কার্যকর হবে। আমার একটি অনুরূপ সমস্যা ছিল যা আমি সম্প্রতি সমাধান করেছি ( এখানে পাওয়া গেল ) এবং এই প্রশ্নের উত্তর দেওয়ার জন্য আমি যে পদক্ষেপ নিয়েছি তা এখানে হাইলাইটগুলি রয়েছে:

  1. আপনার স্ক্রিপ্টটি পরীক্ষা করে দেখতে চাইলে যে কোনও শেলের জন্য আপনি প্রাইফাইল বা .বাশ_প্রফাইলে যে শেলটি ব্যবহার করতে চান তার ভিতরে পাইথোনপাথের (আপনার এখানে এবং এখানে আরও তথ্যের জন্য পাওয়া যায়) আপনার প্রয়োজনীয় ভেরিয়েবল রয়েছে কিনা তা নিশ্চিত করুন।

  2. ক্রোন চাকরিতে আপনার স্ক্রিপ্টটি চালানোর জন্য প্রয়োজনীয় ডিরেক্টরিগুলি অন্তর্ভুক্ত করতে আপনার ক্রোনটব সম্পাদনা করুন (এখানে এবং এখানে পাওয়া যায়)

    ক) এখানে বর্ণিত PATH ভেরিয়েবল (।) এর মধ্যে মূল ডিরেক্টরি অন্তর্ভুক্ত করার বিষয়ে নিশ্চিত হন (মূলত আপনি যদি আপনার কমান্ডের সাথে এক্সিকিউটেবল চালাচ্ছেন তবে এটি নির্ধারণযোগ্য সংরক্ষণযোগ্য ডিরেক্টরি বা ডিরেক্টরি খুঁজে পেতে সক্ষম হবে) এবং সম্ভবত এগুলি (পক্ষ থেকে / sbin: / বিন: / usr / sbin / usr / বিন)

  3. আপনার ক্রন্টব ফাইলটিতে এমন ক্রোনজব তৈরি করুন যা ডিরেক্টরিটিকে ডিরেক্টরিতে বদলে দেবে যেখানে আপনি স্ক্রিপ্টটি সফলভাবে চালিয়েছেন আগে (যেমন ব্যবহারকারী / ব্যবহারকারী / নথি / ফু)

    ক) এটি নীচের মত দেখতে হবে:

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

2

@ ট্র্যাভিনো: আপনার উত্তর আমাকে আমার সমস্যা সমাধানে সহায়তা করেছে। তবে, একটি শিক্ষানবিস জন্য, পদক্ষেপ বাই পদক্ষেপ দেওয়ার চেষ্টা।

  1. এর মাধ্যমে জাভা আপনার বর্তমান ইনস্টলেশন পান $ echo $JAVA_HOME
  2. $ crontab -e
  3. * * * * * echo $PATH- এটি আপনাকে ক্রোনটব বর্তমানে প্যাথ মানটি কী ব্যবহার করছে তা বুঝতে দেয়। ক্রোনট্যাব চালান এবং ক্রন্টব দ্বারা ব্যবহৃত AT PATH মান।
  4. আপনার কাঙ্ক্ষিত জাভা বিন পাথ সেট করতে আবার ক্রোনটব সম্পাদনা করুন: ক) crontab -e; খ) PATH=<value of $JAVA_HOME>/bin:/usr/bin:/bin(এটি একটি নমুনা পথ); গ) এখন আপনার নির্ধারিত কাজ / স্ক্রিপ্টের মতো */10 * * * * sh runMyJob.sh &; ঘ) 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 সহ, যেমন তারা লগ ইন করেছিল সেট করে শুরু করে It এটি বিভিন্ন ডিস্ট্রোজে একই কাজ করে, সোর্সিংয়ের চেয়ে বেশি নির্ভরযোগ্য ash আমি) এবং নির্দিষ্ট পথগুলিকে হার্ডকোডিং এড়িয়ে চলে যা কোন সমস্যা হতে পারে যদি আপনি উদাহরণ বা সেটআপ সরঞ্জাম সরবরাহ করেন এবং ব্যবহারকারীর সিস্টেমে কোন ডিস্ট্রো বা ফাইল বিন্যাস জানেন না।

আপনি suযদি রুটের চেয়ে আলাদা ব্যবহারকারী চান তবে আপনি ব্যবহারকারীর নামটিও নির্দিষ্ট করতে পারেন তবে কমান্ডের rootআগে আপনার প্যারামিটারটি সম্ভবত রেখে দেওয়া উচিত suকারণ suএটি নির্দিষ্ট করে যে কোনও ব্যবহারকারীর সাথে স্যুইচ করার যথেষ্ট সুযোগ রয়েছে ens


-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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.