প্রক্রিয়া চলছে কিনা তা নির্ধারণ করতে লিনাক্স / ইউনিক্স কমান্ড?


100

আমার একটি স্বাধীন প্ল্যাটফর্ম প্রয়োজন (লিনাক্স / ইউনিক্স | ওএসএক্স) শেল / ব্যাশ কমান্ড যা নির্দিষ্ট প্রক্রিয়া চলছে কিনা তা নির্ধারণ করবে। যেমন mysqld, httpd... এটি করার সহজতম উপায় / আদেশ কী?

উত্তর:


173

যদিও pidofএবং pgrepনির্ধারণের কি চালাচ্ছে জন্য মহান হাতিয়ার, তারা উভয় কিছু অপারেটিং সিস্টেমে অনুপলব্ধ, দুর্ভাগ্যবশত। একটি নির্দিষ্ট ব্যর্থ নিরাপদ নিম্নলিখিত ব্যবহার করা হবে:ps cax | grep command

জেন্টু লিনাক্সের আউটপুট:

14484? এস 0:00 এপাচে 2
14667? এস 0:00 এপাচে 2
19620? এসএল 0:00 এপাচি 2
21132? এসএস 0:04 অ্যাপাচি 2

ওএস এক্স এর ফলাফল:

42582 ?? জেড 0: 00.00 (এসএমসিলেট)
46529 ?? জেড 0: 00.00 (এসএমসিলেট)
46539 ?? জেড 0: 00.00 (এসএমসিলেট)
46547 ?? জেড 0: 00.00 (এসএমসিলেট)
46586 ?? জেড 0: 00.00 (এসএমসিলেট)
46594 ?? জেড 0: 00.00 (এসএমসিলেট)

লিনাক্স এবং ওএস এক্স, উভয়তেই গ্রেপ একটি প্রস্থান কোড ফেরত দেয় যাতে প্রক্রিয়াটি পাওয়া যায় কি না তা পরীক্ষা করা সহজ:

#!/bin/bash
ps cax | grep httpd > /dev/null
if [ $? -eq 0 ]; then
  echo "Process is running."
else
  echo "Process is not running."
fi

তদতিরিক্ত, যদি আপনি পিআইডিগুলির তালিকাটি চান, আপনি সহজেই তাদের জন্য গ্রেপ করতে পারেন:

পিএস ক্যাক্স | গ্রেপ httpd | গ্রেপ -ও '^ [] * [0-9] *'

যার আউটপুট লিনাক্স এবং ওএস এক্স-তে সমান:

3519 3521 3523 3524

নিম্নলিখিতগুলির আউটপুটটি একটি খালি স্ট্রিং, এটি চালিত নয় এমন প্রক্রিয়াগুলির জন্য এই পদ্ধতিটিকে নিরাপদ করে তোলে:

প্রতিধ্বনি ps cax | grep aasdfasdf | grep -o '^[ ]*[0-9]*'

এই পদ্ধতির একটি সহজ ফাঁকা স্ট্রিং পরীক্ষা লেখার জন্য উপযুক্ত, তারপরেও আবিষ্কারকৃত পিআইডি দিয়ে পুনরাবৃত্তি করা।

#!/bin/bash
PROCESS=$1
PIDS=`ps cax | grep $PROCESS | grep -o '^[ ]*[0-9]*'`
if [ -z "$PIDS" ]; then
  echo "Process not running." 1>&2
  exit 1
else
  for PID in $PIDS; do
    echo $PID
  done
fi

এক্সিকিউট করার অনুমতি (chmod + x চলমান) এবং একটি পরামিতি দিয়ে এটি চালিয়ে একটি ফাইল ("চলমান" নাম হিসাবে) এ সংরক্ষণ করে আপনি এটি পরীক্ষা করতে পারেন: ./running "httpd"

#!/bin/bash
ps cax | grep httpd
if [ $? -eq 0 ]; then
  echo "Process is running."
else
  echo "Process is not running."
fi

সতর্কতা !!!

