পিএস লিনাক্সে কেবল নন কার্নেল প্রক্রিয়াগুলি প্রদর্শন করতে পারে?


41

আমি কীভাবে psকেবল ব্যবহারকারী প্রক্রিয়াগুলি প্রদর্শন করতে বলব এবং কার্নেল থ্রেডগুলি না?

আমি কী বলতে চাইছি এই প্রশ্নটি দেখুন ...

উত্তর:


37

এটি করা উচিত (লিনাক্সের অধীনে):

ps --ppid 2 -p 2 --deselect

kthreadd(পিআইডি 2) এর পিপিআইডি 0 রয়েছে ( লিনাক্স 2.6+ এ ) তবে psপিপিআইডি 0 এর জন্য ফিল্টার করার অনুমতি দেয় না; এইভাবে এই কাজ প্রায়।


দুর্দান্ত, তবে এটি kthreaddসর্বদা পিআইডি 2 এর কতটা গ্যারান্টিযুক্ত ?
l0b0

@ l0b0 আমার কোনও ধারণা নেই :-) আপনি দুটি পদক্ষেপে এটি করতে পারেন: পিআইডি নির্ধারণ করুন kthreadd, তারপরে সেই psকলটি তৈরি করুন । কতটা গ্যারান্টিযুক্ত যে এই জিনিসটিকে "সর্বদা" "কাঠথ্রেড" বলা হবে? একটি নিরাপদ সমাধান আরও জটিল হবে, psসাধারণত চালানো হবে এবং আউটপুট পার্স করুন, সম্ভবত কিছু পরীক্ষা করুন do
হউক লেগেইন

2
কমপক্ষে x86 আর্কে লিনাক্স ২.৪-তে, এই প্রক্রিয়াগুলির পিপিড 1 ছিল তাই সেভাবে আলাদা করা যায় না।
স্টাফেন চেজেলাস

1
"PS -ef" do "PS --ppid 2 -p 2 --deselect -f" এর মতো হতে এবং এটি "PS aux" do "PS --ppid 2 -p 2 --deselect u"
পিটার পছন্দ করার জন্য

1
@ টোটার আমি যাচাই করেছি এবং দেখে মনে হচ্ছে এটি xপতাকাটি এটি দিয়ে কাজ করে না। ps au --ppid 2 -p 2 --deselectঠিক আছে কাজ করে।
संकल्प

9

তাই vsz ক্ষেত্র 0. এই (ধন্যবাদ ক্যাচ বোকচন্দর ওয়ান ওয়ে কার্নেল প্রসেস চিনতে, যে তারা কোনো ব্যবহারকারীর মেমরি ব্যবহার না স্টিফেন Chazelas , যা তাদের স্থিতির উপর ভিত্তি করে কাটানো যায় এই পর্যবেক্ষণ জন্য)।

ps axl | awk '$7 != 0 && $10 !~ "Z"'

কেবলমাত্র পিআইডি তালিকাবদ্ধ করতে:

ps -e -o pid= -o state= -o vsize= | awk '$2 != "Z" && $3 != 0 {print $1}'

আমার সমাধানের মতো এটিও জম্বি প্রক্রিয়াগুলিকে অন্তর্ভুক্ত করবে।
স্টাফেন চেজেলাস

1
@ স্টেফেন চ্যাজেলাস ভাল কথা, আমি ফিল্টারটিতে একটি শর্ত যুক্ত করেছি।
গিলস 'এস-অশুভ হওয়া বন্ধ করুন'

9

অনুশীলনে আমি নিম্নলিখিত আইডিয়ামটি যথেষ্ট পেয়েছি:

ps auxf | grep -v ]$

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

কিছু প্রক্রিয়া যেমন অহি-ডেমন তাদের প্রসেসের নাম বন্ধনীতে নাম (অ্যাভিহি-ডেমন-এর ক্ষেত্রে হোস্ট-নেম) যুক্ত করে এবং এই আদেশ দ্বারা ফিল্টার করা হবে।


8

এই প্রক্রিয়াগুলির একটি বৈশিষ্ট্য হ'ল এগুলি একটি এক্সিকিউটেবল ফাইল দ্বারা ব্যাক হয় না, সুতরাং আপনি ( zsh ) করতে পারেন :

ps /proc/[0-9]*/exe(^-@:h:t)

বা কোনও পসিক্স শেল সহ:

ps -p "$(find -L /proc/[0-9]*/exe ! -type l | cut -d / -f3 | paste -sd , -)"

