আমি কেন টেল-ফ / প্রো / / পিডি / এফডি / 1` করতে পারি না?


10

আমি একটি সাধারণ স্ক্রিপ্ট লিখেছিলাম যা echoএর পিআইডি রয়েছে:

#/bin/bash

while true; do
    echo $$;
    sleep 0.5;
done

আমি 3844একটি টার্মিনালে বললাম স্ক্রিপ্ট (এটি বার বার বলে ) চালাচ্ছি tailএবং অন্য একটিতে ফাইল বর্ণনাকারীর চেষ্টা করছি :

$ tail -f /proc/3844/fd/1

এটি স্ক্রিনে কিছু মুদ্রণ করে না এবং অবধি স্তব্ধ হয়ে যায় ^c। কেন?

এছাড়াও, সমস্ত এসটিডি ফাইল বর্ণনাকারীর (IN / OUT / ERR) একই পিটিএসের লিঙ্ক:

$ ls -l /proc/3844/fd/
total 0
lrwx------ 1 mg mg 64 sie 29 13:42 0 -> /dev/pts/14
lrwx------ 1 mg mg 64 sie 29 13:42 1 -> /dev/pts/14
lrwx------ 1 mg mg 64 sie 29 13:42 2 -> /dev/pts/14
lr-x------ 1 mg mg 64 sie 29 13:42 254 -> /home/user/test.sh
lrwx------ 1 mg mg 64 sie 29 13:42 255 -> /dev/pts/14

এটা কি স্বাভাবিক?

উবুন্টু জিনোম 14.04 চলছে।

আপনি যদি ভাবেন যে এই প্রশ্নটি উল এর পরিবর্তে এসও বা এসইউ সম্পর্কিত, তবে বলুন।


উত্তর:


13

একটি করুন straceএর tail -f, এটা সবকিছু ব্যাখ্যা করে। মজার অংশ:

13791 fstat(3, {st_mode=S_IFREG|0644, st_size=139, ...}) = 0
13791 fstatfs(3, {...}) = 0
13791 inotify_init()                    = 4
13791 inotify_add_watch(4, "/path/to/file", IN_MODIFY|IN_ATTRIB|IN_DELETE_SELF|IN_MOVE_SELF) = 1
13791 fstat(3, {st_mode=S_IFREG|0644, st_size=139, ...}) = 0
13791 read(4, 0xd981c0, 26)             = -1 EINTR (Interrupted system call)

এর মানে কি? এটি inotifyফাইলটিতে একটি হ্যান্ডলার সেট আপ করে এবং তারপরে এই ফাইলটি দিয়ে কিছু না হওয়া পর্যন্ত অপেক্ষা করে। কার্নেল যদি tailএই ইনোটাইফাই হ্যান্ডলারের মাধ্যমে বলে যে ফাইলটি পরিবর্তিত হয়েছে (সাধারণত, সংযোজন করা হয়েছিল), তবে tail1) 2 টি সন্ধান করে) পরিবর্তনগুলি পড়ে 3) সেগুলি পর্দায় লেখায়।

/proc/3844/fd/1আপনার সিস্টেমে একটি প্রতীকী লিঙ্ক /dev/pts/14, যা একটি অক্ষর ডিভাইস। "মেমরি মানচিত্র" এর মতো এমন কিছু নেই যা এর মাধ্যমে অ্যাক্সেস করা যেতে পারে। সুতরাং, এমন কিছু নেই যাঁর পরিবর্তনগুলি ইনোটিফায় স্বাক্ষরিত হতে পারে, কারণ এমন কোনও ডিস্ক বা মেমরির ক্ষেত্র নেই যা এর মাধ্যমে অ্যাক্সেস করা যায়।

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

আমি মনে করি, আপনি কোনওভাবে ভার্চুয়াল টার্মিনালটি দেখতে চান। এটি লিনাক্সে করা যেতে পারে, তবে এটি এত সহজ নয়, এর জন্য কিছু নেটওয়ার্ক প্রক্সি-মতো কার্যকারিতা এবং এই ioctl()কলগুলির কিছুটা কৌতুকপূর্ণ ব্যবহার প্রয়োজন । তবে এমন সরঞ্জাম রয়েছে যা করতে পারে।

বর্তমানে আমি মনে করতে পারি না, কোন ডিবিয়ান প্যাকেজটিতে এই লক্ষ্যের জন্য হাতিয়ার রয়েছে তবে কিছুটা গুগলিংয়ের সাহায্যে আপনি এটি সম্ভবত সহজেই খুঁজে পেতে পারেন।

সম্প্রসারণ: @ যজেশ এখানে উল্লেখ করেছেন (আপনি আমাকে দিলে তাকে একটি +1 দিন), সরঞ্জামটির নাম দেওয়া হয়েছে watch

এক্সটেনশন # 2: @ ক্যালনোস উল্লিখিত, একটি সরলও cat /dev/pts/14যথেষ্ট ছিল। আমি এটি চেষ্টা করেছিলাম, এবং হ্যাঁ, এটি কার্যকর হয়েছিল, তবে সঠিকভাবে হয়নি। আমি যে তার সাথে অনেক পরীক্ষানিরীক্ষা করা হয়নি, কিন্তু এটা যদি একটি আউটপুট যে ভার্চুয়াল সর্বস্বান্ত টার্মিনাল মধ্যে যাওয়া যেমন আমার মনে হচ্ছে পারেন করার catকমান্ড, অথবা তার মূল অবস্থান থেকে, এবং উভয় কখনো। তবে এটি নিশ্চিত নয়।


পিটারের উত্তর সম্পর্কে tailসঠিক (ইনোটিফাই ওয়াচ বিট) ঠিক আছে তবে তিনি যা ভুল করতে চান এটি আসলে খুব সহজ: আপনি যা চান তা করা সহজ: catপরিবর্তে কেবল ব্যবহার করুন tail
kelnos

@ কেলনোস ধন্যবাদ, আমি এটি চেষ্টা করব এবং ফলাফলগুলির সাথে আমার উত্তর প্রসারিত করব।
পিটারহ - মনিকা পুনরায় ইনস্টল করুন

@ ক্যালনোস catআমার পক্ষেও কাজ করে না, এটি লেজের মতো একইভাবে ঝুলছে এবং আমি যা করতে পারি তা হ'ল ctrl+c
সিআরপিএন

1
আমি এখনও এটি পাই না। আমি পরিবর্তন echo $$করতে echo $$ >> fooতাই এখন একটা ফাইল এবং প্রক্রিয়া তা প্রর্দশিত এবং প্রতি 0.5 সেকেন্ডে এটি appends। আমি এখনও ফাইল বর্ণনাকারী এবং সমস্ত ফাইল বর্ণনাকারীর মাধ্যমে এটিকে অ্যাক্সেস করতে পারি না /proc/$pid/fd/(তবে 254 যা test.shস্ক্রিপ্টের সাথে লিঙ্ক করে) লিঙ্ক করে /dev/pts/14। এটি কীভাবে বাশ অ্যাক্সেস fooলিখে?
সিআরপিএন

1
বিজোড়, এটি শুধুমাত্র কিছু পরিস্থিতিতে কাজ করে বলে মনে হচ্ছে। প্রশ্নের স্ক্রিপ্ট ব্যবহার করে, এটি কাজ করে না। তবে আমি যদি একটি শেলের মধ্যে "প্রতিধ্বনি।" করি এবং অন্য শেলের মধ্যে পিডের উপর বিড়াল এফডি 1 করি, তবে প্রথম শেলটিতে আমি টাইপ করা সমস্ত কিছু দ্বিতীয়টিতে প্রতিধ্বনিত হয়।
kelnos

4

ফাইলগুলি /dev/ptsনিয়মিত ফাইল নয়, সেগুলি ভার্চুয়াল টার্মিনালের জন্য হ্যান্ডলগুলি। ptsপড়ার ও লেখার জন্য একটি আচরণ প্রতিসম নয় (এটি যা সেখানে লেখা আছে তা পরে এটি থেকে নিয়মিত ফাইল বা ফিফো / পাইপের মতো পড়া যায়) তবে ভার্চুয়াল টার্মিনালটি তৈরি করে এমন প্রক্রিয়াটির মধ্যস্থতা ঘটে: কিছু সাধারণ বিষয়গুলি হ'ল এক্সটার্ম বা এসএসএস বা অ্যাজেটি বা স্ক্রিন। নিয়ন্ত্রণকারী প্রক্রিয়াটি সাধারণত ptsফাইলগুলি পড়ার প্রসেসগুলিতে কী প্রেসগুলি প্রেরণ করে এবং স্ক্রিনে তারা কী লিখবে তা রেন্ডার করে pts

সুতরাং, tail -f /dev/pts/14কি আপনি টার্মিনাল যেখান থেকে আপনি আপনার স্ক্রিপ্টটি শুরু টোকা প্রিন্ট হবে, এবং যদি আপনি না বার্তা টার্মিনাল উপস্থিত হবে।echo meh > /dev/pts/14meh


আপনি ঠিক বলেছেন যে আমি পিটিএস ডিভাইসে লিখতে পারি তবে আমি এটি থেকে পড়তে পারি না। যেমন রয়েছে: tail -f /dev/pts/14আমি যে টার্মিনালটিতে ট্যাপ করি সেগুলি মুদ্রণ করে না। যদিও এটি একটি আকর্ষণীয় উত্তর। ধন্যবাদ।
সিআরপিএন

0

কিছু সময় আগে আমি একটি ধরণের ওয়ার্কআউন্ড পেয়েছি যা কখনও কখনও স্টাডিউটে কী আউটপুট করা হয় তা যাচাই করার প্রয়োজনীয়তার জবাব দেয়, অনুমান করে যে আপনার pidপ্রক্রিয়াটি একটি রয়েছে এবং আপনি চোখ বন্ধুত্বপূর্ণ ফলাফল করতে পারেন:

sudo strace -p $pid 2>&1 | grep write\(

-2

আমি অনুমান করি, এর জন্য লেজ দেওয়ার চেয়ে আপনার কী করা দরকার তা আউটপুটটি দেখছেন।

$ watch -n2 ls -l /proc/3844/fd/

আশা করি এটি আপনার প্রয়োজন।


3
এই কমান্ডটি প্রতি 2 সেকেন্ডে ওপেন এফডিএসের তালিকা প্রদর্শন করবে, স্টডআউটে কনটেন্ট আউটপুট নয় ।
আঞ্জেল

অ্যাঞ্জেল, সত্য। তিনি কোন বিবরণীর উপর নজর রাখতে চান তার ফলাফল দেখার জন্য তিনি একটি বিড়ালের সাথে ঘড়িটি ব্যবহার করতে পারেন। আমার ধারণা পিটার-হরবাথ, প্রশ্নের সঠিক ব্যাখ্যা দিয়েছেন।
জয়েশ

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