বিদ্যমান পরিবেশের ভেরিয়েবলগুলি সহ আমি ক্রোন কমান্ড কীভাবে চালাতে পারি?


114

বিদ্যমান পরিবেশের ভেরিয়েবলগুলি সহ আমি ক্রোন কমান্ড কীভাবে চালাতে পারি?

আমি শেল প্রম্পটে থাকলে আমি টাইপ করে echo $ORACLE_HOMEএকটি পাথ পেতে পারি । এটি আমার পরিবেশগত পরিবর্তনশীলগুলির মধ্যে একটি যা আমার মধ্যে সেট হয়ে যায় ~/.profile। যাইহোক, এটি দেখে মনে হচ্ছে যে ~/.profileলোডযুক্ত ফ্রন ক্রোন স্ক্রিপ্টগুলি পায় না এবং তাই আমার স্ক্রিপ্টগুলি ব্যর্থ হয় কারণ $ORACLE_HOMEভেরিয়েবল সেট করা হয়নি।

ইন এই প্রশ্নের লেখক তৈরি উল্লেখ ~/.cronfileপ্রফাইল যা ক্রন জন্য ভেরিয়েবল সেট আপ, এবং তারপর তিনি তার সব ক্রন কমান্ড স্ক্রিপ্ট মধ্যে তিনি তার মধ্যে রাখে লোড করতে কার্যসংক্রান্ত নেই ~/Cronডিরেক্টরি। একটি ফাইল ~/.cronfileমতামত মত একটি মতামত মত ধারণা, কিন্তু উত্তর বাকি কিছুটা জটিল মনে হচ্ছে এবং আমি আশা করছিলাম যে কেউ আমাকে একই ফলাফলের জন্য একটি সহজ উপায় বলতে পারে।

আমি মনে করি আমার স্ক্রিপ্টগুলির শুরুতে আমি এর মতো কিছু যুক্ত করতে পারি source ~/.profileতবে মনে হয় এটি অনর্থক হতে পারে।

তাহলে আমি কীভাবে আমার ক্রোন স্ক্রিপ্টগুলিকে আমার ইন্টারেক্টিভ-শেল প্রোফাইল থেকে ভেরিয়েবলগুলি লোড করতে পারি?


কীভাবে source ~/.profileএকটি প্রোগ্রামের অতিরিক্ত কাজ যোগ করা হচ্ছে ? প্রোগ্রামগুলি কলিং প্রোগ্রাম থেকে তাদের পরিবেশের উত্তরাধিকারী। যদি সেই কলিং প্রোগ্রামটি আপনার শেল না হয়, তবে কীভাবে প্রতারণামূলক প্রোগ্রামটি আপনার পছন্দমতো পরিবেশ পাবে?
আর্জেজ

আমি ইতিমধ্যে আমার অনুরূপ প্রশ্নের উত্তর এখানে লিখেছি এটি কেবলমাত্র su -lরুট বা অন্যান্য নির্দিষ্ট ব্যবহারকারীর জন্য AT পাথ সহ একটি সাধারণ লগইন পরিবেশ সেটআপ করতে ব্যবহার করে।
টাস্কেট

উত্তর:


141

ক্রন্টবটিতে, আপনি আদেশ দেওয়ার আগে যুক্ত করুন . $HOME/.profile। উদাহরণ স্বরূপ:

0 5 * * * . $HOME/.profile; /path/to/command/to/run

Cronআপনার শেল সম্পর্কে কিছুই জানে না; এটি সিস্টেম দ্বারা শুরু করা হয়েছে, সুতরাং এটির একটি ন্যূনতম পরিবেশ রয়েছে। আপনি যদি কিছু চান তবে আপনার এটি নিজের মধ্যে নিয়ে আসা দরকার।


14
.স্ক্রিপ্ট আগে কি করে ? (আমি কীভাবে করব তা নিশ্চিত নয় man)। এর থেকে আলাদা কেন source?
সিডব্লিউ

