প্রক্রিয়া তালিকা থেকে গ্রেপ বাদে


27

একটি চলমান ডিমনটির প্রসেস আইডি ফেরত দেওয়ার জন্য আমি একটি কমান্ড একসাথে পেয়েছি:

ps aux | grep daemon_name | awk "{ print \$2 }"

এটি নিখুঁতভাবে কাজ করে এবং পিআইডি ফিরিয়ে দেয় তবে এটি একটি দ্বিতীয় পিআইডিও দেয় যা সম্ভবত আমি এখন যে প্রক্রিয়াটি চালিয়ে যাচ্ছি সম্ভবত এটি is ফিরে আসা পিআইডিগুলির তালিকা থেকে আমার কমান্ডকে বাদ দেওয়ার কোনও উপায় আছে কি?

আমি এটি কয়েকবার পরীক্ষা করেছি এবং দেখা যাচ্ছে যে আমার কমান্ডটি সর্বদা তালিকার দ্বিতীয় পিআইডি, তবে আমি সঠিকভাবে প্রথম পিআইডি সঠিকভাবে গ্রহণ করতে চাই না।


উত্তর:


27

গ্রেপের -vসুইচটি সারি থেকে বাদ দিয়ে ফলটিকে উল্টে দেয়। সুতরাং এটির মতো করুন:

ps aux | grep daemon_name | grep -v "grep daemon_name" | awk "{ print \$2 }"

আপডেট । আপনি -Cকমান্ডের নামটি নির্দিষ্ট করতে স্যুইচও ব্যবহার করতে পারেন:

ps -C daemon_name -o pid=

পরেরটি -oনির্ধারণ করে যে তালিকায় আপনি যে তথ্যের কলামগুলি চান তা নির্ধারণ করে। pidকেবল প্রক্রিয়া আইডি কলামের তালিকাবদ্ধ করে। এবং সমান চিহ্নটির =পরে এর pidজন্য কোনও কলামের শিরোনাম থাকবে না, সুতরাং আপনি কেবল পরিষ্কার সংখ্যাগুলি পাবেন - পিআইডি।

আশাকরি এটা সাহায্য করবে.


