ক্রোন এর প্যাথ সেট কোথায়?


34

ক্রোন ব্যবহারকারীর পাথ ব্যবহার করে না যার ক্রন্টাব এটি এবং পরিবর্তে এর নিজস্ব রয়েছে। PATH=/foo/barক্রন্টাবের শুরুতে এটি যোগ করে সহজেই পরিবর্তন করা যেতে পারে এবং ক্লাসিক ওয়ার্কআরআন্ড হ'ল ক্রোন দ্বারা চালিত কমান্ডগুলির জন্য সর্বদা পাথ ব্যবহার করা, তবে ক্রোনটির ডিফল্ট PATH সংজ্ঞা কোথায়?

আমি আমার আর্চ সিস্টেমে নিম্নলিখিত বিষয়বস্তুগুলির সাথে ক্রোনটব তৈরি করেছি (ক্রোনি 1.5.1-1-1) এবং একই ফলাফল সহ একটি উবুন্টু 16.04.3 এলটিএস বক্সেও পরীক্ষা করেছি:

$ crontab -l
* * * * * echo "$PATH" > /home/terdon/fff

মুদ্রিত:

$ cat fff
/usr/bin:/bin

কিন্তু কেন? ডিফল্ট সিস্টেম-প্রশস্ত পথ সেট করা আছে /etc/profileতবে এতে অন্যান্য ডিরেক্টরি অন্তর্ভুক্ত রয়েছে:

$ grep PATH= /etc/profile
PATH="/usr/local/sbin:/usr/local/bin:/usr/bin"

প্রাসঙ্গিক অন্য কিছুই নেই /etc/environmentবা /etc/profile.d, অন্যান্য ফাইল আমি ভেবেছিলাম সম্ভবত ক্রন দ্বারা পড়া হতে পারে:

$ grep PATH= /etc/profile.d/* /etc/environment
/etc/profile.d/jre.sh:export PATH=${PATH}:/usr/lib/jvm/default/bin
/etc/profile.d/mozilla-common.sh:export MOZ_PLUGIN_PATH="/usr/lib/mozilla/plugins"
/etc/profile.d/perlbin.sh:[ -d /usr/bin/site_perl ] && PATH=$PATH:/usr/bin/site_perl
/etc/profile.d/perlbin.sh:[ -d /usr/lib/perl5/site_perl/bin ] && PATH=$PATH:/usr/lib/perl5/site_perl/bin
/etc/profile.d/perlbin.sh:[ -d /usr/bin/vendor_perl ] && PATH=$PATH:/usr/bin/vendor_perl
/etc/profile.d/perlbin.sh:[ -d /usr/lib/perl5/vendor_perl/bin ] && PATH=$PATH:/usr/lib/perl5/vendor_perl/bin
/etc/profile.d/perlbin.sh:[ -d /usr/bin/core_perl ] && PATH=$PATH:/usr/bin/core_perl

/etc/skelআশ্চর্যজনকভাবে কোনও /etc/cron*ফাইলের সাথেও প্রাসঙ্গিক কিছু নেই বা এটি কোনও ফাইলে সেট করা হচ্ছে না :

$ grep PATH /etc/cron* /etc/cron*/*
grep: /etc/cron.d: Is a directory
grep: /etc/cron.daily: Is a directory
grep: /etc/cron.hourly: Is a directory
grep: /etc/cron.monthly: Is a directory
grep: /etc/cron.weekly: Is a directory
/etc/cron.d/0hourly:PATH=/sbin:/bin:/usr/sbin:/usr/bin

সুতরাং, যেখানে ব্যবহারকারী ক্রন্টাবগুলি জন্য ক্রোনের ডিফল্ট PATH সেট করা আছে? এটি কি cronনিজেই হার্ডকোডযুক্ত ? এটি কি এর জন্য কোনও ধরণের কনফিগারেশন ফাইলটি পড়ে না?