দয়া করে মনে রাখবেন যে আপনি কেবল আউটপুটটি পার্সিং করছেন ps axযার অর্থ লিনাক্স আউটপুটে দেখা গেছে এটি কেবল প্রসেসের সাথে মেলে না, তবে সেই প্রোগ্রামটিতে যুক্তিত যুক্তিগুলিও নয়। আমি এই পদ্ধতিটি ব্যবহার করার সময় যথাসম্ভব সুনির্দিষ্ট হওয়ার পরামর্শ দিচ্ছি (উদাহরণস্বরূপ ./running "mysql"'মাইএসকিএলডি' প্রক্রিয়াগুলির সাথেও মিলবে)। আমি whichযেখানে সম্ভব সেখানে একটি পূর্ণ পথের বিরুদ্ধে পরীক্ষা করতে ব্যবহার করার পরামর্শ দিচ্ছি ।


তথ্যসূত্র:

http://linux.about.com/od/commands/l/blcmdl1_ps.htm

http://linux.about.com/od/commands/l/blcmdl1_grep.htm


প্রক্রিয়াটি চলতে পারে তবে বন্ধ হয়ে যায়। সুতরাং যদি মাইএসকিএলডিডি বা httpd "আপ এবং চলমান" (প্রতিক্রিয়াশীল) হয় কিনা তা পরীক্ষা করার লক্ষ্য যদি হয় তবে এটিও বন্ধ হয়ে গেছে কিনা তাও আপনার পরীক্ষা করা উচিত।
ওলুক

4
দুঃখিত, তবে উত্তরটি দৃষ্টিকোণ দৃষ্টিকোণ থেকে অবশ্যই সঠিক হলেও আমি প্রক্রিয়াটি আর্গ ভেক্টরের সাথে প্যাটার্ন মিলিয়ে কোনও প্রক্রিয়া খোঁজার চেষ্টা করার বিরুদ্ধে আছি fully এ জাতীয় যে কোনও পদ্ধতির তাড়াতাড়ি বা পরে ব্যর্থ হওয়ার পরিণতি ঘটেছে (আপনি আরও স্বীকার করেছেন যে এই কথাটি বলে আপনি নিজে স্বীকার করেছেন)। আমি পৃথক উত্তরে আমার নিজস্ব সুপারিশ যুক্ত করেছি।
পিটারহ

