`<& -` কী করে?


20

আমি বাশের একটি স্নিপেট অনুলিপি কার্যকর করা একটি ssh কমান্ডের পটভূমিতে অনুলিপি করেছি:

ssh user@remote <<CMD
some process <&- >log 2>error &
CMD

কি করে <&-?
আমার অনুমান যে এটি হিসাবে একই< /dev/null

আমার পরবর্তী বোঝার যে তিনটি প্রধান ফাইল বর্ণনাকারী (হয় stdin, stdout, stderr) প্রতিরোধ বন্ধ করা প্রয়োজন:

  1. কাজটি ব্যাকগ্রাউন্ডে চলছে এবং স্ক্রিপ্টটি প্রস্থান করা হচ্ছে - কোনওভাবে বিরোধী?
  2. টার্মিনালটি বন্ধ হয়ে গেলে, টার্মিনাল থেকে স্টিডিন গ্রহণকারী সমস্ত প্রক্রিয়া বন্ধ হয়ে যায়?

বাধ্যতামূলক ক্রস-রেফারেন্স: দেখুন শেলের নিয়ন্ত্রণ এবং পুনঃনির্দেশ অপারেটরগুলি কী কী? - যদিও এই অপারেটরটির সম্পর্কে যা বলা হয়েছে তা হ'ল এটি "ফাইল বর্ণনাকারীগুলি বন্ধ বা নকল করতে ব্যবহৃত হতে পারে" এবং আপনার "আপনার শেলের ম্যানুয়ালটির প্রাসঙ্গিক বিভাগটি দেখতে হবে"।
জি-ম্যান বলেছেন 'মনিকাকে পুনরায় ইনস্টল করুন'

যদি আমি সঠিকভাবে স্মরণ করি তবে ssh -nNT user@remote 'command'একটি অ-ইন্টারেক্টিভ এসএসএইচ সেশন তৈরি করব। পরিশেষে &এটা পটভূমি, শুরুতে যোগ করার nohupজন্য commandযদি আপনার সংযোগ ডাইস চলমান এটা রাখা।
কে কে কোয়ানকে

1
@ মার্ককোয়ান man sshপরামর্শ দেয় যে -N সম্পূর্ণরূপে একটি রিমোট কমান্ড চালানো অক্ষম করে এবং একটি দ্রুত পরীক্ষা এটি সমর্থন করে।
টম হান্ট

হ্যাঁ হ্যাঁ, আমি বিপরীত পোর্ট ফরওয়ার্ডিংয়ের জন্য -NNTR ব্যবহার করেছি। তখন -N এবং -আর উপেক্ষা করুন :)
কে কে কোয়ান

উত্তর:


30

<&-হিসাবে বেশ একই জিনিস নয় < /dev/null<&-fd 0 বন্ধ করে, যেখানে < /dev/nullএটি ডিভাইস থেকে পুনর্নির্দেশ করে /dev/null, যা কখনই কোনও ডেটা সরবরাহ করে না এবং সর্বদা পড়ার জন্য ইওএফ দেয়। পার্থক্যটি বেশিরভাগ ক্ষেত্রে হ'ল read(2)একটি বদ্ধ এফডি ( <&-কেস) এর কলটি EBADF এর সাথে ত্রুটি করবে, অন্যদিকে নাল-পুনঃনির্দেশিত এফডি থেকে কোনও কল পাঠানো কোনও বাইট পড়বে না (ফাইলের শেষ অবস্থার)। যদি আপনার প্রোগ্রামটি স্টাডিনের কাছ থেকে না পড়ে, তবে পার্থক্যটি কোনও বিষয় নয়।

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


সুতরাং আমি nohupফাইল বর্ণনাকারী বন্ধ করার পাশাপাশি ব্যবহার করা উচিত ?
এরিক ফ্রান্সিস

2
সর্বাধিক পুঙ্খানুপুঙ্খ পদ্ধতি (যা প্রোগ্রামগুলি নিজেদেরকে ডেমোনাইজ করার উপকরণকে অনুকরণ করে) এমন একটি setsid some process <&- >path/to/log 2>path/to/error। দ্রুত পদ্ধতিটি এরকম কিছু nohup some process &
টম হান্ট

