ক্রোন ".bashrc" এবং ".bash_profile" এ সংজ্ঞায়িত ভেরিয়েবল উপেক্ষা করে


49

আমি / ইত্যাদি / ক্রন্টব ফাইলটিতে "শেল" ভেরিয়েবল সংজ্ঞায়িত করেছি:

[martin@martin ~]$ grep SHELL /etc/crontab 
SHELL=/usr/local/bin/bash
[martin@martin ~]$ file /usr/local/bin/bash
/usr/local/bin/bash: ELF 32-bit LSB executable, Intel 80386, version 1 (FreeBSD), dynamically linked (uses shared libs), for FreeBSD 8.0 (800107), stripped
[martin@martin ~]$ 

এছাড়াও, / etc / crontab ফাইলটিতে আমার সমস্ত স্ক্রিপ্টগুলি "মার্টিন" ব্যবহারকারীর অধীনে শুরু হয়েছিল। তবে /home/martin/.bash_profile (লগইন শেলের জন্য) এবং /home/martin/.bashrc (লগ-ইন শেলের জন্য) কিছু ভেরিয়েবল রয়েছে যা ক্রোন জবের ক্ষেত্রে অগ্রাহ্য করা হয়, তবে আমি যদি মেশিনে লগ ইন করতাম তবে ব্যবহৃত হয় এসএসএইচ বা নতুন বাশ সেশন খুলুন। ক্রোন কেন এই পরিবর্তনগুলি উপেক্ষা করে? ক্রোন কি কেবল "মার্টিন" ব্যবহারকারীর অনুমতি নিয়ে "/ usr / local / bin / bash my-script.sh" চালাচ্ছে না?


2
উবুন্টু ব্যবহারকারীদের উবুন্টু ডিফল্ট খেয়াল করা পছন্দ করতে পারেন .bashrcহয়েছে একটি লাইন এটি চালু করা থেকে স্টপ নন-ইন্টারেক্টিভ শেল হবে।
জোয়েটউইডেল 4'18

উত্তর:


72

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

* * * * * source /home/user/.bash_profile; <command>

অথবা

#!/bin/bash
source /home/user/.bash_profile

<commands>

2
নোট করুন যে ক্রোন bashশেলটি ব্যবহার না করে থাকলে "উত্স" কাজ করবে না । আমি একটি উত্তর যুক্ত করেছি যা শেলটি হলে কেস পরিচালনা করতে পারে sh
জোনাথন


23

কারণ এটি কোনও ইন্টারেক্টিভ শেল নয়। আপনি কিছু টার্মিনাল খুললে একই ঘটে happens

এই প্রশ্নটি একবার দেখুন: .bashrc ফাইলটি কী? | সুপার ব্যবহারকারী

এবং এই এক:

.বাশার্ক, .বাশ_প্রফাইলে এবং। পরিবেশের মধ্যে পার্থক্য কী? | স্ট্যাক ওভারফ্লো

সংযোগটি লগইন শেল (না না), একটি ইন্টারেক্টিভ শেল (বা না), বা উভয়ই নির্ভর করে বিভিন্ন স্ক্রিপ্টগুলিতে আগুন।

আপনি যদি বাশার্ক তৈরি করতে চান তবে আপনাকে এই পরিবর্তনটি করতে হবে:

যখন শশ স্ক্রিপ্টটি চালনার জন্য বাশকে অ-ইন্টারেক্টিভভাবে শুরু করা হয়, উদাহরণস্বরূপ, এটি পরিবেশে BASH_ENV পরিবর্তনশীল সন্ধান করে, সেখানে উপস্থিত থাকলে এর মানটি প্রসারিত করে, এবং পড়ার জন্য এবং কার্যকর করতে ফাইলের নাম হিসাবে বর্ধিত মান ব্যবহার করে । বাশ এমন আচরণ করে যেন নিম্নলিখিত আদেশটি কার্যকর করা হয়েছিল:

if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi 

তবে PATH ভেরিয়েবলের মান ফাইলের নাম অনুসন্ধান করতে ব্যবহৃত হয় না।

উপরে উল্লিখিত হিসাবে, যদি একটি অ-ইন্টারেক্টিভ শেল --loginবিকল্পের সাথে ডাকা হয় , বাশ লগইন শেল স্টার্টআপ ফাইলগুলি থেকে কমান্ডগুলি পড়তে এবং সম্পাদন করার চেষ্টা করে।

সূত্র: বাশ স্টার্টআপ ফাইল | বাশ রেফারেন্স ম্যানুয়াল | gnu.org


সুতরাং যদি আমরা ক্রনের অভ্যন্তরে BASH_ENV সেট করি তবে ক্রোন ব্যাশ স্ক্রিপ্টগুলি উত্স হিসাবে প্রমাণ করবে কারণ ক্রোনটি অ ইন্টারেক্টিভ এবং অ লগইন নয়।
সিএমসিডিগ্রাগনকাই