6
grepএছাড়াও নিজেই চলমান (যেমন পাবেন ps cax | grep randomnameসবসময় 0 ফিরে আসবে কারণ grepখুঁজে বের করে grep randomname(আশা করি এই স্পষ্ট ...) এক ফিক্স প্রক্রিয়া নামের প্রথম অক্ষর, যেমন চারপাশের বর্গাকার বন্ধনী যোগ করা হয়। ps cax | grep [r]andomname
কাইলি জি

ps cax | rev | cut -f1 -d' ' | revসহজে পার্সিংয়ের জন্য কেবল নাম কলামটি প্রদর্শন করবে।
টাইজয়েড

4
ps caxপুরোপুরি কমান্ড নাম আউটপুট নাও পারে। যেমন এটি "ক্রোমিয়াম-ব্রাউজার" এর পরিবর্তে "ক্রোমিয়াম-ব্রাউজ" মুদ্রণ করে।
জার্নো

25

আপনি পিআইডি জানতে হবে!

প্রক্রিয়া যুক্তিগুলিতে (যেমন pgrep "mysqld") কিছু ধরণের প্যাটার্ন স্বীকৃতি দেওয়ার চেষ্টা করে একটি প্রক্রিয়া সন্ধান করা একটি কৌশল যা শীঘ্রই বা পরে ব্যর্থ হওয়ার পরিণতি হয়। আপনার যদি দুটি মাইএসকিএলড চলছে? সেই পদ্ধতির কথা ভুলে যান। আপনি এটি সাময়িকভাবে সঠিকভাবে পেতে পারেন এবং এটি এক বা দুই বছর ধরে কাজ করতে পারে তবে তারপরে এমন কিছু ঘটে যা আপনি ভাবেননি।

শুধুমাত্র প্রক্রিয়া আইডি (পিড) সত্যই অনন্য।

আপনি যখন পটভূমিতে কিছু লঞ্চ করেন তখন সর্বদা পিড সংরক্ষণ করুন। বাশ-এ এটি $!ব্যাশ ভেরিয়েবলের সাহায্যে করা যেতে পারে । এটি করে আপনি নিজেকে অনেক বেশি বাঁচাতে পারবেন।

প্রক্রিয়া চলছে কিনা তা কীভাবে নির্ধারণ করবেন (পিড দ্বারা)

সুতরাং এখন প্রশ্নটি হয়ে গেল কীভাবে পিড চলছে কিনা তা কীভাবে জানতে হবে।

সহজভাবে করুন:

PS -o pid = -p <পিড>

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

এটি লিনাক্স, বিএসডি, সোলারিস ইত্যাদিতে কাজ করবে

অন্য কৌশলটি হ'ল উপরের psকমান্ডটি থেকে প্রস্থান মূল্য পরীক্ষা করা । প্রক্রিয়াটি চলমান থাকলে এটি শূন্য এবং যদি তা শূন্য নয় তবে এটি হওয়া উচিত। পসিক্স স্পেক বলছে যে psকোনও ত্রুটি দেখা দিলে অবশ্যই 0 থেকে প্রস্থান করা উচিত তবে এটি 'ত্রুটি' গঠনের বিষয়টি আমার কাছে অস্পষ্ট। সুতরাং আমি ব্যক্তিগতভাবে সেই কৌশলটি ব্যবহার করছি না যদিও আমি নিশ্চিত যে এটি সমস্ত ইউনিক্স / লিনাক্স প্ল্যাটফর্মগুলিতেও কাজ করবে।


4
এটি বাদে এই প্রশ্নের উত্তর দেয় না, যা কোনও পরিষেবা চলছে কিনা তা নির্ধারণ করার জন্য। Pid, এই ক্ষেত্রে জানা যাবে না তাই এই উত্তর শুধুমাত্র বৈধ হলে আপনি কি PID, জানি।
হাইওয়ে

4
ভুল আমার মন্তব্যের পুরো বক্তব্যটি হ'ল একটি পদক্ষেপ পিছনে নিয়ে যাওয়া এবং বলা যে আপনি যদি প্রথমে কোনও পরিস্থিতি খুঁজে পান যেখানে আপনাকে grep <sometext>কোনও প্রক্রিয়া সন্ধানের জন্য কিছু ফর্ম করতে হয় তবে আপনি প্রক্রিয়া শুরু করার সময় আপনি কিছু ভুল করেছেন, আইএমএইচও। আমি ওপির প্রশ্ন থেকে এটাই গ্রহণ করি যে প্রক্রিয়াটি কীভাবে শুরু হয় তার উপর অবশ্যই তাঁর নিয়ন্ত্রণ রয়েছে।
পিটারহ

4
ওপি প্রশ্নের আরও সঠিক "টার্ম" হওয়া উচিত ছিল "কোনও সার্ভিস চলছে কিনা তা নির্ধারণের জন্য ক্রস-প্ল্যাটফর্ম কমান্ড" হওয়া উচিত, এটি চেকটি চালাচ্ছিল একই সিস্টেম নয়, তবে বাইরের একটি সিস্টেম, তাই পিআইডি কেবল হবে না একেবারেই জানা
হাইওয়ে

4
এটি বোকা নয়। আপনার আগ্রহী এই প্রক্রিয়াটি পিআইডিদের চারপাশে মোড়ানোর জন্য সিস্টেমটি যথেষ্ট দীর্ঘ সময় কাটিয়ে যাওয়ার পরে মারা যেতে পারে এবং এর পরে অন্য কোনও প্রক্রিয়া আপনি একই পিআইডি বরাদ্দ করা হতে পারে যা আপনি অনুসন্ধান করছেন। stackoverflow.com/questions/11323410/linux-pid-recycling
क्লেমেশন

4
ক্লাইমেশন ন্যায্য বিন্দু. তবে প্রসেস আরগগুলিতে প্যাটার্ন ম্যাচিংয়ের চেয়ে পিআইডি পদ্ধতিটি আরও ভাল কারণ পিআইডি সংঘর্ষে দুর্ঘটনাক্রমে একই পরিষেবাটির দুটি উদাহরণ শুরু করার চেয়ে সম্ভাবনা বেশি। শুধু আমার দুই সেন্ট। :-)
পিটার

15

বেশিরভাগ লিনাক্স বিতরণে, আপনি ব্যবহার করতে পারেন pidof(8)।

এটি নির্দিষ্ট প্রসেসের সমস্ত চলমান দৃষ্টান্তগুলির প্রসেস আইডিগুলি প্রিন্ট করবে, বা কোনও দৃষ্টান্ত চলমান না থাকলে কিছুই না।

