আমি কীভাবে কোনও টার্মিনালটিকে একটি বিচ্ছিন্ন প্রক্রিয়াতে সংযুক্ত করব?


98

আমি আমার টার্মিনাল থেকে একটি প্রক্রিয়া আলাদা করে রেখেছি:

$ process &

সেই টার্মিনালটি এখন দীর্ঘ বন্ধ, তবে processএখনও চলছে, এবং আমি সেই প্রক্রিয়ার স্টিডিনে কিছু কমান্ড প্রেরণ করতে চাই। এটা কি সম্ভব?



1
জন্য অনুসন্ধান করুন retty, neercsইত্যাদি এবং দেখতে serverfault.com/questions/24425 , serverfault.com/questions/115998
গিলেজ

উত্তর:


112

হ্যাঁ, তাই প্রথমত, একটি নল তৈরি করুন: mkfifo /tmp/fifo। প্রক্রিয়াটি সংযুক্ত করতে জিডিবি ব্যবহার করুন: gdb -p PID

তারপর বন্ধ stdin: call close (0); এবং এটি আবার খুলুন:call open ("/tmp/fifo", 0600)

অবশেষে, লিখুন (একটি ভিন্ন টার্মিনাল থেকে, কারণ জিডিবি সম্ভবত স্তব্ধ হয়ে যাবে):

echo blah > /tmp/fifo


6
খুব চিত্তাকর্ষক!
স্যামুয়েল এডউইন ওয়ার্ড

1
আমি কি কোনও ফাইলে পুনর্নির্দেশ প্রক্রিয়াকরণের অনুরূপ কিছু করতে পারি?
rustx

@ রুস্টিক্স: অন্টিস্টেড তবে এটি কাজ করা উচিত: পাইপের পরিবর্তে একটি ফাইল তৈরি করুন touch /tmp/thefile,। স্টাডাউট 1, তাই call close (1); এছাড়াও, লেখার জন্য সঠিক অনুমতি ব্যবহার করে: call open ("/tmp/thefile", 0400)echo…অর্থাৎ, অবশ্যই, প্রয়োজন না।
আনসার এস্জেটারম্যান

এটা অসাধারণ! আমি সম্পূর্ণরূপে বিচ্ছিন্ন হওয়া কিছু প্রক্রিয়াগুলিতে "y" বা "n" প্রতিক্রিয়াগুলি প্রেরণ করতে এটি ব্যবহার করছি। বিচ্ছিন্ন প্রক্রিয়াটির একটি পৃথক উইন্ডোতে স্ট্যান্ডআউট রয়েছে। তবে আমি যখন এই কৌশলটি করি তখন আমি দেখতে পাচ্ছি যে এটি প্রতিধ্বনিত হওয়ার সাথে সাথে এটি 'y' বা 'n' "গ্রহণ করে না", অবশ্যই আমাকে জিডিবি ছেড়ে দিতে হবে এবং এটি পৃথক করে এবং তারপর এটি অনুসারে সমস্ত প্রতিধ্বনি গ্রহণ করে, তাই ফিফো থেকে প্রক্রিয়াটি ইনপুট পাওয়ার আগে জিডিবি ছাড়ার প্রয়োজন ছাড়া এটি করার কোনও উপায় আছে কি?
krb686

দুর্ভাগ্যক্রমে এটি কেবল ঝুলন্ত মনে হচ্ছে call open("/tmp/fifo", 0600)। যে কোনও সাহায্যের প্রশংসা করা হবে
তীরন্দাজ

27

যখন মূল টার্মিনালটি আর অ্যাক্সেসযোগ্য না থাকে ...

reptyrআপনি যা চান তা হতে পারে, https://serverfault.com/a/284795/187998 দেখুন

সেখান থেকে উদ্ধৃতি:

Reptyr এ দেখুন , যা ঠিক তাই করে। গিথুব পৃষ্ঠায় সমস্ত তথ্য রয়েছে।

reptyr - "পুনরায় ptying" প্রোগ্রামগুলির জন্য একটি সরঞ্জাম।

একটি বিদ্যমান চলমান প্রোগ্রাম গ্রহণ এবং এটি একটি নতুন টার্মিনালে সংযুক্ত করার জন্য reptyr একটি ইউটিলিটি। এসএসএসের মাধ্যমে দীর্ঘকালীন চলমান প্রক্রিয়া শুরু হয়েছে, কিন্তু ছেড়ে যেতে হবে এবং এটিকে বাধা দিতে চান না? কেবল একটি স্ক্রিন শুরু করুন, এটি দখল করতে reptyr ব্যবহার করুন এবং তারপরে ssh সেশনটি মেরে এবং বাড়িতে চলে যান।

, USAGE

reptyr পিআইডি

"reptyr PID" আইডি পিআইডি সহ প্রক্রিয়াটি দখল করবে এবং এটি আপনার বর্তমান টার্মিনালের সাথে সংযুক্ত করবে।

সংযুক্তির পরে, প্রক্রিয়াটি নতুন টার্মিনালে input C এবং ^ Z সহ আউটপুট লিখবে এবং আউটপুট লিখবে। (দুর্ভাগ্যক্রমে, আপনি যদি এটি ব্যাকগ্রাউন্ড করেন তবে আপনাকে পুরানো টার্মিনালে "বিজি" বা "এফজি" চালাতে হবে। আপনার শেলটি প্যাচ না করে যুক্তিসঙ্গত উপায়ে এটি ঠিক করা অসম্ভব))


12

আমি নিশ্চিত আপনি পারবেন না।

ব্যবহার করে পরীক্ষা করুন ps x। একটি প্রক্রিয়া একটি থাকে ?যেমন নিয়ন্ত্রণ TTY , তাই না ইনপুট এটা আর কোন পাঠাতে পারেন।