12

শেলটি ব্যবহার করা sourceথাকলে আপনি চালাতে পারবেন না sh। আপনার ক্রন্টবায় নিম্নলিখিত লাইনটি যুক্ত করে এটি পরিবর্তন করা যেতে পারে:

SHELL=/bin/bash
* * * * * source "/root/.bashrc"; <command>

আপনি পরিবেশটি নির্দিষ্ট করতে পারেন:

BASH_ENV="/root/.bashrc"
* * * * * <command>

অথবা আপনি /home/user/.bashrcযদি স্থানীয় ক্রোন জব হন (যেমন crontab -e) আপনার স্থানীয় ব্যবহার করতে পারেন ।

মনে রাখবেন যে এটি উপস্থিত থাকলে .bash_profileপ্রতিস্থাপন করতে পারে .bashrc

ক্রেডিট: ক্রোন শেল (sh থেকে bash) কীভাবে পরিবর্তন করবেন?


এটি আকুইয়া ক্লাউড তফসিলযুক্ত কাজের জন্যও ভাল কাজ করে, যা মূলত ক্রোন জব। আপনি একই কাজ করতে পারেন, যেমন:SHELL=/bin/bash && source /home/YOUR_USER_NAME/.bash_profile && sh ....
আলেজান্দ্রো মোরেনো

1

.bashrcক্রোনজব থেকে আপনার সেরিংয়ের সাথে হস্তক্ষেপ করতে পারে এমন অন্য কিছু হ'ল ইন্টারেক্টিভ শেলগুলি সনাক্ত করতে এই ফাইলটি এই ফাইলটি করে এমন কোনও চেক।

উদাহরণস্বরূপ, উবুন্টু 18.04-এ, .bashrcকোনও ব্যবহারকারীর জন্য ডিফল্ট এটি দিয়ে শুরু হয়:

# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

এবং সুতরাং এটি সোর্সিং কার্যকর কিছু করতে পারে না কারণ এটি অবিলম্বে প্রস্থান করবে।


1

আপনি -lবিকল্পটির সাহায্যে বাশকে অনুরোধ করতে পারেন, এটির মতো:

* * * * * /bin/bash -l /path/to/script arg1 arg2

-lবিকল্প একটি bash তোলে লগইন শেল। সুতরাং, এটি ব্যবহারকারীর পড়তে হবে .bash_profile। এটি ব্যবহারকারীর পড়বে না .bashrcযতক্ষণ না এটি স্পষ্টভাবে উত্সাহিত করে .bash_profile। এটি কারণ অ ইন্টারেক্টিভ শেলগুলি স্বয়ংক্রিয়ভাবে পড়ে না .bashrc। তবে আপনার .bashrcক্রোন কাজের প্রয়োজন হবে না কারণ .bashrcএটি ইন্টারেক্টিভ শেলের জন্য দরকারী জিনিসগুলি সেট করার জন্য ।

প্রকারভেদ:

যদি ব্যাশ PATH এ থাকে তবে একটি নিখুঁত পথ নির্দিষ্ট করার দরকার নেই:

* * * * * bash -l /path/to/script arg1 arg2

একটি অপ্টিমাইজেশন হ'ল এটি ব্যবহার করে বর্তমান শেলটি প্রতিস্থাপন করা হবে exec:

* * * * * exec bash -l /path/to/script arg1 arg2

1

bashএটি শেল বা সাধারণ প্রোগ্রামিং ল্যাঙ্গুয়েজের (যেমন perlবা python) আলাদাভাবে কাজ করে ।

নকশা করে, সেটিংস ~/.bash_profile, ~/.bashrcইত্যাদি ব্যবহারকারীদের জিনিষ যখন সেট করতে হয় bashনাটকগুলি একটি শেল ভূমিকা (লগইন শেল, interractive শেল)। আপনার xterm( পরিবেশগত শেল) বা sshসেশনে (লগইন শেল) বা কনসোলে (লগইন শেল) পরিবেশের কথা চিন্তা করুন ।

অন্যদিকে, bashএকটি শক্তিশালী প্রোগ্রামিং ভাষাও systemd- এটি পরিষেবা পরিচালনার জন্য অনেকগুলি স্ক্রিপ্ট সম্পর্কে চিন্তাভাবনা করে - যার জন্য ভিন্ন ধরণের কাজের প্রয়োজন হয়। উদাহরণস্বরূপ, যখন কোনও বিকাশকারী কোনও সিস্টেম স্ক্রিপ্ট বা কোনও bashপ্রোগ্রাম লিখছেন , তখন সে ~/.bash_profileস্বয়ংক্রিয়ভাবে ব্যবহারকারীর উত্স উত্স করতে পছন্দ করবে না । এটি একটি শেল নয়, একটি সাধারণ প্রোগ্রাম। একটি সাধারণ প্রোগ্রাম (প্রোগ্রাম সহ bash) স্বাভাবিকভাবেই বর্তমান চলমান সংশোধন (শেল) থেকে সেটিংসের উত্তরাধিকারী হবে , তবে সেগুলি সেট করে না ।