এটি সেই প্রক্রিয়াগুলির জন্য যাচাই করা হয় যার /proc/<pid>/exeফাইলের লিঙ্ক।

তবে এর অর্থ /proc/<pid>/exeসিমলিংকের অবস্থা পরীক্ষা করতে সক্ষম হতে আপনাকে সুপারইউসার হতে হবে ।

সম্পাদনা করুন : জুম্বি প্রক্রিয়াগুলি যেমন ঘটে (কমপক্ষে) একই শর্তটি পূরণ করে, তাই আপনি যদি এগুলি বাদ না চান তবে আপনাকে সেগুলি আবার যুক্ত করতে হবে। ভালো লেগেছে:

ps -p "$(
  { find -L /proc/[0-9]*/exe ! -type l | cut -d / -f3
    ps -Ao pid=,state= | sed -n 's/ Z//p'
  } | paste -sd , -)"

নোট করুন যে ps -fপ্রসেসের নামগুলি স্কোয়ার ব্র্যাকেটে দেখায় কারণ তারা কার্নেল প্রক্রিয়া নয়, তবে তাদের খালি রয়েছে argv[](সুতরাং পিএসটি পরিবর্তে প্রক্রিয়াটির নামটি দেখায় argv[0])। খালি argv[]পাশাপাশি আপনার ব্যবহারকারীর স্পেস প্রক্রিয়া থাকতে পারে এবং argv[0]ফর্মের সাথে একটি প্রক্রিয়া নাম থাকতে পারে [some-string]যাতে psএই বর্গাকার বন্ধনীগুলির উপর ভিত্তি করে আউটপুট ফিল্টার করা বোকা প্রতিরোধের বিকল্প নয়।


এটি মানহীন শেল সিনট্যাক্স, আমি গণনা করি।
টোটার

1
@ টোটার, যেমনটি আমি বলেছিলাম, প্রথমটি zshসিনট্যাক্স। দ্বিতীয়টি হ'ল স্ট্যান্ডার্ড POSIX sh( psএবং findএবং cutএবং paste) সিনট্যাক্স। অবশ্যই /procপসিক্স দ্বারা নির্দিষ্ট করা হয়নি।
স্টাফেন চেজেলাস

এই উত্তরটি গ্রহণ করা কারণ এটি সর্বজনীন (সম্পাদনার জন্য ধন্যবাদ)। তবে, আপনি 2.4 কার্নেলের সাথে ডিল না করেন ততক্ষণ হউক লেজিংয়ের উত্তরটিও বেশ সুন্দর এবং সোজা is
টোটার

@ টোটার, হউকের জবাবটিতে সুপারভাইজার প্রাইভেলিজ না লাগানোর সুবিধাও রয়েছে। আমার উত্তরটি 2.4 এবং 2.6 / 3 কার্নেলের সাথে কাজ করে, তবে আমি মনে করি যে এটি কোনওভাবে 4.x এ কাজ করবে কিনা এর গ্যারান্টি নেই।
স্টাফেন চেজেলাস

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

1

আপনি কেবল psআউটপুটকে বিশ্লেষণ করতে পারেন এবং বন্ধনীতে নেই এমন প্রক্রিয়া নামগুলি সন্ধান করতে পারেন:

ps aux | awk '$NF!~/^\[.+\]$/'

আপনার আগ্রহী ব্যবহারকারীদের তালিকা পাওয়ার জন্য কিছুটা কম অবিশ্বাস্য উপায়: awk -F: '$7 ~ home { print $1 }' /etc/passwd- তবে আপনি এখনও এমন প্রক্রিয়া পাবেন যা এই জাতীয় ব্যবহারকারীর নাম উল্লেখ করে , এবং আপনি টেম্প্প ফাইলটি পড়ে থাকবেন। আমি আমার ডাউনটোট প্রত্যাহার করব, তবে কেবলমাত্র আপনার তৃতীয় সমাধানটি যুক্তিসঙ্গত।
কিথ থম্পসন

বাহ, আপনি পুরো পথেই আছেন, @ কিথথম্পসন, অন্যদের সরিয়ে দিয়েছেন, তারা এর মূল্যবান নয়। আপনি কি আমাকে (এখন) অপ্রচলিত মন্তব্য পরিষ্কার করতে সাহায্য করতে পারেন?
টেরডন