উদাহরণস্বরূপ, আমার সিস্টেমে (আমার চারটি দৃষ্টান্ত bashএবং একটি remminaদৌড়ের উদাহরণ রয়েছে ):

$ pidof bash remmina
6148 6147 6144 5603 21598

অন্যান্য ইউনিটগুলিতে pgrepবা অন্যের সংমিশ্রণে psএবং grepএকই জিনিস অর্জন করবে , অন্যরা যথাযথভাবে উল্লেখ করেছেন।


+1 টি pidof httpdরেড হ্যাট 5. কিন্তু আমার রেড হ্যাট 4 কাজ জরিমানা, pidofউপস্থিত নেই :-(
olibre

প্রকৃতপক্ষে, এই কমান্ডটি আমি যতটা ভাবছিলাম তার চেয়ে কম বিস্তৃত, আমি এই উত্তরটি আরও পরিষ্কার করার জন্য আমার উত্তর সম্পাদনা করেছি।
ফ্রেডরিক হামিদি

সত্যিই সুন্দর পরিষ্কার উত্তর। (সমর্থিত সিস্টেমে) ধন্যবাদ.
এমটিএল দেব

7

এটি ইউনিক্স, বিএসডি এবং লিনাক্সের বেশিরভাগ স্বাদে কাজ করা উচিত:

PATH=/usr/ucb:${PATH} ps aux | grep httpd | grep -v grep

পরীক্ষিত:

  • SunOS 5.10 [সুতরাং PATH=...]
  • লিনাক্স 2.6.32 (CentOS)
  • লিনাক্স 3.0.0 (উবুন্টু)
  • ডারউইন 11.2.0
  • ফ্রিবিএসডি 9.0-স্ট্যাবল
  • রেড হ্যাট এন্টারপ্রাইজ লিনাক্স ইএস রিলিজ 4
  • Red Hat Enterprise Linux সার্ভার রিলিজ 5

4
+1 হ্যাঁ সহজভাবে ps। দ্বিতীয়টি এড়াতে grepআমি পরামর্শ দিই:ps aux | grep [h]ttpd
ওলিব্রে

মূলটিতে ভেরিয়েবলটি রাখা আরও সহজ করার জন্য আমি এখানে স্কোয়ার ব্র্যাকেট ট্র্যাকটি ব্যবহার করি নি grep
জনসয়েব

4
ঠিক আছে;) আমি কেবল রেড হ্যাট এএস 4 এবং রেড হ্যাট এপি 5 পরীক্ষা করেছি tested অবশ্যই আমি কাজ করি! সুতরাং আপনি আপনার তালিকায় যুক্ত করতে পারেন: রেড হ্যাট এন্টারপ্রাইজ লিনাক্স ইএস রিলিজ 4 এবং রেড হ্যাট এন্টারপ্রাইজ লিনাক্স সার্ভার 5 প্রকাশ করে । চিয়ার্স
অলিব্রে

@ডাউনভোটার: কেন? আমি কি করতে পারেননি? আমি যতদূর বলতে পারি, গৃহীত উত্তরগুলি একই তাকাচ্ছে!
জনসিওয়েব

6

সবচেয়ে সহজ উপায় হল পিএস এবং গ্রেপ ব্যবহার করা:

command="httpd"
running=`ps ax | grep -v grep | grep $command | wc -l`
if [ running -gt 0 ]; then
    echo "Command is running"
else
    echo "Command is not running"
fi

যদি আপনার কমান্ডটিতে কিছু কমান্ড আর্গুমেন্ট থাকে তবে আপনি আগ্রহী নন এমন সম্ভাব্য অন্যান্য প্রক্রিয়াগুলি ফিল্টার করার জন্য আপনি 'গ্রেপ $ কমান্ড' এর পরে আরও 'গ্রেপ সেন্টিমিডি_আরজি 1' রাখতে পারেন।

উদাহরণ: সরবরাহিত যুক্তি সহ কোনও জাভা প্রক্রিয়াটি আমাকে দেখান:

-ডজভা.ইটিল.লগিং.কনফিগ.ফিল = লগিং.প্রেপার্টি

চলছে

ps ax | grep -v grep | grep java | grep java.util.logging.config.file=logging.properties | wc -l

