আমি কীভাবে ps
কেবল ব্যবহারকারী প্রক্রিয়াগুলি প্রদর্শন করতে বলব এবং কার্নেল থ্রেডগুলি না?
আমি কী বলতে চাইছি এই প্রশ্নটি দেখুন ...
আমি কীভাবে ps
কেবল ব্যবহারকারী প্রক্রিয়াগুলি প্রদর্শন করতে বলব এবং কার্নেল থ্রেডগুলি না?
আমি কী বলতে চাইছি এই প্রশ্নটি দেখুন ...
উত্তর:
এটি করা উচিত (লিনাক্সের অধীনে):
ps --ppid 2 -p 2 --deselect
kthreadd
(পিআইডি 2) এর পিপিআইডি 0 রয়েছে ( লিনাক্স 2.6+ এ ) তবে ps
পিপিআইডি 0 এর জন্য ফিল্টার করার অনুমতি দেয় না; এইভাবে এই কাজ প্রায়।
kthreadd
, তারপরে সেই ps
কলটি তৈরি করুন । কতটা গ্যারান্টিযুক্ত যে এই জিনিসটিকে "সর্বদা" "কাঠথ্রেড" বলা হবে? একটি নিরাপদ সমাধান আরও জটিল হবে, ps
সাধারণত চালানো হবে এবং আউটপুট পার্স করুন, সম্ভবত কিছু পরীক্ষা করুন do
x
পতাকাটি এটি দিয়ে কাজ করে না। ps au --ppid 2 -p 2 --deselect
ঠিক আছে কাজ করে।
তাই 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}'
অনুশীলনে আমি নিম্নলিখিত আইডিয়ামটি যথেষ্ট পেয়েছি:
ps auxf | grep -v ]$
এটি বন্ধনীগুলির সাথে শেষ হওয়া লাইনগুলি ফিল্টার করে, এর ফলে অযাচিত প্রবেশগুলি বাদ দেওয়া হতে পারে তবে এটি খুব কমই। বিনিময়ে এটি মনে রাখা বেশ সহজ এবং টাইপ করার তুলনায় তুলনামূলক দ্রুত।
কিছু প্রক্রিয়া যেমন অহি-ডেমন তাদের প্রসেসের নাম বন্ধনীতে নাম (অ্যাভিহি-ডেমন-এর ক্ষেত্রে হোস্ট-নেম) যুক্ত করে এবং এই আদেশ দ্বারা ফিল্টার করা হবে।
এই প্রক্রিয়াগুলির একটি বৈশিষ্ট্য হ'ল এগুলি একটি এক্সিকিউটেবল ফাইল দ্বারা ব্যাক হয় না, সুতরাং আপনি ( 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
এই বর্গাকার বন্ধনীগুলির উপর ভিত্তি করে আউটপুট ফিল্টার করা বোকা প্রতিরোধের বিকল্প নয়।
zsh
সিনট্যাক্স। দ্বিতীয়টি হ'ল স্ট্যান্ডার্ড POSIX sh
( ps
এবং find
এবং cut
এবং paste
) সিনট্যাক্স। অবশ্যই /proc
পসিক্স দ্বারা নির্দিষ্ট করা হয়নি।
wc -l
)। ঠিক আছে, আমি তখন হউক লেজিংয়ের উত্তরটি গ্রহণ করব এবং আপনাকে একটি অগ্রণীতা দেব। ;)
আপনি কেবল ps
আউটপুটকে বিশ্লেষণ করতে পারেন এবং বন্ধনীতে নেই এমন প্রক্রিয়া নামগুলি সন্ধান করতে পারেন:
ps aux | awk '$NF!~/^\[.+\]$/'
awk -F: '$7 ~ home { print $1 }' /etc/passwd
- তবে আপনি এখনও এমন প্রক্রিয়া পাবেন যা এই জাতীয় ব্যবহারকারীর নাম উল্লেখ করে , এবং আপনি টেম্প্প ফাইলটি পড়ে থাকবেন। আমি আমার ডাউনটোট প্রত্যাহার করব, তবে কেবলমাত্র আপনার তৃতীয় সমাধানটি যুক্তিসঙ্গত।
$NF
কমান্ড লাইনের শেষ শব্দ ps aux
। কার্নেলবিহীন প্রক্রিয়াগুলি [...]
সেখানে থাকতে পারে। যেমনটি আমি আমার উত্তরে বলেছি যে [xxx]
স্বরলিপিটি কার্নেল প্রক্রিয়া নয়, কারণ তাদের কোনও কমান্ড লাইন নেই (কোনও যুক্তি নেই) যা কার্নেলবিহীন প্রক্রিয়াগুলিও অনুমোদিত।
ব্যস্তবক্সে যেখানে কেউ এটি চেষ্টা করছেন যেখানে 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
আপনার যদি কেবল গণনা প্রয়োজন ... কার্নেল বনাম ব্যবহারকারীর প্রক্রিয়াগুলি ফিল্টার করার জন্য আমার একই রকম প্রয়োজন ছিল, তবে আমার কেবল প্রত্যেকটির স্বতন্ত্র গণনা প্রয়োজন। এটি আমার সমাধান ছিল:
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] এর জন্য মানগুলি (অর্থাত্ গণনা) লেবেল এবং মুদ্রণ করি ।
তুমি কি দেখছো জন্য, আমার বন্ধু নয়, 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
যাচাই করতে এই দুটি কমান্ডের আউটপুট (একটি সহজ উপায় ব্যবহার করছেন ) তুলনা এবং গণনা করতে পারেন ।
kthreadd
সর্বদা পিআইডি 2 এর কতটা গ্যারান্টিযুক্ত ?