25
.কমান্ড জন্য মূল কমান্ড source। এগুলি শেলের মধ্যে সমান এবং টাইপ করা কিছুটা সহজ, বিশেষত একটি ক্রন্টাবের মধ্যে। আরও তথ্য পেতে, টাইপ করুন help .বা zshbuiltins টাইপের শীর্ষে ^SHELL BUILTIN COMMANDSম্যান পৃষ্ঠাতে অনুসন্ধান করুন ` আপনাকে বলবে যে কমান্ডটি একটি অন্তর্নির্মিত। bashman . Running
আর্জেজ

9
লিনাক্স ডিস্ট্রিবিউশন উপর নির্ভর করে, আপনি পরিবর্তন করার প্রয়োজন হতে পারে .profileদ্বারা .bash_profile.profileব্যবহারকারীর হোম ডিরেক্টরিতে কোন ফাইল বিদ্যমান তা পরীক্ষা করুন।
ফ্রস্টি জেড

@ আর্জেজ এটি আমার পক্ষে কার্যকর হবে না (ফেডোরা কোর ২১), এবং আমার ধারণা শেল স্তরটি নীচে নেমে আসার কারণে। পরিবর্তে, আপনি যদি এটি উত্স করেন তবে কি কাজ করে।
রিচার্ড টি

3
সম্ভবত এটি যদি এটি কাজ না করে তবে এটি ক্রোন স্ক্রিপ্টের শেলকে বাশ করতে সেট করা হয়নি, সুতরাং এটি আপনার প্রত্যাশা মতোই কার্যকর হচ্ছে না।
ড্যানিয়েল ফারেল

40

আরেকটি বিকল্প, যা আমি সহজ মনে করি তা হ'ল ক্রোনটি দিয়ে স্ক্রিপ্টটি চালানো এবং স্ক্রিপ্টে পরিবেশ থাকা।

ক্রন্টব-ফাইলটিতে:

SHELL=/bin/bash

*/1 * * * * $HOME/cron_job.sh

ক্রোন_জব.এস ফাইলে:

#!/bin/bash
source $HOME/.bash_profile
some_other_cmd

.বাশ_প্রফাইলে উত্সের পরে যে কোনও কমান্ডের এমন পরিবেশ থাকবে যেমন আপনি লগ ইন করেছেন।


5
এডাব্লুএস লিনাক্স এএমআইতে চলাকালীন, আমার কাছে এমনকি এটি ঘটেনি যে ক্রোন /bin/bashশেল হিসাবে ব্যবহার করবে না । আমি ভাবছিলাম যে cd /path/to/project; source .varsম্যানুয়ালি এগুলি টাইপ করার পরে যখন জিনিসগুলি কেন কাজ করবে তবে File not foundক্রোনজবগুলিতে অন্তর্ভুক্ত হওয়ার পরে ব্যর্থ হবে ( )। আমার জন্য মূল লাইনটি সেটিংস করা হচ্ছিল SHELL=/bin/bashযাতে প্রতিটি প্রকৃতপক্ষে আমি প্রকৃত বাশ কমান্ড ব্যবহার করতে পারি। /bin/sh/(ডিফল্ট ক্রোন শেল, স্পষ্টতই) খুব সীমাবদ্ধ।
হার্টলি ব্রোডি

এটি খুব খারাপ যে আপনি ক্রোন শীর্ষে পরিবেশ ফাইলগুলি নির্দিষ্ট করতে পারবেন না যেমন আপনি পৃথক পরিবেশের ভেরিয়েবলগুলি নির্দিষ্ট করতে পারেন। সিস্টেমডের একটি EnvironmentFileপরিষেবা ইউনিট রয়েছে। খুব খারাপ ক্রোন এর অনুরূপ কিছু নেই।
র‌্যাডটেক

আপনি সমস্ত ক্রান্তাবস্থায় সমস্ত স্ক্রিপ্ট / বিন / ব্যাশ ব্যবহার করতে বাধ্য হন, যা আপনার ক্রোন লাইন সম্পর্কেও ভাল ধারণা নয়, * * / 1 * * * * OME হোম / ক্রোন_জব.শ ... * / 1 WHAT এর পক্ষে ভাল ?!? একটি তারা মানে এটি প্রতি মিনিটে মৃত্যুদন্ড কার্যকর করা হবে / 1 অর্থ প্রতি মিনিটে কার্যকর করা হবে, স্মার্ট সম্প্রদায়ের উত্তর হিসাবে এটি একটি বাজে পাপ, এখন আমি বিশ্বাস করি আপনি সেরা বলতে খুব বিভ্রান্ত হয়েছেন ... দুঃখিত
থ্রিজার

1
এটিকেই উদাহরণ বলা হয়। আপনার প্রয়োজনের সাথে সামঞ্জস্য করতে নির্দ্বিধায় বা এগুলি ব্যবহার করবেন না। বিভিন্ন folks জন্য বিভিন্ন স্ট্রোক।
রবার্ট ব্রিসিটা

4
যদি $SHELLহয় /bin/shতবে sourceকমান্ডের অস্তিত্ব নেই। .পরিবর্তে ব্যবহার করুন।
মেলি 21

18

আরেকটি বিকল্প, যা আমি সহজ মনে করি তা হ'ল ক্রোনটি দিয়ে স্ক্রিপ্টটি চালানো এবং লগইন করতে বাশকে বলা (সুতরাং /etc/profile.d/...পরিবেশের সংজ্ঞা ব্যবহার করে )

ইন crontab -eফাইল:

*/1 * * * * bash -l -c './cron_job.sh'
*/1 * * * * bash -l -c 'php -f ./cron_job.php'

উত্সের পরে যে কোনও কমান্ডের .bash_profileএমন পরিবেশ থাকবে যেমন আপনি লগ ইন করেছেন।


10

খারাপ ধারণা। সাধারণ অনুশীলনটি হ'ল বিশেষভাবে সমস্ত প্রয়োজনীয় পরিবেশগত পরিবর্তনগুলি একটি স্ক্রিপ্টে সেট করা যা ক্রোন জব থেকে চালানো হয় to


আমি @fpmurphy এর সাথে একমত, যেভাবে এটি সুরক্ষিত প্রক্রিয়া পরিবেশ নিশ্চিত করে। আপনি যদি ক্রোন থেকে কেবল কয়েকটি ভেরিয়েবল সেট করতে চান তবে আপনি ভেরিয়েবলগুলি সেট করতে /usr/bin/envকমান্ড ব্যবহার করতে পারেন এবং তারপরে ক্রোনজব জন্য পরিবেশ প্রক্রিয়া হিসাবে কাজ করতে পারেন।
নিখিল মুলি

ডিমনটোলসওenvdir মনে আসে।
sr_

6
আমি সবাই সুরক্ষার জন্য, তবে সম্ভবত আমি একটি ফাইল তৈরি করতে পারি ~/.cronvarsএবং এটি প্রোফাইল এবং আমার ক্রোন স্ক্রিপ্টগুলিতে অন্তর্ভুক্ত করতে পারি। আমি চালিত প্রতিটি স্ক্রিপ্টগুলিতে আমি হার্ড কোড পরিবেশগত পরিবর্তনশীলগুলি চাই না কারণ যখন প্রতিটি ফাইলের পাথগুলি হার্ড কোডেড পাথগুলি পরিবর্তন করে তখন বজায় রাখা সহজ হয় না। দেখে মনে হচ্ছে এটি প্রয়োজনীয় ভেরিয়েবলগুলির জন্য একটি কেন্দ্রীভূত স্থানের অনুমতি দেবে এবং এখনও অন্য ভেরিয়েবলগুলি বোঝা হওয়া থেকে রক্ষা করবে।
সিডব্লিউড

4

এই বাক্য গঠনটি আপনাকে অবশ্যই সহায়তা করে। আমি সিনট্যাক্সটি বুঝতে পারি না, তবে এটি কাজ করে। ওরাকল এই সিনট্যাক্সটি ব্যবহার করে, যখন ক্র্যাক্ট্যাব-এ ওরাকল কনফিগারেশন ম্যানেজার স্থাপন করা হয়, সুতরাং, আমি বিশ্বাস করি যে এটি একটি সঠিক সমাধান।

0 5 * * * SOME_ENV_VAR=some_value some_command some_parameters

2

আমি সম্প্রতি একটি কেস পেয়েছি যেখানে আমাকে সামগ্রিক ক্রোনজবকে মূল হিসাবে চালিত করতে হয়েছিল তবে একই সাথে একটি পৃথক ব্যবহারকারী হিসাবে একটি সাবকম্যান্ড চালাতে হয়েছিল (যার ব্যবহারকারীর পরিবেশের স্রোসিং প্রয়োজন)। আমি নিম্নলিখিত পদ্ধতির সাথে গিয়েছিলাম:

# m  h  dom  mon  dow  user  command
*/5  *   *    *    *   root  (sudo -i -u <the user> command-to-be-run-as-user) && command-to-be-run-as-root

গুরুত্বপূর্ণ অংশটি সেই আর্গুমেন্টটি যা -iপাস করা হচ্ছে sudoযা প্রদত্ত কমান্ডকে একটি পৃথক লগইন শেলের মধ্যে কার্যকর করবে (যার অর্থ দাঁড়ায় যে ব্যবহারকারীর ডটফিলগুলি স্রোস করা হবে)।

দ্রষ্টব্য: উল্লেখ্য যে userকলামে শুধুমাত্র উপলব্ধ /etc/crontabএবং /etc/cron.d/*ফাইল।


1

সমাধান, যা আমার পক্ষে কাজ করেছিল, তা এখানে বর্ণিত হয়েছে

আপনি একটি মোড়ক স্ক্রিপ্ট তৈরি করেন, যা কল করে . ~/.cronfileএবং তারপরে আপনি যা চান তা করেন। এই স্ক্রিপ্টটি ক্রোন দ্বারা চালু করা হয়েছে।

ইন ~/.cronfileআপনি আপনার জন্য cron কাজ পরিবেশ উল্লেখ করুন।


1

হ্যাঁ, আপনি "সুপরিচিত ওয়ার্কারআউন্ডস" ব্যবহার করতে পারেন (যার কয়েকটি তালিকাবদ্ধ করা হয়েছে)। এটি বলার আর একটি উপায় যা সবাই জানেন যে এটি কৃপণ, যদিও কিছু লোক এটিকে একটি "সুরক্ষা বৈশিষ্ট্য" হিসাবে উল্লেখ করবে কারণ তারা আপনার ব্যর্থতার (ইউরে) কমপক্ষে যতটা ট্রিপিং ব্যয় করেছে, এবং তাদের চিন্তা করতে চায় নষ্ট সময় অকার্যকর ছিল না। এটি কিউয়ার্টি কীবোর্ডের ক্রোন সমতুল্য।

আমি সন্দেহ করি যে আসল কারণটি পারফরম্যান্সের কারণ হতে পারে, যেমন স্ক্রিপ্টগুলি এক মিনিটে একবার চালিত হয় আরসি স্ক্রিপ্টগুলি পড়তে সময় ব্যয় করবে না। এছাড়াও মূলত ক্রোন সত্যই আদৌ কনফিগারযোগ্য ছিল না, তাই একটি ডিফল্ট সত্যই ছিল একমাত্র বিকল্প।

ব্যবহারকারীরা বোকা শেল জিমন্যাস্টিকগুলি সম্পাদন করার পরিবর্তে ক্রোনটি আপনার ইন্টারেক্টিভ শেলের পরিবেশ গ্রহণের জন্য কোনও সাধারণ কনফিগারেশন বা পদ্ধতি না রেখে কোনও অতিরিক্ত সুরক্ষা নেই। একটি আধুনিক মেশিনে প্রতি মিনিটে আপনার প্রচুর পরিমাণে কাজ চলমান না থাকলে সাধারণত কোনও উপলব্ধিযোগ্য পারফরম্যান্স লাভ হয় না।

ইউনিক্স সংস্কৃতি ব্যর্থ। আমার মতে. :-)


1
"এখানে কোনও অতিরিক্ত সুরক্ষা নেই" " ওটা সত্যি না. কটাক্ষপাত জন্য CVE-2011-1095 , জন্য CVE-2008-4304 , এবং জন্য CVE-2010-3847

আমি আপনার উত্তরকে রাস্তায় নামিয়ে দিয়েছি। আমি সাধারণত নতুনদের উত্তরকে উঁচু করে এড়াতে চেষ্টা করি তবে সুরক্ষা আমার কাছে গুরুত্বপূর্ণ। ডাউনভোটকে ভুল পথে নেবেন না দয়া করে। সুরক্ষা সম্পর্কে অংশ ছাড়াও, আপনার উত্তরটি দুর্দান্ত এবং একটি উত্সাহ পাওয়ার যোগ্য। আপনি চাইলে আপনার উত্তরটি এখানে সম্পাদনা করতে পারেন।

ইন্টারেক্টিভ ফ্ল্যাগ সেট সহ ক্রোন শেল ব্যবহারের সাথে তাদের কারওই সামান্যতম কাজ নেই। এটি খাঁটি এফইউডি। দুর্ভাগ্যক্রমে আমি আপনার ডাউনটোটকে কম করতে পারি না can't এটি শিখার মতো মনে হতে পারে তবে এটি খুব হতাশাব্যঞ্জক যখন লোকেরা মনে করে তিন চাকাযুক্ত একটি গাড়ি আরও ভাল কারণ চতুর্থ চাকা লাগানোর জন্য সুরক্ষা সমস্যা রয়েছে। এটা না। লোকেরা এতক্ষণ একটি ট্রাইসাইকেল চালিয়েছে তারা ভুলে গেছে চতুর্থ চাকা যুক্ত করা সম্ভব।
অস্টিন এস

অন্য একটি উপায় রাখুন: যদি অন্য উত্তরদাতাদের প্রস্তাবিত অতিরিক্ত হুপগুলির কোনও ব্যবহার করা হয় তবে কীভাবে তারা আপনার উল্লিখিত ছিদ্রগুলিতে অ্যাক্সেস পাবে না? "* * * * * এক্সিকিউশন বাশ -i -c লোকাল = ......."
অস্টিন এস

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


1

প্রোফাইল সেট করার পরিবর্তে, আমাকে সেটিংস স্থাপন করতে সহায়তা করেছিল PATH। কিছু PATHআলাদা কমান্ড আমার ক্রোন স্ক্রিপ্টগুলিতে আলাদা ছিল না।

ENVIRONMENT=prod
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
*/30 * * * * /opt/myscript1.sh
*/30 * * * * /opt/myscript2.sh
*/30 * * * * /opt/myscript3.sh

PATHআদেশের পথের সাথে সেট করা আমাকে সাহায্য করেছিল। আরও ভাল আপনি যদি কোনও টেম্পলেট ব্যবহার করতে পারেন এবং পরে উদাহরণস্বরূপ করতে পারেন,

ENVIRONMENT={{ENVIRONMENT}}
PATH={{PATH}}
*/30 * * * * /opt/myscript1.sh
*/30 * * * * /opt/myscript2.sh
*/30 * * * * /opt/myscript3.sh

প্রতিটি আইটেমে ভেরিয়েবলগুলি পাস করা অগোছালো দেখাচ্ছে।


-1

আমি রাখি . ~/.dbus/session-bus/*আমার কাঙ্ক্ষিত স্ক্রিপ্টের শীর্ষে :)


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