আমরা যদি জন্য একটি প্রোগ্রাম লিখতে cronমধ্যে bash-এটা শুধু লেখা যেতে ঘটবে bash; আসলে, আমরা এটা লিখতে পারে pythonবা perlবা অন্য কোন progamming language- তারপর আমরা উৎস একটি বিকল্প থাকতে পারে bashএর ~/.bash_profile(পড়া: ব্যবহারকারীর শেল, যা শুধু আপনার প্রোগ্রামিং ভাষা একই ভাষা হতে হবে সেটিং):

[ -f /home/user/.bash_profile ] && . /home/user/.bash_profile

তবে, যদি সেই নির্দিষ্ট ব্যবহারকারী bashতার শেল হিসাবে ব্যবহার না করেন? তিনি / সে ব্যবহার করতে পারেন zsh, ksh, fish, ইত্যাদি সুতরাং, যে অনুশীলন সত্যিই কাজ করবে না যখন জনগণের ব্যবহারের জন্য প্রোগ্রাম লেখা।

সুতরাং, আপনি উত্স করতে পারেন ~/.bash_profileযদি আপনি ভাবেন যে এটি কার্যকর হবে। কিন্তু, এখানে, তাই না কিনা আমরা সোর্স করার জন্য একটি ফাইল পারবেন, এটা সম্পর্কে কিভাবে যে উচিত সিস্টেম কাজ করে: নকশা ধারণা । সংক্ষেপে: আমাদের bash2 টি ভূমিকা থাকা শেল এবং প্রগতিশীল ভাষা হিসাবে দেখা উচিত । তারপরে সবকিছু বুঝতে খুব সহজ হবে।


0

ক্রোন থেকে নোড অ্যাপ্লিকেশন কার্যকর করার সময় আমার একই সমস্যা ছিল যা এনভিএম ব্যবহার করে, ক্রোন থেকে .bashrc ফাইলটি পড়ার জন্য ব্যাশ শেলটি তৈরি করার জন্য কেবল ইন্টারেক্টিভ শেল বিকল্পের সাথে বাশ কমান্ডটি প্রত্যাখ্যান করুন `-l।

উদাহরণ: * * * * * /bin/bash -lc '/home/user/myapp.sh restart'

যদি এটি কাজ না করে তবে crontab এ পাথ ভেরিয়েবল সেট করার চেষ্টা করুন

41 7 * * * /bin/bash -lc "PATH=$PATH:/home/user/.nvm/versions/node/v8.10.0/bin && /home/user/script.sh restart "

-1

এটির সাথে মোকাবিলা করার আমার উপায়টি ছিল:

1) আমার ভেরিয়েবলগুলি (শেষে) রাখছি ~/.profile:

myVarInDotProfile="someValue"

২) আমার (দৈনিক) ক্রোন টাস্কগুলির জন্য বাশ স্ক্রিপ্ট তৈরি করা ( ~/cronDaily.sh) আমার কমান্ড এবং পুনরাবৃত্ত স্রোসিং এর সমন্বয়ে ~/.profle:

source ~/.profile
command ${myVarInDotProfile}/

3)crontab প্রতিদিন চালানোর জন্য, থেকে আমার স্ক্রিপ্টের সম্পাদনের সময়সূচী :

0 0 * * * bash ~/cronDaily.sh

আমার পরিবর্তনশীলটিকে অগ্রাহ্য করা হয়নি এবং কমান্ডগুলি সফলভাবে চলেছিল।


কেউ কেউ বলতে পারেন যে এরকম তীব্র সোর্সিং ~/.profileসমস্যাযুক্ত। আমার বিশেষ ক্ষেত্রে আমি কেন এটি সমস্যা তা দেখছি না তবে আমি এটির জন্য একটি ডেডিকেটেড ফাইল তৈরি করার বিষয়ে বিবেচনা করার পরামর্শ দেব।

সাধারণভাবে, এর আরও ভাল উপায় হতে পারে তবে এটাই আমার পক্ষে প্রচুর ব্যথার পরে কাজ করেছিল এবং এটি নীতিটি ব্যাখ্যা করে যে বাশ ৪.৩.৪6 হিসাবে আপনি কোনও ফাইল উত্স করতে পারবেন না crontab

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