কোনও প্রক্রিয়া চলছে কিনা তা কীভাবে নির্ধারণ করবেন এবং এটি শর্তসাপেক্ষ শেল স্ক্রিপ্ট তৈরি করতে ব্যবহার করবেন?


108

কোনও প্রক্রিয়া চলছে কিনা তা আমি কীভাবে নির্ধারণ করতে পারি এবং তারপরে বাশ স্ক্রিপ্টটি সেই শর্তের উপর ভিত্তি করে কিছু স্টাফ চালায়?

উদাহরণ স্বরূপ:

  • যদি প্রক্রিয়া abcচলমান থাকে তবে এটি করুন

  • যদি এটি চলমান না থাকে তবে এটি করুন।


1
এটি গুরুত্বপূর্ণ মনে করুন যে নীচের সমাধানগুলির কোনওটিই প্রক্রিয়াটির অবস্থা বিবেচনা করে না। আমার একটি প্রশ্নের একটি মন্তব্য আমাকে এখানে নিয়ে এসেছিল, তবে এর উত্তর আমাকে zombieপ্রসেসের মতো একটি প্রোগ্রামের বিভিন্ন রাজ্যে আটকে রেখেছিল (আমি "চলমান" প্রক্রিয়া হিসাবে কী বর্ণনা করব না)। কি এর একটি পূর্ণ তালিকা STATকলাম মূল্যবোধ, আউটপুট মধ্যে ps, তার ইঙ্গিত দেয় এখানে আনত সেই উত্তর যে এই accommodates লিখুন, অথবা নিজেদের সম্পাদনা করার জন্য।
ব্যবহারকারী 66001

সম্পর্কিত আলোচনা: unix.stackexchange.com/questions/74185/…
blong

প্রক্রিয়াটি যাচাই করার সর্বোত্তম উপায়টি
ট্রেভর বয়েড স্মিথ

উত্তর:


166

এর মতো কিছু করার জন্য একটি বাশ স্ক্রিপ্টটি এর মতো দেখতে লাগবে:

#!/bin/bash

# Check if gedit is running
# -x flag only match processes whose name (or command line if -f is
# specified) exactly match the pattern. 

if pgrep -x "gedit" > /dev/null
then
    echo "Running"
else
    echo "Stopped"
fi

এই স্ক্রিপ্টটি কেবল "gedit" প্রোগ্রামটি চলছে কিনা তা পরীক্ষা করে দেখছে।

অথবা আপনি কেবল পরীক্ষা করতে পারেন যে প্রোগ্রামটি এরকম চলছে না:

if ! pgrep -x "gedit" > /dev/null
then
    echo "Stopped"
fi

@ড্রেডপাইরেটশান আপনি কি আমাকে বলতে পারবেন কেন / ডিভ / নাল ব্যবহার করেন এবং কেবল একটি 0 নয় কেন? সংখ্যাটি ব্যবহার করা কোডটি আরও পঠনযোগ্য করে তোলে, কমপক্ষে কোনও নুব (যেমন আমার মতো) জন্য। কোনও পুনর্নির্দেশ নেই, কিছুই নেই
সিলভিউ

2
@ সিলভিউ হাহ? গুগলিং /dev/null: "/ dev / null কমান্ড স্ট্যান্ডার্ড আউটপুটটিকে নাল ডিভাইসে পুনঃনির্দেশ করে, যা একটি বিশেষ ডিভাইস যা এতে লেখা তথ্যকে অস্বীকার করে" ... ব্যবহার 0করে কমান্ড আউটপুটটিকে ডেকে আনা একটি ফাইলে পুনঃনির্দেশিত করে 0। এই ক্ষেত্রে, আমি আরও আরামদায়ক হওয়ার পরামর্শ দিচ্ছি > /dev/null- আপনি এটি সর্বত্র দেখতে পাবেন, কারণ এটি আউটপুট বাতিল করার আদর্শ / যথাযথ উপায়।
ড্রেডপাইরেটশাহন

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