2
"গ্রেপ-ভি গ্রেপ" ব্যবহার করে: আপনার "গ্রেপ" সহ একটি দীর্ঘ কমান্ড লাইন থাকতে পারে তা লক্ষ্য করুন (ধরা যাক যে কেউ একটি গ্রেপ লাইব্রেরি <> "-Llibgrep.so" বা "-cp libgrep.jar" লিখেছেন। কমপক্ষে। আমি এই প্যাটার্নটির পুনরাবৃত্তি করব: গ্রেপ-ভি "গ্রেপ ডেমোন_নাম"
phil_w

শুভ পয়েন্ট, @ ফিল_উ, ধন্যবাদ উত্তর আপডেট করেছেন।
সার্জ ikS

23

আপনি একটি অক্ষর শ্রেণীর কৌশল ব্যবহার করতে পারেন। "[d]" "[d]" কেবল "ডি" এর সাথে মেলে না।

 ps aux | grep [d]aemon_name | awk "{ print \$2 }"

আমি এটি ব্যবহার পছন্দ | grep -v grep


হেই এটা একটা চতুর কৌশল, আমি এটি পছন্দ করি। আমি শেখার সময় এই মুহুর্তে জিনিসগুলি সহজ রাখছি এবং | grep -v grepআমি আমার কোডটি পুনর্বিবেচনা করলে বুঝতে সহজ হবে।
তক

আমি বুঝতে চেষ্টা করছি যে এটি [এইচ] কীভাবে কাজ করে। আপনি কি বলতে চান দয়া করে "[d]" does not match "[d]" only "d"?
এখনকার

@Damian: বর্গাকার বন্ধনী হয় metacharacters অনুসন্ধান এক্সপ্রেশনে (অক্ষরের একটি সেট delimiting) যাতে grepকমান্ড মেলে না হবে psজন্য আউটপুট লাইন grepকমান্ড নিজেই (কি মূল প্রশ্ন "একটি দ্বিতীয় PID," বলা তক)। অভিব্যক্তি a[xy]dনেই না টেক্সট মেলে a[xy]dকিন্তু এটা ম্যাচ সংক্ষিপ্তাকারে text axdবা পাঠ্য ayd। সুতরাং অভিব্যক্তি [f]ooপাঠ্যের সাথে মেলে fooতবে পাঠ্যের সাথে মিলছে না [f]oo। আমি আশা করি যে পরিষ্কার।
রেডগ্রিটিব্রিক

ঠিক আছে, আমি এআরজিভি সম্পর্কে ভুল ছিলাম। এটি কেবল একটি regexp। ধন্যবাদ।
এখনকার

শয়তান চালাক! এক মুহুর্তের জন্য এটি সম্পর্কে ভাবতে হয়েছিল - ধন্যবাদ!
সাবফুজিওন

15

psযদি আরও নির্ভরযোগ্য বিকল্প থাকে তবে এর আউটপুট পার্সিং এড়িয়ে চলুন ।

pgrep daemon_name
pidof daemon_name

হ্যাঁ, শেষ পর্যন্ত প্রক্রিয়া পরিচালনা এখন বোধগম্য।
Bżażej মিশালিক

pgreppidofযথাযথ ম্যাচ করে সাবস্ট্রিংয়ের মাধ্যমে অনুসন্ধান করে - আমার যা প্রয়োজন তা স্পষ্টভাবে! ধন্যবাদ!
সাশা

3

ps -Cবিকল্প সব ইউনিক্স ভিত্তিক সিস্টেমে সার্বজনীন নয় কিন্তু এটি আপনার সিস্টেমে কাজ করে। পরিবর্তে আমি সম্পূর্ণরূপে গ্রেপ এড়ানো হবে:

ps aux | awk '/daemon_name/ && !/awk/ { print $2 }'

একক উদ্ধৃতি চিহ্নে কিছু পালাতে হবে না। ps auxবেশিরভাগ ইউনিক্স ভিত্তিক সিস্টেমে আপনাকে প্রক্রিয়াগুলির সম্পূর্ণ তালিকা দেবে এবং awkসাধারণত ডিফল্টরূপে ইনস্টল করা হয়।


3

pgrepনামের দ্বারা কোনও প্রক্রিয়ার পিড সন্ধান করতে ব্যবহার করুন :

pgrep proc_name

ফলাফলের অতিরিক্ত প্রক্রিয়া নাম সহ ( -l):

pgrep -l proc_name

প্রক্রিয়া নাম ( -l) এবং আর্গুমেন্ট ( -f) দেখুন এবং প্রদর্শন করুন :

pgrep -lf proc_name_or_argument

ভাল কথাটি pgrepহ'ল এটি কখনই নিজেকে ম্যাচ হিসাবে প্রতিবেদন করবে না। তবে আপনাকে পিডটি পাওয়ার দরকার নেই pgrepএবং তারপরে সংশ্লিষ্ট প্রক্রিয়াটি মেরে ফেলুন killpkillপরিবর্তে ব্যবহার করুন:

pkill proc_name

(ডিফল্ট হিসাবে) এর পরিবর্তে SIGKILLসিগন্যাল ( -9বা -KILL) নির্দিষ্ট করুন SIGTERM:

pkill -9 proc_name

প্রক্রিয়া নাম ( -l) এবং আর্গুমেন্ট ( -f) দেখুন, -Iএটি SIGKILLসিগন্যাল ( -9বা -KILL) দ্বারা হত্যা করার আগে নিশ্চিতকরণ ( ) জিজ্ঞাসা করুন :

pkill -KILL -Ilf proc_name_or_argument

লক্ষ্য করুন যে -Iবিকল্পটি কেবলমাত্র কয়েকটি সংস্করণে উপলভ্য pkill, যেমন ওএস এক্স মাভারিক্সের একটি।


0

আপনি যদি ব্যাশ ব্যবহার করছেন তবে আপনি এটি ব্যবহার করে নিম্নলিখিত পদ্ধতিতেও এটি করতে পারেন ps -eaf

PIDS=$(ps -eaf)
PID=$(echo "$PIDS" | grep "process_name" | awk '{print $2}')
echo $PID

এটি অযথা জটিল। কেন কেবল কল করবেন নাps -eaf | grep "process_name" | awk '{print $2}'
ডেভিড নেদরো

0

এই লাইনটি আপনাকে "গ্রেপ" বাদ দিয়ে পিড (প্রক্রিয়া আইডি) ফিরিয়ে দেয়

PID=$(ps aux | grep '/usr/bin/python2.7 manage.py SES__boto3_sqs_read' | grep -v grep)

কিছু ব্যাখ্যা সুন্দর হবে।
ডেভিডবাউমান

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