পটভূমি প্রক্রিয়া স্টিডিনে লেখা


25

আমি একটি উবুন্টু 10.04 বাক্সে আছি, এবং ব্যাকগ্রাউন্ডে একটি সার্ভার শুরু করেছি (মাইসারভার ও) এসএসএসের মাধ্যমে। এটি দুর্দান্ত চলছে, তবে সার্ভারের স্টিডিনে যাওয়ার জন্য আমার একটি উপায় প্রয়োজন, কারণ এই পদ্ধতিটিই সার্ভারকে নিয়ন্ত্রণ করার একমাত্র উপায়।

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

কোন ধারনা?


আপনি কি একে পুরোপুরি ফিরিয়ে আনতে পারেননি? ('জবস' আপনার বর্তমান ব্যাকগ্রাউন্ড প্রক্রিয়াটি তালিকাভুক্ত করবে, 'fg-X' কাজটিকে অগ্রভাগে ফিরিয়ে আনবে, ctrl + b কাজটি থামিয়ে আপনাকে আপনার শেলের কাছে ফিরিয়ে দেবে, এবং 'বিজি' বিরামপ্রাপ্ত প্রক্রিয়াটি চালিয়ে যাবে ব্যাকগ্রাউন্ড)
সিমকিবিয়ান

উত্তর:


10

আপনি এটি / প্রোড পিআইডি ডিরেক্টরিতে লেখার চেষ্টা করতে পারেন। আপনার ডিমেনের পিড 2000 বলে বলুন, / proc / 2000 / fd / 0 তে লেখার চেষ্টা করুন


ধন্যবাদ ... আমি এটি পোস্ট করার ঠিক পরে খুঁজে পেয়েছি (দেখার এক দিন পরে - সাধারণ)। এটি কাজ করে বলে মনে হচ্ছে (যতক্ষণ না প্রোগ্রামে ডেটা প্রেরণ করা যায়)। দুর্ভাগ্যক্রমে, প্রোগ্রামটি আদেশগুলি গ্রহণ করে না। আমি এটি আমার স্থানীয় কম্পিউটারে সার্ভার চালিয়ে পরীক্ষা করেছি এবং যথেষ্ট নিশ্চিত হয়েছি, আমি ডেটা উপস্থিত দেখছি, কিন্তু প্রোগ্রামটি আদেশগুলি স্বীকৃতি দেয় না। আমাকে ম্যানুয়ালি সার্ভার টার্মিনালে এন্টার টিপতে হবে, এবং তারপরে এটি কেবল অবিজ্ঞাত কমান্ডটি বলে। কিছু জাভা অদ্ভুততা? আমি আটকে আছি ...
tajmorton

1
প্রতিধ্বনি-ই "কিছু \ n"> / প্রোক / 2000 / এফডি / 0 সম্পর্কে কীভাবে?
ক্যাটরিয়েল

প্রকৃতপক্ষে, এটি সর্বদা কমপক্ষে কয়েকটি সিস্টেমে / proc / <pid> / fd / 0 পয়েন্ট / dev / pts <কিছু নম্বর> হিসাবে
স্ফীত হয় না

সার্ভারফল্ট / প্রশ্ন / 178457/…- এর প্রথম উত্তরটি উল্লেখ করে যে এই পদ্ধতির আসলে কাজ হয় না।
ব্যারিকার্টার

2
এটি আসলে কাজ করে না। সাধারণত আপনার শেল (যখন কোন পাইপ বা পুনঃনির্দেশগুলি ব্যবহৃত হয়) ফাইল বর্ণনাকারী সঙ্গে কমান্ড আরম্ভ 0মাধ্যমে 2একই ফাইল, যা সাধারণত একটি ভার্চুয়াল টার্মিনাল (যেমন কিছু সেট /dev/pty/...)। কমান্ড তারপর সার্চ এফডি থেকে 0এবং লিখেছেন এফডি করতে 1এবং 2ভার্চুয়াল টার্মিনাল (যেমন SSH- র মাধ্যমে অথবা সরাসরি আপনার টার্মিনাল এমুলেটর সঙ্গে) সঙ্গে যোগাযোগ করার জন্য। অন্য কোনও প্রক্রিয়া যদি সেই ফাইলটি অ্যাক্সেস করে (যেমন মাধ্যমে /proc), ঠিক একই জিনিস ঘটে থাকে, অর্থাত এটিতে লেখাটি টার্মিনালকে লিখে দেয়, আদেশকে নয়।
Feuermurmel