3
অনুগ্রহ করে -xপ্যারামিটারটি যুক্ত করুন pgrepযাতে এটি সঠিক অ্যাপ্লিকেশনটির সন্ধান করছে বা অন্য কোনও অ্যাপ্লিকেশানের নামের মধ্যে একই স্ট্রিংটি খুঁজে পেলে এটি একটি মিথ্যা সঠিক পাওয়া যাবে। আমি এটি জানতে সবে মাত্র 1 ঘন্টা ব্যয় করেছি।
থ্যানোস এপোস্টলৌ

1
প্রোগ্রামটি চলছে না কিনা তা যাচাই করার জন্য! pgrep
মোহাম্মদ নুরাল্ডিন

36

যে কোনও সমাধান যা ব্যবহার করে ps aux | grep abcবা pgrep abcত্রুটিযুক্ত কিছু ব্যবহার করে ।

কেন?

যেহেতু আপনি কোনও নির্দিষ্ট প্রক্রিয়া চলছে কিনা তা যাচাই করছেন না, আপনি মিলছেন এমন কোনও প্রক্রিয়া চলছে কিনা তা আপনি পরীক্ষা করছেন abc। যে কোনও ব্যবহারকারী সহজেই একটি এক্সিকিউটেবল নামে তৈরি করতে এবং চালাতে পারেন abc(বা abcএটির নাম বা যুক্তি কোথাও রয়েছে ), যা আপনার পরীক্ষার জন্য একটি মিথ্যা ইতিবাচক কারণ ঘটায়। বিভিন্ন অপশন আপনার ক্ষেত্রে প্রযোজ্য হতে পারে ps, grepএবং pgrepআপনাকে ধন্যবাদ, কিন্তু আপনি এখনও একটি নির্ভরযোগ্য পরীক্ষা পাবেন না।

সুতরাং আমি কীভাবে নির্ভর করে একটি নির্দিষ্ট চলমান প্রক্রিয়াটির জন্য পরীক্ষা করব?

এটি আপনার যা পরীক্ষা প্রয়োজন তার উপর নির্ভর করে।

আমি নিশ্চিত করতে চাই যে পরিষেবাটি abc চলছে, এবং যদি না হয় তবে এটি শুরু করুন

এটি আরম্ভ এবং আপস্টার্টের জন্য। তারা পরিষেবাটি শুরু করবে এবং এটির পিডটি একটি পিডফাইলে সঞ্চিত হবে তা নিশ্চিত করবে। সার্ভিসটি আবার শুরু করার চেষ্টা করুন (init বা upstart এর মাধ্যমে) এবং এটি পিডফাইলে যাচাই করবে এবং এটি সেখানে না থাকলে এটি শুরু করুন, অথবা এটি ইতিমধ্যে চালু থাকলে বাতিল করুন। এটি এখনও 100% নির্ভরযোগ্য নয়, তবে এটি আপনি যতটা কাছাকাছি পাবেন close

দেখুন আমি যদি আমার খেলা সার্ভারে এখনও চলমান আছে কিনা ... পরীক্ষা করতে পারবেন কিভাবে অন্যান্য সমাধানের জন্য।

এবি আমার লিপি। আমার স্ক্রিপ্টের কেবলমাত্র একটি উদাহরণ চলছে তা নিশ্চিত করা দরকার।

এই ক্ষেত্রে, একটি লকফিল বা লকডির ব্যবহার করুন। যেমন

#!/usr/bin/env bash

if ! mkdir /tmp/abc.lock; then
    printf "Failed to acquire lock.\n" >&2
    exit 1
fi
trap 'rm -rf /tmp/abc.lock' EXIT  # remove the lockdir on exit

# rest of script ...

লক করার অন্যান্য উপায়গুলির জন্য বাশ FAQ 45 দেখুন ।