2
নোটটি আউটপুটে $NFকমান্ড লাইনের শেষ শব্দ ps aux। কার্নেলবিহীন প্রক্রিয়াগুলি [...]সেখানে থাকতে পারে। যেমনটি আমি আমার উত্তরে বলেছি যে [xxx]স্বরলিপিটি কার্নেল প্রক্রিয়া নয়, কারণ তাদের কোনও কমান্ড লাইন নেই (কোনও যুক্তি নেই) যা কার্নেলবিহীন প্রক্রিয়াগুলিও অনুমোদিত।
স্টাফেন চেজেলাস

1

ব্যস্তবক্সে যেখানে কেউ এটি চেষ্টা করছেন যেখানে psভারীভাবে সরলীকৃত হয় এবং আউটপুট আলাদা হয়, গিলসের দুর্দান্ত উত্তরের এই রূপটি ভালভাবে কাজ করে:

ps -o pid,user,comm,vsz,stat | awk '$4 != 0 && $5 !~ "Z"'

গিলসের উত্তর অনুসারে, এখানে পদ্ধতিটি এমন কোনও প্রক্রিয়াগুলি অনুসন্ধান করে যা কোনও ব্যবহারকারীর মেমরি ব্যবহার করে না (`vsz কল == 0), এবং জম্বি প্রক্রিয়াগুলি ফিল্টার আউট করে (স্ট্যাটাস কোল 'জেড' নয়)।

আউটপুট কলামগুলিকে সহজেই সামঞ্জস্য করা যায়, যতক্ষণ না 1-ভিত্তিক খসড়া ক্ষেত্রের নম্বরগুলি সেই অনুসারে সামঞ্জস্য করা হয়। বোগাস মান রেখে আপনার পিএসের বিকল্পগুলি দেখুন এবং এটি আপনাকে জানাবে। উদাহরণ স্বরূপ:

$ ps -o foo
ps: bad -o argument 'foo', supported arguments: user,group,comm,args,pid,ppid,pgid,tty,vsz,stat,rss

0

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

ps -eo vsize | awk '{p[$1==0]++} END {printf "%-16s %6d\n%-16s %6d\n%-16s %6d\n", "Kernel processes", p[1], "User processes", p[0], "Total processes", p[0]+p[1]}'

নমুনা আউটপুট :

Kernel processes    353
User processes       52
Total processes     405

ব্যাখ্যা : আমি হ্যাক ব্যবহার করছি যে ভিএসজেড = 0 প্রসেসগুলি কার্নেল প্রক্রিয়া হিসাবে ধরে নেওয়া যেতে পারে। সুতরাং এর সাথে awk, আমি ভিএসজেডের (থেকে ps -eo vsize) তুলনা মূল্যায়ন করি , এটি শূন্যের সমান কিনা। তুলনার ফলাফলের হয় একটি বুলিয়ান 0 বা 1. আমি একটি অ্যারের করতে হবে p[], এবং আমি প্রক্রিয়ার ডাউন তালিকা চালানো যদি এটি একটি কার্নেল প্রক্রিয়া, আমি বর্ধন এর p[1]++। অন্যথায়, ব্যবহারকারী প্রক্রিয়া হিসাবে, আমি বৃদ্ধি p[0]++। সমস্ত বর্ধিতকরণের পরে, আমি END { }ব্লকে পি [0] এবং পি [1] এর জন্য মানগুলি (অর্থাত্ গণনা) লেবেল এবং মুদ্রণ করি ।


0

তুমি কি দেখছো জন্য, আমার বন্ধু নয়, psকিন্তু pstree

প্রথমে প্রথম কার্নেল প্রক্রিয়াটি চিহ্নিত করুন। এর পিআইডি সাধারণত সিস্টেমড ছাড়াই সিস্টেমে 1 এবং সিস্টেমযুক্ত 2 থাকে।

তারপরে এই কমান্ডটি ব্যবহার করুন:

$ pstree -p <1 or 2> | grep -o '([0-9]\+)' | grep -o '[0-9]\+'

নির্বাচিত উত্তর (✅ সহ একটি) অন্য একটি আদেশ ব্যবহার করছে:

$ ps --ppid 2 -p 2 --deselect

এই psআদেশের সাথে সমস্যাটি হ'ল এটিতে কেবল প্রত্যক্ষ বাচ্চারা অন্তর্ভুক্ত থাকে তবে সমস্ত বংশধরও নয়। pstreeকমান্ড সব বংশধরদের অন্তর্ভুক্ত করা হয়েছে। আপনি | wcযাচাই করতে এই দুটি কমান্ডের আউটপুট (একটি সহজ উপায় ব্যবহার করছেন ) তুলনা এবং গণনা করতে পারেন ।

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