3
কোনও বিশেষ শেল cronদেখার জন্য /etc/profile, বা যত্ন নেওয়ার কোনও কারণ নেই । একটি ভাল প্রশ্ন হল কেন না cronপড়া PATHথেকে login.defs(লিনাক্সের দিকে) অথবা login.conf(* বাসদ তে) খুলুন। আমি মনে করি এটি শেষ পর্যন্ত একটি বাস্তবায়ন বিশদ।
সাটস ক্যাটসুরা

@ স্যাটাকাতসুর নিশ্চিত, আমি কেবল উল্লেখ করেছি /etc/profileকারণ এটি নিজের var=valueমতো একই বাক্য গঠন ( ) ব্যবহার cronকরে, তাই এটি করার পক্ষে যথেষ্ট সহজ হবে এবং /etc/profileআমার জ্ঞানের পক্ষে এটি খুব বিস্তৃত। আমাকে অবাক করে দেওয়ার বিষয়টি হ'ল আমি এটি কোথাও সেট করা অবস্থায় দেখতে পেলাম না তাই দেখে মনে হচ্ছিল এটি হার্ড কোডেড। প্রকৃতপক্ষে যেমনটি ঘটেছে, তেমন স্টিফেন নীচে ব্যাখ্যা করেছেন।
টেরডন

লোকেরা zshতাদের ইন্টারেক্টিভ শেল হিসাবে ব্যবহার করে না /etc/profile(যা নির্দিষ্ট করে bash) সে সম্পর্কে চিন্তা করে না
বেসিল স্টারিনকিভিচ

2
@ বাসাইলস্টারিঙ্কেভিচ নং, এটি মোটেও নির্দিষ্ট নয় ! পুরোপুরি বিপরীত! কিছু শেল রয়েছে যা এটি পড়ে না (সি-শেল পরিবার আফাইক), zsh এর মধ্যে একটি নয়। Zsh ম্যানপেজটি দেখুন, যদি আপনি আমাকে বিশ্বাস করেন না। যে কোনও ক্ষেত্রে, ইন্টারেক্টিভ শেলগুলি অপ্রাসঙ্গিক কারণ বিভিন্ন profileফাইল কেবল লগইন শেলগুলিই পড়তে পারে, যাইহোক। এগুলি ইন্টারেক্টিভ হতে পারে বা নাও হতে পারে।
টেরডন

1
কখনও কখনও stringsকোনও প্রোগ্রামের বিরুদ্ধে চালানো এই হার্ড-কোডড মানগুলিও সন্ধান করতে সহায়তা করে।
jrw32982

উত্তর:


47

এটি সোর্স কোডটিতে হার্ড-কোডড (যেটি বর্তমান দেবিয়ানের দিকে লিঙ্কটি দেখায় cron- বিভিন্ন cronবাস্তবায়নের বিষয়টি বিবেচনা করে একটি নির্বাচন করা শক্ত, তবে অন্যান্য বাস্তবায়ন সম্ভবত একই রকম হয়):

#ifndef _PATH_DEFPATH
# define _PATH_DEFPATH "/usr/bin:/bin"
#endif

#ifndef _PATH_DEFPATH_ROOT
# define _PATH_DEFPATH_ROOT "/usr/sbin:/usr/bin:/sbin:/bin"
#endif

cronএকটি কনফিগারেশন ফাইল থেকে ডিফল্ট পাথ পড়তে পারে না; আমি যুক্তির কল্পনা করি যে এটি ইতিমধ্যে যে PATH=কোনও ক্রোনজবসে ব্যবহৃত পাথগুলি নির্দিষ্ট করে তা সমর্থন করে , তাই অন্য কোথাও ডিফল্ট নির্দিষ্ট করতে সক্ষম হওয়ার দরকার নেই। (হার্ড-কোডড ডিফল্টটি অন্য কোনও কিছু যদি কাজের প্রবেশের ক্ষেত্রে কোনও পথ নির্দিষ্ট না করে তবে ব্যবহৃত হয় ))