3
যদিও এটি প্রযুক্তিগতভাবে সত্য, আমি ব্যক্তিগত জীবনে ব্যক্তিগতভাবে এমন সমস্যার মুখোমুখি হয়েছি। বেশিরভাগ প্রোগ্রাম স্ক্রিপ্টগুলি ভাঙ্গার উপায়গুলিতে তাদের নাম পরিবর্তন করে না। সুতরাং, মত সহজ স্ক্রিপ্ট কিছু pgrepবা psপুরোপুরি পর্যাপ্ত রয়েছে এবং আপনার পদ্ধতির Overkill মত মনে হয়। আপনি যদি জনসাধারণের বিতরণের জন্য কোনও স্ক্রিপ্ট লিখছেন তবে, আপনার এটি নিরাপদ পথে লেখা উচিত।
স্কট সিভেরেন্স

2
@ স্কটসিভারেন্স প্রোগ্রাম নাম পরিবর্তন করে ইস্যু নয়; যে নির্বিশেষে হস্তক্ষেপ প্রয়োজন হবে। অন্যান্য ব্যবহারকারীরা একই প্রোগ্রামটি চালাচ্ছেন বা অন্যান্য প্রোগ্রাম একই নামে রয়েছে যা হঠাৎ স্ক্রিপ্টটিকে মিথ্যা ধনাত্মক করে তোলে এবং এভাবে ভুল কাজ করে। আমি কেবল "বেশিরভাগ কাজ" না করে "কাজগুলি" পছন্দ করি।
গিরিহা

2
আমি ভুল বানান। তবে আমাদের মধ্যে অনেকে সিঙ্গল-ইউজার সিস্টেম চালায়। এবং একাধিক ব্যবহারকারীর ব্যবহারকারীর নামটির জন্য গ্রেপ করা সহজ easy
স্কট সিভেরেন্স

1
যদি আপনার স্ক্রিপ্টটি রানটাইমের সময় ব্যর্থ হয় এবং ফাইলটি আনলক করার আগে মারা যায়?
jp093121

2
@ jp093121 স্ক্রিপ্টটি প্রস্থান করা হলে এক্সিট ফাঁদটি ট্রিগার করা হয়। এটি স্ক্রিপ্টের শেষ প্রান্তে, একটি প্রস্থান কমান্ডে পৌঁছায় বা একটি সংকেত (যা পরিচালনা করতে পারে) এ পৌঁছায় না কেন তা সরিয়ে দেয় না, rmকমান্ডটি চালিত হয়। সুতরাং যতক্ষণ এটি ফাঁদ সেট হয়ে যাওয়ার পরে শেষ হয় ততক্ষণ লকটি চলে।
গিরিহা

18

এটি আমি ব্যবহার করি:

#!/bin/bash

#check if abc is running
if pgrep abc >/dev/null 2>&1
  then
     # abc is running
  else
     # abc is not running
fi

সরল ইংরেজিতে: 'pgrep' 0 প্রদান করে, প্রক্রিয়াটি চলমান, অন্যথায় তা হয় না।


সম্পর্কিত পড়া:

বাশ স্ক্রিপ্টিং :: স্ট্রিং তুলনা

উবুন্টু ম্যানুয়ালস pgrep


ধন্যবাদ! আমি এটি খুব চেষ্টা করেছি এটি পুরোপুরি কার্যকর হয় :)
নির্মীক

pgrepপূর্বে উল্লিখিত একই 15 চরিত্রের সীমা "বৈশিষ্ট্য" রয়েছে, উদাহরণস্বরূপ pgrep gnome-power-managerএটি ব্যর্থও হবে
থারসন

1
আপনি পিগ্রেপের -xবিকল্পটি ব্যবহার করেছেন তা নিশ্চিত করুন : "কেবলমাত্র সেই প্রক্রিয়াগুলির সাথে মেলে যাঁর নাম (বা কমান্ড লাইন যদি -f নির্দিষ্ট করা থাকে) ঠিক সেই প্যাটার্নটির সাথে মেলে।"
অ্যালাস্টার ইরভিন

5

pidof -x $(basename $0)এটি ইতিমধ্যে চলছে কিনা তা পরীক্ষা করার জন্য আমার সাধারণত আমার স্ক্রিপ্টগুলিতে থাকে।


2