2
@ এরিকফ্রান্সিস: nohupএখানে কোনও অর্থ নেই। nohupপ্রক্রিয়াটির HUPনিয়ন্ত্রণ টার্মিনালটি বন্ধ হয়ে যাওয়ার পরে সংকেত পেতে বাধা দেয় prevent তবে এই ক্ষেত্রে আপনার কোনও টার্মিনাল নেই।
cuonglm

@ টমহান্ট: ব্যাকগ্রাউন্ড প্রক্রিয়াটি স্থগিত হয় নি, ssh অধিবেশনটি করেছিল।
cuonglm

2
fds 0, 1 এবং 2 বন্ধ করা ভাল ধারণা নয় ... আপনি চান না যে পরবর্তী এফডি তৈরি করা মানগুলির মধ্যে একটি নিতে পারে take এগুলি / dev / নালগুলিতে পুনর্নির্দেশ করা ভাল
মারে জেনসেন

7

দেখুন man bash:

  [n]<&word

ইনপুট ফাইল বর্ণনাকারীদের সদৃশ করতে ব্যবহৃত হয়। যদি wordএক বা একাধিক অঙ্কে প্রসারিত হয় তবে ফাইল বর্ণনাকারী দ্বারা বর্ণিত ফাইল বর্ণনাকারীর nঅনুলিপি তৈরি করা হবে। যদি সংখ্যাগুলি word কোনও ফাইল বর্ণনাকারী ইনপুট জন্য খোলা নির্দিষ্ট না করে তবে একটি পুনর্নির্দেশ ত্রুটি ঘটে। শব্দটি যদি মূল্যায়ন করে তবে -ফাইল বিবরণী nবন্ধ রয়েছে। যদি nনির্দিষ্ট না করা থাকে তবে স্ট্যান্ডার্ড ইনপুট (ফাইল বর্ণনাকারী 0) ব্যবহৃত হয়।


সঠিক সংজ্ঞাটি হ'ল যখন আপনার কাছে থাকে [n]<&wordএবং শব্দের মধ্যে একটি ডিজিটের চেয়ে বেশি থাকে তখন তা অনির্দিষ্ট ।
স্পষ্টতই

আপনি কি বোঝাতে চেয়েছেন? man bashভুল কি ?
এরিক ফ্রান্সিস

@ এরিকফ্রান্সিস কারণ এটি স্ট্যান্ডার্ডে অনির্ধারিত, bashএটি একটি বুদ্ধিমান উপায়ে প্রয়োগ করতে পছন্দ করে ("বুদ্ধিমানের কিছু উপযুক্ত সংজ্ঞা দেওয়ার জন্য)"। অন্যান্য শেলগুলি এটি করতে পারে বা নাও পারে।
মুড়ু

@ মুরু প্রশ্নটি ট্যাগ bash, নয় posix-shell
বার্মার

@ বারমার ঠিক আছে তাই ...?
মুরু

7

<&- স্ট্যান্ডার্ড ইনপুট বন্ধ করুন।

সাধারণ ফর্ম, POSIX দ্বারা সংজ্ঞায়িত হয়:

[n]<&word

ফাইল বর্ণনাকারী nকরা এর উদ্দেশ্য হ'ল ফাইল বর্ণনাকারীর অনুলিপি wordnবাদ দেওয়া থাকলে স্ট্যান্ডার্ড ইন ধরে নেওয়া হয় এবং যদি wordহয় -তবে ফাইল বিবরণকারীটি nবন্ধ হয়ে যাবে।

এটি এর মতো নয় </dev/null, যেহেতু </dev/nullমানক ইনপুটটি এখনও খোলা হয়েছিল এবং অন্য জায়গায় পুনঃনির্দেশিত হয়েছিল।

আপনার প্রসেসগুলির সমস্ত ফাইল বর্ণনাকারী বন্ধ করতে হবে যা ssh সকেটের সাথে সংযুক্ত ছিল, অন্যথায়, ssh সেশনটি বন্ধ করতে পারবেন না।

আপনি স্ক্রিন বা tmux ব্যবহার করে ssh সেশনে এটি সংযুক্ত না করে দূরবর্তী মেশিনে কমান্ডটি চালাতে পারেন :

ssh user@remote 'screen -S test -d -m command'

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