4
প্রকৃতপক্ষে, ব্যবহারের ps caxপ্রয়োজনীয়তা বাদ দেয় grep -v। সুতরাং উদাহরণস্বরূপ, আপনি ব্যবহার করতে পারেন: ps cax | grep java > /dev/null || echo "Java not running"
লাইফের হাইওয়ে

4
তৃতীয় লাইনে একটি ভুল আছে। দয়া করে "চলমান" কে "$ চলমান" তে পরিবর্তন করুন।
প্রোগ্রামার

5

কেবলমাত্র একটি সামান্য সংযোজন: আপনি যদি -cPS তে পতাকা যুক্ত করেন তবে আপনার grep -vপরে গ্রিপ প্রক্রিয়া যুক্ত লাইনটি সরিয়ে ফেলতে হবে না । অর্থাৎ

ps acux | grep cron

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

এমন একটি সিস্টেমে যেখানে নেটিভ psকমান্ডের জেনেটিকস সিসভিতে ফিরে আসে, আপনি ব্যবহার করতে চান

ps -e |grep cron

বা

ps -el |grep cron 

শুধু পিড এবং প্রক্রিয়া নাম ছাড়াও আরও একটি তালিকা রয়েছে। অবশ্যই আপনি -o <field,field,...>বিকল্পটি মুদ্রণের জন্য নির্দিষ্ট ক্ষেত্রগুলি নির্বাচন করতে পারেন ।


এই উত্তরটি কীভাবে বহনযোগ্য? (আপনি বলেছেন যে
পিএম

দুর্ভাগ্যক্রমে পিএস হ'ল সেই সরঞ্জামগুলির মধ্যে একটি যা তাদের পূর্বসূরীর উপর নির্ভর করে একই ফলাফলের জন্য বিভিন্ন সেট অপশন সহ। সুতরাং, আপনি যদি নিজের চারপাশে নিজের (আবার কোনও কিছুর সাথে বেমানান নয়) মোড়ক না লিখে থাকেন তবে যাওয়ার উপায় হ'ল heritageতিহ্যের মূল লাইনগুলি জানা এবং সে অনুযায়ী মানিয়ে নেওয়া। আপনি স্ক্রিপ্ট করার সময় এটি আলাদা হয় - আপনি কোন শাখায় আছেন তা নির্ধারণ করতে এবং আপনার স্ক্রিপ্টের আচরণটি মানিয়ে নিতে আপনি এই পার্থক্যগুলি ব্যবহার করবেন। নীচের লাইন: আপনার উভয়ই জানতে হবে। বিখ্যাত উদাহরণ: ল্যারি ওয়াল এর "কনফিগার" স্ক্রিপ্ট। বিখ্যাত উক্তি: অভিনন্দন, আপনি ইউনিস চালাচ্ছেন না।
তাতজানা হিউসার

5

বিভিন্ন পরামর্শ একসাথে রাখলে আমি সবচেয়ে পরিষ্কার সংস্করণটি প্রকাশ করতে সক্ষম হয়েছি (অবিশ্বস্ত গ্রেপ ছাড়াই যা শব্দের অংশগুলিকে ট্রিগার করে) হ'ল:

kill -0 $(pidof mysql) 2> /dev/null || echo "Mysql ain't runnin' message/actions"

কিল -0 প্রক্রিয়াটিকে হত্যা করে না তবে এটি উপস্থিত রয়েছে কিনা তা যাচাই করে এবং তারপরে সত্যটি ফিরে আসে, আপনার সিস্টেমে পিডোফ না থাকলে, প্রক্রিয়াটি চালু করার সময় পিডটি সংরক্ষণ করুন:

$ mysql &
$ echo $! > pid_stored

তাহলে স্ক্রিপ্টে:

kill -0 $(cat pid_stored) 2> /dev/null || echo "Mysql ain't runnin' message/actions"

3

আমি ব্যবহার করি pgrep -l httpdতবে নিশ্চিত না যে এটি কোনও প্ল্যাটফর্মে রয়েছে ...
ওএসএক্সে কে নিশ্চিত করতে পারে?


ধন্যবাদ @ জনসিওয়েব আপনি কি pidofদয়া করে পরীক্ষা করতে পারেন ? ঠিক আছে আপনি করেছেন। ধন্যবাদ. সুতরাং আমাদের ps|grep
ওএসএক্সে

1

আপনার প্রক্রিয়াটির পিআইডি জানা উচিত।

আপনি যখন এটি চালু করবেন, এর পিআইডি $!ভেরিয়েবলে রেকর্ড করা হবে । এই পিআইডি একটি ফাইলে সংরক্ষণ করুন।

তারপরে আপনার এই পিআইডি কোনও চলমান প্রক্রিয়ার সাথে মিলে যায় কিনা তা খতিয়ে দেখতে হবে। এখানে একটি সম্পূর্ণ কঙ্কাল লিপি আছে:

FILE="/tmp/myapp.pid"

if [ -f $FILE ];
then
   PID=$(cat $FILE)
else
   PID=1
fi

ps -o pid= -p $PID
if [ $? -eq 0 ]; then
  echo "Process already running."  
else
  echo "Starting process."
  run_my_app &
  echo $! > $FILE
fi

এর উত্তরের ভিত্তিতে peterh। প্রদত্ত পিআইডি চলছে কিনা তা জানার কৌশলটি ps -o pid= -p $PIDনির্দেশনায় রয়েছে।


0

এই পদ্ধতির ক্ষেত্রে কমান্ড 'পিএস', 'পিডোফ' ব্যবহার করা যেতে পারে এবং বিশ্রামটি উপলব্ধ নেই। আমি ব্যক্তিগতভাবে আমার সরঞ্জামগুলি / স্ক্রিপ্ট / প্রোগ্রামগুলিতে খুব ঘন ঘন ব্যবহার করি।

   egrep -m1  "mysqld$|httpd$" /proc/[0-9]*/status | cut -d'/' -f3

কি চলছে তা নিয়ে সামান্য ব্যাখ্যা:

  1. -ম 1 - প্রথম ম্যাচে প্রক্রিয়া বন্ধ করুন
  2. "mysqld $ | httpd $" - গ্রেপ লাইনগুলি মেলে যা mysqld OR httpd এ শেষ হয়েছিল
  3. / proc / [0-9] * - বাশ লাইন মিলবে যা কোনও সংখ্যার সাথে শুরু হয়েছিল
  4. কাটা - কেবলমাত্র ডিলিমিটার '/' দ্বারা আউটপুটকে বিভক্ত করুন এবং ক্ষেত্র 3 সরান

0

এটি এমন প্রক্রিয়াগুলির সংখ্যা মুদ্রণ করে যার ভিত্তি নামটি "ক্রোমিয়াম-ব্রাউজার":

ps -e -o args= | awk 'BEGIN{c=0}{
 if(!match($1,/^\[.*\]$/)){sub(".*/","",$1)} # Do not strip process names enclosed by square brackets.
 if($1==cmd){c++}
}END{print c}' cmd="chromium-browser"