নোট করুন যে, _PATH_DEFPATH_ROOTসংজ্ঞায়নের অস্তিত্ব থাকা সত্ত্বেও , আমি ডিবিয়ান স্ট্রেচ echo $PATH > /testfileব্যবহার crontab -eকরে মূলের ক্রন্টব সম্পাদনা করার পরে (ক্রোন জব ব্যবহার করে ) নিশ্চিত করেছিলাম যে রুটের ক্রন্টাবও ব্যবহার করে _PATH_DEFPATH, যেমন "/ usr / bin: / bin", নয় _PATH_DEFPATH_ROOT । এটি এই উত্তরের দ্বিতীয় উত্স কোড লিঙ্ক দ্বারা নিশ্চিত করা হয়েছে (এতে _PATH_DEFPATH_ROOTব্যবহৃত হয় না)। এই অনাথ সংজ্ঞায়িত বাগটি কিনা তা আমার কাছে স্পষ্ট নয়।
এনজাহেঙ্কে

8

স্টিফেন Kitt এর উত্তর যোগ করা হচ্ছে, সেখানে একটি কনফিগারেশন ফাইল যে সেট PATHউবুন্টু উপর ক্রন, এবং cron উপেক্ষা যে PATHহার্ড কোডেড ডিফল্ট ব্যবহার করতে (বা PATHcrontabs নিজেদের মধ্যে সেট গুলি)। ফাইলটি হ'ল /etc/environment। নোটের cronপিএএম কনফিগারেশন:

$ cat /etc/pam.d/cron
...   
# Read environment variables from pam_env's default files, /etc/environment
# and /etc/security/pam_env.conf.
session       required   pam_env.so

# In addition, read system locale information
session       required   pam_env.so envfile=/etc/default/locale
...

এটি সহজেই যাচাইযোগ্য। এতে একটি ভেরিয়েবল যুক্ত করুন /etc/environment, বলুন foo=bar, env > /tmp/fooক্রোনজব হিসাবে চালান এবং foo=barআউটপুটে প্রদর্শিত হবে তা দেখুন।


কিন্তু কেন? ডিফল্ট সিস্টেম-ব্যাপী পাথটি / ইত্যাদি / প্রোফাইলে সেট করা থাকে তবে এতে অন্যান্য ডিরেক্টরি অন্তর্ভুক্ত থাকে:

$ grep PATH= /etc/profile
PATH="/usr/local/sbin:/usr/local/bin:/usr/bin"

এটি আর্চ লিনাক্সে সত্য, তবে উবুন্টুতে, বেসটি PATHসেট করা আছে /etc/environment। ফাইলগুলি /etc/profile.dবিদ্যমানটির সাথে সামঞ্জস্য হয় PATHএবং আপনি এটিতে সংযোজন করতে পারেন ~/.pam_environment। আমি আর্চের আচরণ সম্পর্কে একটি বাগ দায়ের করেছি

দুর্ভাগ্যক্রমে, /etc/pam.d/cronথেকে পড়া অন্তর্ভুক্ত করে না ~/.pam_environment। অদ্ভুতভাবে, /etc/pam.d/atd এই ফাইলটি অন্তর্ভুক্ত করে:

$ cat /etc/pam.d/atd
#
# The PAM configuration file for the at daemon
#

@include common-auth
@include common-account
session    required   pam_loginuid.so
@include common-session-noninteractive
session    required   pam_limits.so
session    required   pam_env.so user_readenv=1

... তবে কমান্ডগুলি কাজ atতৈরি করার সময় দৃশ্যত উপলব্ধ পরিবেশের উত্তরাধিকারী হয় at(উদাহরণস্বরূপ, env -i /usr/bin/at ...খুব পরিষ্কার পরিবেশের সাথে কাজ চালানো মনে হয়)।

সংশোধন /etc/pam.d/cronকরে user_readenv=1মনে হচ্ছে কোনও সমস্যা নেই, এবং ভেরিয়েবলগুলি ~/.pam_environmentসূক্ষ্ম প্রদর্শিত শুরু করেছে ( PATHঅবশ্যই ব্যতীত )।


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


atচাকরীর বিষয়ে , আপনি যদি কোনও atচাকরি ফেলে দেন তবে আপনি দেখবেন এটি কাজটি তৈরি হওয়ার সময় পরিবেশের সাথে মেলে তুলতে এটি পরিবেশকে সুস্পষ্টভাবে সেট করে।
স্টিফেন কিট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.