9942 ?        S      0:00 tail -F /var/log/messages
9947 pts/1    S      0:00 tail -F /var/log/messages

এই উদাহরণে, আপনি যেমন 9947কিছু করার জন্য ইনপুট প্রেরণ করতে পারেন echo "test" > /dev/pts/1। অন্যান্য প্রক্রিয়া ( 9942) পৌঁছনীয় নয়।

পরের বার, আপনি এই পরিস্থিতি এড়াতে পর্দা বা tmux ব্যবহার করতে পারেন ।


5
অথবা dtachযদি আপনার পুরো প্রয়োজন না হয় screen
manatwork

4
স্ট্যান্ডার্ডগুলিতে (পসিক্স, এসইউএস) কোনও উপায় নেই তবে অনেকগুলি (বেশিরভাগ?) সিস্টেমে ডিবাগাররা যে পদ্ধতি ব্যবহার করেন তা ব্যবহার করে এটি সম্ভব। দেখুন Ansgar এর উত্তরrootআপনি এমনকি অন্য ব্যবহারকারীর প্রক্রিয়াতে এটি করতে পারে With
dmckee

3
এরকম echo "test" > /dev/pts/1প্রক্রিয়া ইনপুট পাঠাব না 9947- এটা আউটপুট শব্দ "পরীক্ষা" যে প্রক্রিয়া এর টার্মিন্যালে হবে।
psmears

6

সম্পাদনা : স্টিফেন গিমেনেজ যেমন বলেছিলেন, এটি এত সহজ নয়। এটি কেবল আপনাকে আলাদা টার্মিনালে মুদ্রণ করতে দিচ্ছে।

আপনি / proc ব্যবহার করে এই প্রক্রিয়া লিখতে চেষ্টা করতে পারেন । এটি / proc / pid / fd / 0 এ অবস্থিত হওয়া উচিত , তাই সাধারণ:

echo "hello" > /proc/PID/fd/0

এটা করা উচিত। আমি এটি চেষ্টা করে দেখিনি, তবে এটি কার্যকর হওয়া উচিত, যতক্ষণ না এই প্রক্রিয়াটির একটি বৈধ স্টিডিন ফাইল বিবরণী রয়েছে। আপনি এটি ls -lঅন / প্রোক / পিড / এফডি / দিয়ে পরীক্ষা করতে পারেন ।

  • এটি যদি / dev / null => এর লিঙ্ক হয় তবে এটি বন্ধ রয়েছে
  • এটি যদি / dev / pts / X বা কোনও সকেট => এর লিঙ্ক হয় তবে এটি উন্মুক্ত

প্রক্রিয়াগুলি কীভাবে চলতে থাকবে সে সম্পর্কে আরও বিশদ জানতে নোহপ দেখুন ।


2
এটা অত সস্তা না. উদাহরণস্বরূপ, স্টিডিন যদি কোনও টার্মিনালের সাথে যুক্ত থাকে, echoটার্মিনাল ডিভাইসে কিছু যুক্ত করে আপনি টার্মিনালে যা লিখেছিলেন তা মুদ্রণ করবে, এটি প্রক্রিয়াতে সঞ্চারিত হবে না।
স্টাফেন গিমেনেজ

5

কমান্ড লাইনটি কেবলমাত্র সমাপ্তি দিয়ে &প্রক্রিয়া সম্পূর্ণ আলাদা হবে না, এটি কেবল এটি পটভূমিতে চালাবে। ( আপনি আসলে এটি আলাদা zshকরতে ব্যবহার করতে পারেন &!, অন্যথায় আপনি disownএটি পরে করেছেন) have

কোনও প্রক্রিয়া ব্যাকগ্রাউন্ডে চললে, এটি আর তার নিয়ন্ত্রণকারী টার্মিনাল থেকে ইনপুট গ্রহণ করবে না। তবে আপনি এটিকে অগ্রভাগে আবার পাঠাতে পারেন fgএবং তারপরে এটি আবার ইনপুট পড়বে।

অন্যথায়, বাহ্যিকভাবে এর ফাইলডিজিপ্টারগুলি (স্টিডিন সহ) পরিবর্তন করা বা কোনও হারিয়ে যাওয়া নিয়ন্ত্রণকারী টার্মিনাল পুনরায় সংযুক্ত করা সম্ভব নয় ... যদি না আপনি ডিবাগিং সরঞ্জামগুলি ব্যবহার করেন ( আনসারের উত্তর দেখুন বা rettyকমান্ডটি দেখুন)।


এবং এখানে একটি সম্পর্কিত প্রশ্ন রয়েছে: unix.stackexchange.com/q/17648/9426
স্টাফেন গিমেনেজ

@ রোগাচ বিবৃত হয়েছে "সেই টার্মিনালটি এখন দীর্ঘকাল বন্ধ"।
andcoz

1
@ অ্যান্ডকোজ: হ্যাঁ তবে তিনি ভাগ্যবান যে এই প্রোগ্রামটি সাইনআপ করা হয়নি। আমি একটি নিরাপদ পদ্ধতি পরামর্শ দিচ্ছিলাম।
স্টাফেন গিমেনেজ

এখানে, অস্বীকার কেবল সত্যই তখন কাজ করে যদি আমি প্রথমে স্টডআউটকে পুনঃনির্দেশিত করি >>/dev/stderr, অন্যথায়, যখন আমি টার্মিনালটি বন্ধ করি, তখন "অস্বীকৃত" প্রক্রিয়াটিও শেষ হয়ে যায় .. আমি কখনই এই সত্য বুঝতে পারি নি ..
কুম্ভ বিদ্যুৎ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.