বাশ: যদি / এক লাইনে অন্য বিবৃতি


204

some_processকোনও সার্ভারে কোনও প্রক্রিয়া (ধরে নেওয়া হয় বলে ধরে নেওয়া হয় ) চলছে কিনা তা আমি খতিয়ে দেখার চেষ্টা করছি । যদি তা হয় তবে 1 প্রতিধ্বনি করুন, অন্যথায় 0 প্রতিধ্বনি করুন।

এটি হ'ল আদেশটি যা আমি ব্যবহার করছি তবে এটি কেবল আংশিকভাবে কাজ করে (নীচে আরও তথ্য)। নোট করুন যে আমাকে স্ক্রিপ্টটি এক লাইনে লিখতে হবে।

ps aux | grep some_proces[s] > /tmp/test.txt && if [ $? -eq 0 ]; then echo 1; else echo 0; fi

নোট:[s] মধ্যে some_proces[s]প্রতিরোধ করা হয় grepনিজেই ফিরে থেকে।

যদি some_processচলমান থাকে তবে "1"প্রতিধ্বনিত হয় যা ঠিক আছে। তবে some_processচলমান না থাকলে কিছুই প্রতিধ্বনিত হয় না।


4
আপনি ps -Ccmdপ্রসেসগুলি সন্ধান করতে ব্যবহার করতে পারেন যার কমান্ডের নাম "সেন্টিমিডি", যা সম্পূর্ণরূপে নির্মূল করতে পারে greppsএটি যদি কোনও মিলে যাওয়া প্রক্রিয়াটি খুঁজে পেতে ব্যর্থ হয় তবে প্রস্থান কোডটি কিছু অ-শূন্য মানতে সেট করবে।
ধনী

উত্তর:


272

সুস্পষ্টভাবে চেক করার দরকার নেই $?। শুধু কর:

ps aux | grep some_proces[s] > /tmp/test.txt && echo 1 || echo 0 

নোট করুন যে এটি প্রতিধ্বনিত করতে ব্যর্থ হয় না, যা নিশ্চয়ই নিশ্চিত হয় না। এটি লেখার আরও নির্ভরযোগ্য উপায় হ'ল:

if ps aux | grep some_proces[s] > /tmp/test.txt; then echo 1; else echo 0; fi

9
যদি echo 1ব্যর্থ হয় তবে echo 0মৃত্যুদন্ড কার্যকর করা হবে। এই ক্ষেত্রে, প্রতিধ্বনি 1 কখনই ব্যর্থ হবে না, তবে দ্রষ্টব্য যে এন্ড এন্ড বি || সি যদি-তবে-অন্য হয় না। এ যখন সত্য হয় তখন সি চলতে পারে shell ( শেলচেক থেকে )।
স্কিমে্যাক

@ শেকম্যাকস একটি খুব বৈধ পয়েন্ট তৈরি করেছে: আরও ভাল বিকল্প সরবরাহ করতে সম্পাদনা।
উইলিয়াম পার্সেল

2
পিএস কমান্ডের আউটপুট কোনও ফাইলের সাথে পুনঃনির্দেশ করা প্রয়োজন? এটি কি কাজ করবে না? if ps aux | grep some_proces[s]; then echo 1; else echo 0; fi। স্থানীয়ভাবে মনে হয় এটি আমার পক্ষে কাজ করে। এটি কি কারণ ওপির যে কমান্ডটি চেষ্টা করেছিলেন সেটিতে পুনর্নির্দেশ ছিল?

1
আউটপুটটি পুনর্নির্দেশ করার কোনও দরকার নেই। আমি নিছক আসল অবস্থানটি বন্ধ করেছি, কারণ আমি ধরে নিই যে কোনও কারণে আউটপুট সংরক্ষণ করা হচ্ছে। প্রায়শই এই ধরণের জিনিস নিছক চাপা থাকে (সাথে grep -qবা / দেব / নালকে পুনঃনির্দেশিত)।
উইলিয়াম পার্সেল 21

আমি ব্যবহার করব pgrep
pawciobiel

67

&&অর্থ "এবং যদি সফল হয়"; আপনার ifবিবৃতিটি এর ডানদিকে রেখে , আপনি নিশ্চিত হন যে এটি কেবলমাত্র grepফেরৎ পেলে চলবে 0। এটি ঠিক করতে, ;পরিবর্তে ব্যবহার করুন:

ps aux | grep some_proces[s] > /tmp/test.txt ; if [ $? -eq 0 ]; then echo 1; else echo 0; fi

(বা কেবল একটি লাইন-ব্রেক ব্যবহার করুন)।


6
+1 এটি একটি আরও ভাল উত্তর, কারণ এটি প্রকৃতপক্ষে কেবল কোনও বিকল্প সরবরাহের বিরোধিতা হিসাবে প্রশ্নের উত্তর দেয়।
উইলিয়াম পার্সেল

41

ব্যবহার করুন grep -vcউপেক্ষা করার grepমধ্যে psআউটপুট এবং একই লাইন গণনা।

if [[ $(ps aux | grep process | grep -vc grep)  > 0 ]] ; then echo 1; else echo 0 ; fi

15

আপনি পূর্ণ ব্যবহার করতে পারবেন না &&এবং ||এই মত অপারেটরদের:

ps aux | grep some_proces[s] > /tmp/test.txt && echo 1 || echo 0

গ্রেপ নিজে বাদ না দেওয়ার জন্য আপনি এর মতো কিছু করতেও পারেন:

ps aux | grep some_proces | grep -vw grep > /tmp/test.txt && echo 1 || echo 0

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