29

আপনি এটির নামের ইনপুট হিসাবে পাইপ (ফিফো) দিয়ে সার্ভার শুরু করতে পারেন:

mkfifo /tmp/srv-input
cat > /tmp/srv-input &
echo $! > /tmp/srv-input-cat-pid
cat /tmp/srv-input | myserver &

cat > /tmp/srv-input &আপনার সার্ভারে এড়িয়ে যেতে একটি ফাইলের শেষে গ্রহণ করতে গুরুত্বপূর্ণ। কমপক্ষে একটি প্রক্রিয়াতে অবশ্যই লিখিতভাবে ফিফো খোলা থাকতে হবে যাতে আপনার সার্ভার কোনও EOF গ্রহণ না করে। এই কমান্ডের পিআইডি /tmp/srv-input-cat-pidফাইলটি লাস্টার কিলের জন্য সংরক্ষণ করা হয় ।

আপনার ক্ষেত্রে যেখানে আপনি ইতিমধ্যে আপনার সার্ভারটি শুরু করেছেন, আপনাকে ডিবাগার ব্যবহার করতে হবে যেমন gdbআপনার প্রক্রিয়াটিকে stdinফিফোতে পুনর্নির্দেশের জন্য সংযুক্ত করতে :

gdb -p PID
call close(0)
call open(0, "/tmp/srv-input", 0600)

এবং তারপরে আপনার সার্ভারে ইনপুট প্রেরণের জন্য বেলো জাতীয় কিছু করুন (প্রয়োজনে অন্য টার্মিনাল উইন্ডোতে):

echo "command" > /tmp/srv-input

আপনার সার্ভারে একটি ইওফ প্রেরণ করতে, আপনাকে cat > /tmp/srv-inputপিআইডি-র মধ্যে যে প্রক্রিয়াটি সংরক্ষণ করা হয়েছে তা শেষ করতে হবে /tmp/srv-input-cat-pid file

জিডিবির ক্ষেত্রে, কেবল জিডিবি ছেড়ে দিন এবং ইওএফ পাঠানো হবে।


1
এটি @ কেট্রিয়েলের কাছ থেকে অনেক বেশি বহনযোগ্য পন্থা হিসাবে যেমন / প্রো / 2000 / এফডি / 0 সমস্ত সিস্টেমে স্টিডিন নয়।
অগ্রণী 99

"বিড়াল> / টিএমপি / এসআরভি-ইনপুট &" এর কৌশলটি আমাকে কিছু মাথাব্যাথা বাঁচিয়েছিল। ধন্যবাদ!
অগ্রণী 99

কি হবে mkfifo /tmp/srv-input; tail -f /tmp/srv-input | myserver &? এটি
পাইপটিও

@ বিকে 138: লেজটি কাজ করা উচিত বলে মনে হয় তবে এটি নিশ্চিত করার জন্য কেবল একটি উপায় আছে: পরীক্ষা।
jfg956

tailকাজ করে না, তবে কাজটি শেষ করতে এটি যুক্ত করেছে: cat /tmp/srv-input | myserver; kill -9 বিড়াল / টিএমপি / এসআরভি-ইনপুট-বিড়াল-পিডি && আরএম / টিএমপি / এসআরভি-ইনপুট-বিড়াল * `
থিয়াগো ম্যাসিডো

4

উপরের মতো একই, তবে 'বিড়াল' আমার পক্ষে কাজ করে নি। ফাইলটি ইওএফ পেয়েছে এবং একটি কমান্ড প্রেরণের পরে শেষ হয়েছে।

এটি আমার পক্ষে কাজ করেছে:

#!/bin/bash

mkfifo /tmp/srv-input
tail -f /tmp/srv-input | myserver &
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.