বর্তমান প্রক্রিয়াটিকে তার কপ্রোসেস / শিশু দ্বারা প্রতিস্থাপন করুন


10

আমার একটি প্রোগ্রাম রয়েছে Pযা "হ্যালো" এবং আউটপুট "কেন?" একটি বৈশিষ্ট্য সরবরাহ করার আগে। এই বৈশিষ্ট্যটি অন্যান্য প্রোগ্রামগুলি ব্যবহার করে যা সচেতন নয় যে "হ্যালো" দিয়ে কথোপকথন শুরু করা সাধারণ সৌজন্য বিষয়। আমি এইভাবে এটির জন্য একটি মোড়ক লিখতে Pচাই (zsh সিনট্যাক্স):

coproc P
print -p Hello  # Send Hello to P
read -pr line   # Read what P has to say
[[ "$line" = "Why?" ]] && Replace current process with the coprocess.
echo Could not get P's attention.

ব্যবহার catবা ddমধ্যে Replace...(ভালো কিছু অংশ cat <&p &; exec cat >&p) অপ্রয়োজনীয় বাফারিং ফলাফল। আমার বিকল্পগুলি কি?


আপনি কি zshসমাধান চান বা bashসমাধান গ্রহণযোগ্য?
রোয়াইমা

1
আমি এমন কোনও bashসমাধানে হতাশ হব যা প্রযোজ্য zshনয় তবে অবশ্যই এটি গ্রহণ করবে ☺
মাইকেল

এটি কি জানা যায় যে অন্যান্য প্রোগ্রামগুলি এই স্ক্রিপ্টটি চালাবে? এটি কি সীমাবদ্ধ তালিকা, বা এটি কোনও সংখ্যা হতে পারে? স্পষ্টতই অন্য প্রোগ্রামটি কল করার জন্য এটি সম্পর্কে একটি জানা দরকার।
Lizardx

আমার সাধারণ ব্যবহার ছিল sshএবং এর বিকল্প ছিল ProxyCommand
মিশাল

1
catসাধারণত বাফার করে না। যদি এটি আপনার সিস্টেমে হয় তবে চেষ্টা করুন cat -u
স্টাফেন চেজেলাস

উত্তর:


1

আপনি যে সমস্যাটি বলেছেন তা আসলে কোনও প্রক্রিয়া প্রতিস্থাপনের বিষয়ে নয় , তবে একটি বিদ্যমান প্রক্রিয়ার স্রোত প্রতিস্থাপনের বিষয়ে । লক্ষ্যটি হ'ল প্রক্রিয়াটির সাথে কিছুটা ইন্টারঅ্যাক্ট করা এর পরে এর ইনপুট / আউটপুটটিকে সংযুক্ত স্ট্রিমগুলির অন্য এক জোরে হস্তান্তর করা।

এটি সরাসরি করার কোনও উপায় নেই (কমপক্ষে শেলের মধ্যে; প্রক্রিয়ার অভ্যন্তরে, dup2কলটি কল্পনা করে কাজ করতে পারে)। আপনার স্ট্রিমগুলি বিভক্ত করতে হবে। অর্থাৎ,

( echo Hello ; cat ) | P | ( read ; cat )

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

এটি অতিরিক্ত বাফারিংয়ের কারণ হবে না (কমপক্ষে জিএনইউ বিড়ালের সাথে), যদি না পি ইনপুট / আউটপুট প্রবাহগুলির সাথে সংযুক্ত থাকে এবং তার উপর ভিত্তি করে বাফার সিদ্ধান্ত না নেয়। উদাহরণস্বরূপ, সি স্ট্যান্ডার্ড লাইব্রেরি বাফারিং সক্ষম করবে stdout/ stderrযদি তারা কোনও ফাইলে সংযুক্ত থাকে তবে কেবল টার্মিনালের সাথে সংযুক্ত থাকলে লাইন বাফারিং সম্পাদন করে।


-1

বাফারিং এড়ানোর জন্য পার্ল ব্যবহার করে নীচের কোড দিয়ে পরীক্ষা করতে সক্ষম, যদি এটি আপনার পক্ষে কাজ করে তবে চেষ্টা করুন

পি এর নমুনা সংস্করণ

$ cat /tmp/P
#!/bin/bash
read input
if [[ $input = "Hello" ]]
then
    echo "Why?"
else
    exit 1
fi
echo "Got Hello from client, working ..."
sleep 10
echo "Need to read some input"
read x
echo "Got: $x"

মোড়ক প্রোগ্রাম

$ cat /tmp/wrapper 
#!/usr/bin/zsh
coproc /tmp/P
print -p Hello  # Send Hello to P
read -pr line   # Read what P has to say
if [[ "$line" = "Why?" ]]; then
    perl -e '$|=1;print $_ while(<>);' <& p &
    perl -e '$|=1;print $_ while(<>);' >& p
else
    echo "Could not get P's attention."
fi

টেস্ট রান

$ /tmp/wrapper 
Got Hello from client, working ...
Need to read some input
hi there P!   <== Typed in at teminal
Got: hi there P!

dd ibs=1উদাহরণস্বরূপ এটি ব্যবহারের মতোই । আমি এই ভাল না। একরকমভাবে, কপোকরের নিজস্ব বাফারিং রয়েছে এবং এটি এটিই আমি ব্যবহার করতে চাই।
মাইকেল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.