যদি এটি "0" মুদ্রণ করে তবে প্রক্রিয়াটি চলমান নয়। কমান্ডটি অনুমান করে যে প্রক্রিয়া পথটিতে ব্রেকিং স্পেস নেই। আমি স্থগিত প্রক্রিয়া বা জম্বি প্রক্রিয়াগুলির সাথে এটি পরীক্ষা করিনি।

লিনাক্সের বিকল্প gwakহিসাবে ব্যবহার করে পরীক্ষিত awk

কিছু উদাহরণ ব্যবহারের সাথে এখানে আরও বহুমুখী সমাধান রয়েছে:

#!/bin/sh
isProcessRunning() {
if [ "${1-}" = "-q" ]; then
 local quiet=1;
 shift
else
 local quiet=0;
fi
ps -e -o pid,args= | awk 'BEGIN{status=1}{
 name=$2
 if(name !~ /^\[.*\]$/){sub(".*/","",name)} # strip dirname, if process name is not enclosed by square brackets.
 if(name==cmd){status=0; if(q){exit}else{print $0}}
}END{exit status}' cmd="$1" q=$quiet
}

process='chromium-browser'

printf "Process \"${process}\" is "
if isProcessRunning -q "$process" 
 then printf "running.\n"
 else printf "not running.\n"; fi

printf "Listing of matching processes (PID and process name with command line arguments):\n"
isProcessRunning "$process"

0

