যে টিটিতে বাশ চলছে তা কীভাবে পাবেন?


25

এই পৃষ্ঠার দ্বারা প্রস্তাবিত দ্বিতীয় পদ্ধতিতে , একটি আদেশ পেয়েছে যাতে কমান্ডটি দিয়ে ব্যাশ চালানো হচ্ছে:

ps ax | grep $$ | awk '{ print $2 }'

যদিও আমি নিজের কাছে নিশ্চিত যে এটি অবশ্যই কিছুটা অলস, সমস্ত চলমান প্রক্রিয়াগুলির তালিকা কেবল তাদের মধ্যে একটি বের করার জন্য। এটি কী আরও কার্যকর হবে না (আমি এটি জিজ্ঞাসা করছি যে এটি কী অযাচিত প্রভাবগুলি প্রবর্তন করবে):

ps -p $$ | tail -n 1 | awk '{ print $2 }'

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


6
সর্বোপরি দক্ষ ttyআপনার বাশ সেশনের মধ্যে কমান্ড চালানো হবে। আপনি যদি জেদ করেন ps-ps -p $$ -o tty=
ইরুবার

উত্তর:


47

কেবল টাইপ করে tty:

$ tty 
/dev/pts/20

খুব সহজ এবং সত্য হিসাবে স্পষ্ট :)

সম্পাদনা করুন: প্রথমটি আপনাকে যেমন ptyপ্রক্রিয়াটি grepলক্ষ্য করতে পারে তেমনটি আপনাকে প্রদান করে :

$ ps ax | grep $$
28295 pts/20   Ss     0:00 /bin/bash
29786 pts/20   S+     0:00 grep --color=auto 28295

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

ps ax | grep $$ | grep -v grep | awk '{ print $2 }'

বা ব্যবহার

ps ax | grep "^$$" | awk '{ print $2 }'

(আরও বুদ্ধিমান রূপ)


হ্যাঁ, এটিই প্রথম প্রস্তাবিত সমাধান হ'ল প্রকৃতপক্ষে (এটি হ'ল tty | sed -e "s:/dev/::")। তবে আমি মনে করি যে পৃষ্ঠাটির দ্বিতীয় প্রস্তাবিত সমাধানটি কেবল অদক্ষ নয়, ভুলও! আমি ttyযদিও অভিযোগ করা বন্ধ করব । :)
শেলজাহান

প্রথমটি আপনাকে ptyযে প্রক্রিয়াটি grepলক্ষ্য করতে পারে চলমানটিও ফিরিয়ে দেয়।
জাকুজে

2
আপনি grepযদি ব্যবহার করেন তবে আপনার দরকার নেই awk। উদাহরণস্বরূপ ps ax | awk "/^$$/ {print \$2}"- একক-কোট এবং পলায়ন না হয়ে ডাবল-কোটের ব্যবহার নোট করুন \$2। তবে, যেমন আপনি বলেছেন, ব্যবহার ttyকরা সঠিক সমাধান।
কাস

এরকম গ্রিপিংয়ের ফলে মিথ্যা ম্যাচের ফলাফল হতে পারে, যেমন আপনার পিআইডি যদি 10 হয় এবং পিআইডি 103ও রয়েছে। ব্যবহার করুনawk -vpid=$$ '$1 == pid {print $2}'
বারমার

আমি কেবল এখানে লক্ষ করছি যে নোড.জেজে ttyস্প্যান করা মোটেই কাজ করে না, যখন psবন্ধুরা ঠিক কাজ করে।
স্টিভেন লু

17

আপনি যদি আরও দক্ষ হতে চান, তবে হ্যাঁ, আপনি ঠিক বলেছেন যে psএটি কেবলমাত্র প্রক্রিয়াতে ফিল্টার করতে পারে (এবং এটি আরও সঠিক হবে, আপনার নামগুলির মধ্যে আপনার প্রক্রিয়া নম্বর থাকতে পারে এমন আদেশগুলি বাছাইয়ের ঝুঁকি চালাবেন না )। কেবল তা-ই নয়, তবে প্রক্রিয়াটি সরিয়ে হেডার (বিকল্প h) তৈরি না করার এবং tailপ্রক্রিয়াটি বাদ দিয়ে কেবল TTYক্ষেত্র (বিকল্প o tty) প্রদর্শন করার কথা বলা যেতে পারে awk

সুতরাং এখানে আপনার হ্রাস আদেশ:

ps hotty $$

10

এটি করার অন্যান্য উপায়:

readlink /dev/fd/0     #or 1 or 2 
readlink /proc/self/fd/0 #or 1 or 2
readlink -f /dev/stdin #or stdout or stderr; f to resolve recursively
#etc.

(যদি আপনি এমন শেলের মধ্যে থাকেন যার স্টিন, স্টডআউট এবং স্ট্ডার এর নিয়ন্ত্রণকারী টার্মিনালের সাথে সংযুক্ত না থাকে তবে আপনি কন্ট্রোলিং টার্মিনালে একটি ফাইলডেস্ক্রিপ্টার খোলার মাধ্যমে পেতে পারেন /dev/tty:

( { readlink /dev/fd/0; } </dev/tty; ) </dev/null  >output 2>&1

)

বা এর সাথে ps:

ps h -o tty -p $$ #no header (h); print tty column; for pid $$

2
(1) আমি আনন্দিত যে আপনি বুঝতে পেরেছেন যে কোনও প্রক্রিয়াটির বর্তমান / নিয়ন্ত্রণের পরিমাণটি কোনও ফাইল বর্ণনাকারীর সাথে জড়িত নয় এবং কোনও এফডি-তে খোলা থাকার গ্যারান্টি নেই। তবে, আপনি কি সেই আদেশটি ব্যবহার করেছেন যা আপনি সেই কমান্ডের জন্য কার্যকরী হিসাবে প্রস্তাব করেছিলেন? আমি যখন এটি চেষ্টা করি তখন আমার কাছে যা কিছু আসে তা /dev/ttyনিয়ন্ত্রণীয় টিটিই নয় (যেমন রিপোর্ট করেছেন ps)। (২) আমি বিশ্বাস করি যে { readlink /dev/fd/0; } < /dev/ttyএটি (এবং সর্বদা থাকবে) এর সমতুল্য readlink /dev/fd/0 < /dev/tty- আপনি অন্যথায় বিশ্বাস করেন? যদি তাই হয় তবে আপনি কি তা ন্যায়সঙ্গত করতে পারেন? (3) আপনার কমান্ডের দ্বিতীয় সেমিকোলন (পরে এক /dev/tty) অপ্রয়োজনীয়।
স্কট

6

সম্পূর্ণতার জন্য, অন্য পিএস কমান্ডগুলি লিনাক্সে কাজের জন্য উল্লেখ করেছে, ps -p $$ -o tty=(যেমন @ 1_CR দ্বারা উল্লিখিত) সমস্ত আধুনিক ইউনিক্স সিস্টেমের মধ্যে সর্বাধিক বহনযোগ্য, যেহেতু এটি ইউনিক্স স্ট্যান্ডার্ডে সংজ্ঞায়িত একমাত্র বিকল্পগুলি ব্যবহার করে ।


2

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

$ w
 11:20:08 up 5 min,  3 users,  load average: 0.34, 0.39, 0.20
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
xieerqi  :0       :0               11:15   ?xdm?   1:47   0.34s init --user
xieerqi  pts/0    :0               11:18   23.00s  0.05s  0.05s /bin/mksh
xieerqi  pts/10   :0               11:20    0.00s  0.03s  0.01s w
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.