@ রোমেল-সিডের ধারণাটি বাড়িয়ে আপনি pidof|| (||) প্রক্রিয়াটি না থাকলে একটি কমান্ড চালানো এবং প্রক্রিয়াটি যদি বিদ্যমান থাকে তবে কিছু চালানো, এভাবে / তারপর / অন্য শর্তসাপেক্ষে দ্রুত তৈরি করা। উদাহরণস্বরূপ, এখানে একটি চলমান প্রক্রিয়া রয়েছে (আমার ক্রোম ব্রাউজার, যার প্রক্রিয়াটির নাম "ক্রোম") এবং অস্তিত্ব নেই এমন একটি প্রক্রিয়ার জন্য একটি পরীক্ষা। আমি 1> / dev / নাল ব্যবহার করে স্ট্যান্ডার্ড আউটপুটটি দমন করেছি যাতে এটি মুদ্রণ না করে:

$ (pidof chrome 1>/dev/null && echo "its running? ok, so am i then" ) || echo "it's not running? ok i'll run instea\
d"
its running? ok, so am i then
$ (pidof nosuchprocess 1>/dev/null && echo "its running? ok, so am i then" ) || echo "it's not running? ok i'll run\
 instead"
it's not running? ok i'll run instead
$

1

"সরল" সমাধানগুলির কোনওটিই আমার পক্ষে কার্যকর হয়নি কারণ আমার যে বাইনারিটি পরীক্ষা করতে হবে তা সিস্টেম-ওয়াইড ইনস্টলড নয়, তাই আমাকে পথটি যাচাই করতে হবে, যার পরিবর্তে ps -ef | grepপদ্ধতির ব্যবহার প্রয়োজন :

app="$_sdir/Logic 1.2.18 (64-bit)/Logic"

app_pid=`ps -ef | grep "$app" | awk '{print $2}'`

if `ps -p $app_pid > /dev/null`; then
    echo "An instance of logic analyzer is appear to be running."
    echo "Not starting another instance."
    exit 5
else
    nohup "$app" &> /dev/null &
fi

0

আপনার সমস্যার জন্য আমার মনে যে প্রথম জিনিসটি এসেছে:
ps aux | grep -i abcপ্রক্রিয়াটি চলমান থাকলে তার বিশদ প্রদর্শন করবে। আপনি লাইন বা সময়ের সংখ্যার সাথে এটির চলমান এবং শূন্য বা অন্য কোনও হেরফেরের সাথে তুলনা করতে পারেন। আপনি উপরের কমান্ডটি চালানোর সময় এটি আপনাকে আউটপুটে অন্ততপক্ষে এক লাইন প্রদর্শন করবে যেমন থি গ্রেপ কমান্ড দ্বারা নির্মিত প্রক্রিয়া সম্পর্কে বিশদ .. সুতরাং এটির যত্ন নিন care
এটি একটি সহজ হ্যাক হিসাবে করা উচিত। এটিকে ব্যাশ স্ক্রিপ্টে রাখুন এবং দেখুন এটি কার্যকর কিনা।


0

ব্যবহার start-stop-daemon:

/sbin/start-stop-daemon --background --make-pidfile --pidfile /tmp/foo.pid -S --startas /usr/bin/program -- arg1 arg2

এটি সাধারণ ব্যবহারকারী হিসাবে কাজ করে।


0

আমি দেখতে পেয়েছি যে @ জন ভ্রাবানাক পোস্ট করা গৃহীত উত্তরগুলি আমার পক্ষে কাজ করে না, এবং @ গিরাহা পোস্ট করা উত্তরটি মূল প্রশ্নের উত্তর দেয় না।

জন ভারবানাকের সমাধানটি পিএইচপি প্রক্রিয়া আমার জন্য চলছে কিনা তা খতিয়ে দেখার জন্য কাজ করে না, আমি সেন্টোস 7 চালাচ্ছি।

@ গিরিহের জবাব কেবল নিশ্চিত করে যে অন্যটি শুরু করার আগেই ইতিমধ্যে কোনও দৃষ্টান্ত চলছে না। এটি মূল প্রশ্ন ছিল না, আসল প্রশ্নটি ছিল কোনও প্রক্রিয়া চলছে কিনা তা যাচাই করা।