এখানে আমার সংস্করণ। বৈশিষ্ট্য:

  • সঠিক প্রোগ্রামের নাম (ফাংশনটির প্রথম যুক্তি) পরীক্ষা করে cks "মাইএসকিএল" অনুসন্ধানের সাথে "মাইএসকিএলডি" চলমান মিলবে না
  • প্রোগ্রাম আর্গুমেন্ট (ফাংশনের দ্বিতীয় যুক্তি) অনুসন্ধান করে

লিপি:

#!/bin/bash

# $1 - cmd
# $2 - args
# return: 0 - no error, running; 1 - error, not running
function isRunning() {
    for i in $(pidof $1); do
        cat /proc/$i/cmdline | tr '\000' ' ' | grep -F -e "$2" 1>&2> /dev/null
        if [ $? -eq 0 ]; then
            return 0
        fi
    done
    return 1
}

isRunning java "-Djava.util.logging.config.file=logging.properties"
if [ $? -ne 0 ]; then
    echo "not running, starting..."
fi

0

উত্তরগুলির কোনওটিই আমার পক্ষে কার্যকর হয়নি, তাই আমার এখানে:

process="$(pidof YOURPROCESSHERE|tr -d '\n')"
if [[ -z "${process// }" ]]; then
  echo "Process is not running."
else
  echo "Process is running."
fi

ব্যাখ্যা:

|tr -d '\n'

এটি টার্মিনাল দ্বারা তৈরি ক্যারেজ রিটার্ন সরিয়ে দেয়। বাকীটি এই পোস্টের মাধ্যমে ব্যাখ্যা করা যেতে পারে ।


-1

নিম্নলিখিত শেল ফাংশন, কেবলমাত্র পসিক্স স্ট্যান্ডার্ড কমান্ড এবং বিকল্পগুলির উপর ভিত্তি করে বেশিরভাগ (যদি না হয়) ইউনিক্স এবং লিনাক্স সিস্টেমের উপর কাজ করা উচিত। :

isPidRunning() {
  cmd=`
    PATH=\`getconf PATH\` export PATH
    ps -e -o pid= -o comm= |
      awk '$2 ~ "^.*/'"$1"'$" || $2 ~ "^'"$1"'$" {print $1,$2}'
  `
  [ -n "$cmd" ] &&
    printf "%s is running\n%s\n\n" "$1" "$cmd" ||
    printf "%s is not running\n\n" $1
  [ -n "$cmd" ]
}

$ isPidRunning httpd
httpd is running
586 /usr/apache/bin/httpd
588 /usr/apache/bin/httpd

$ isPidRunning ksh
ksh is running
5230 ksh

$ isPidRunning bash
bash is not running

নোট করুন যে সন্দেহজনক "0]" কমান্ডের নামটি পাস করার সময় এটি শ্বাসরোধ করবে এবং তাদের নামে এমবেডেড স্থান রয়েছে এমন প্রক্রিয়াগুলি সনাক্ত করতে ব্যর্থ হবে।

এটিও লক্ষ করুন যে সর্বাধিক উত্সাহিত এবং গ্রহণযোগ্য সমাধানটি বহনযোগ্য psবিকল্পগুলির জন্য দাবি করে এবং কৃতজ্ঞতার সাথে একটি শেল ব্যবহার করে যা এর জনপ্রিয়তা সত্ত্বেও প্রতিটি ইউনিক্স / লিনাক্স মেশিনে উপস্থিত থাকার নিশ্চয়তা দেয় না ( bash)


$ isPidRunning 0]প্রিন্টগুলি যেমন "0] চলছে 3 [ksoftirqd / 0] 8 [rcuop / 0] 17 [rcuos / 0] 26 [rcuob / 0] 34 [মাইগ্রেশন / 0] 35 [নজরদারি / 0]" এখানে।
জার্নো

আপনার সেই পথের জিনিসটি কী দরকার?
জার্নো

আমি সমাধানটি এখানে আরও বিকাশ করেছি ।
জার্নো

@ জারানো প্যাথ সেটিংটি স্ক্রিপ্টটির বহনযোগ্য হতে পারে। অন্যথায়, এটি কমপক্ষে সোলারিস 10 এবং তার চেয়ে বেশি পুরানো এবং সম্ভবত অন্যান্য ইউনিক্স বাস্তবায়নে ব্যর্থ হবে।
jlliagre

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