আমার জন্য যা কাজ করেছে তা এখানে:

বলুন আমার প্রক্রিয়াটির প্রক্রিয়াটির নামটিতে "জেন" স্ট্রিং ছিল। এটি চলমান আছে কি না তা খুঁজে পাবে। এটি বেস এবং পিএইচপি স্ক্রিপ্টগুলির জন্য কাজ করে।

ps -aux | grep "[J]ane" > /dev/null 2>&1
if [[ "$?" == "0" ]]; then
    echo "It's running"
else
    echo "It's not running"
fi

1
আহ, পাশাপাশি এটি একটি উবুন্টু প্রশ্নোত্তরের সাইট এটি অবাক হওয়ার মতো কিছু নয় যে এখানে কিছু উত্তর সেন্টোস on এ কাজ করে না কারণ লিনাক্স এখানে অফ-টপিকের। লিনাক্সের অন্যান্য সংস্করণগুলি ইউনিক্স.সটাকেক্সচেঞ্জ ডটকম
এল্ডার

যদিও উত্তরের লেখক সেন্টোস ব্যবহার করেছেন তবে এই উত্তরটি এখনও উবুন্টুর জন্য বৈধ।
ফিলিপ -জায়ান কে লি- স্টকম্যান

0
## bash

## function to check if a process is alive and running:

_isRunning() {
    ps -o comm= -C "$1" 2>/dev/null | grep -x "$1" >/dev/null 2>&1
}

## example 1: checking if "gedit" is running

if _isRunning gedit; then
    echo "gedit is running"
else
    echo "gedit is not running"
fi

## example 2: start lxpanel if it is not there

if ! _isRunning lxpanel; then
    lxpanel &
fi

## or

_isRunning lxpanel || (lxpanel &)

দ্রষ্টব্য : pgrep -x lxpanelবা pidof lxpanelএখনও জানা গেছে যে lxpanelএটি ডিফল্ট (জম্বি) থাকা অবস্থায়ও চলছে; তাই জীবিত ও চলমান প্রক্রিয়াটি পেতে আমাদের ব্যবহার করা দরকার psএবংgrep


-1

২৩ সেপ্টেম্বর ২০১ 2016, পিগ্রেপ মুরুর স্ক্রিপ্টটির কাজ করার জন্য "-x" বিকল্পের প্রয়োজন বলে মনে হচ্ছে।

#!/bin/bash

if pgrep -x "conky" > /dev/null 2>&1
then
  echo "conky running already"
else
  echo "now starting conky"
  conky
fi
exit 0

আমি উপরের স্ক্রিপ্টটি একটি উবুন্টু 16.04.1 মেশিনে চেষ্টা করেছি এবং পরীক্ষা করেছি। উপভোগ করুন!


-1
#!/bin/bash
while [ true ]; do     # Endless loop.
  pid=`pgrep -x ${1}`  # Get a pid.
  if [ -z $pid ]; then # If there is none,
    ${1} &             # Start Param to background.
  else
    sleep 60           # Else wait.
  fi
done

1
উবুন্টুকে জিজ্ঞাসা করুন স্বাগতম! আমি এই উত্তরটি সম্পাদনা করার প্রস্তাব দিচ্ছি এটি কী করে সে সম্পর্কে সুনির্দিষ্ট বিবরণ সহ এটি প্রসারিত করতে ing (আরও দেখুন আমি কীভাবে একটি ভাল উত্তর লিখব? আস্কউবুন্টুতে কী ধরণের উত্তরগুলি সবচেয়ে মূল্যবান বলে মনে করা হয় সে সম্পর্কে সাধারণ পরামর্শের জন্য))
ডেভিড ফোরস্টার

-3

isProcessRunning () {if [$ (pidof $ 1)> / dev / null]; তারপরে retval = 'সত্য'; else retval = 'false'; ফাই; প্রতিধ্বনি $ retval; }

#ProcessRunning ভূত

সত্য

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