কোনও প্রক্রিয়া চলছে কিনা তা আমি কীভাবে নির্ধারণ করতে পারি এবং তারপরে বাশ স্ক্রিপ্টটি সেই শর্তের উপর ভিত্তি করে কিছু স্টাফ চালায়?
উদাহরণ স্বরূপ:
যদি প্রক্রিয়া
abc
চলমান থাকে তবে এটি করুনযদি এটি চলমান না থাকে তবে এটি করুন।
কোনও প্রক্রিয়া চলছে কিনা তা আমি কীভাবে নির্ধারণ করতে পারি এবং তারপরে বাশ স্ক্রিপ্টটি সেই শর্তের উপর ভিত্তি করে কিছু স্টাফ চালায়?
উদাহরণ স্বরূপ:
যদি প্রক্রিয়া abc
চলমান থাকে তবে এটি করুন
যদি এটি চলমান না থাকে তবে এটি করুন।
উত্তর:
এর মতো কিছু করার জন্য একটি বাশ স্ক্রিপ্টটি এর মতো দেখতে লাগবে:
#!/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
/dev/null
: "/ dev / null কমান্ড স্ট্যান্ডার্ড আউটপুটটিকে নাল ডিভাইসে পুনঃনির্দেশ করে, যা একটি বিশেষ ডিভাইস যা এতে লেখা তথ্যকে অস্বীকার করে" ... ব্যবহার 0
করে কমান্ড আউটপুটটিকে ডেকে আনা একটি ফাইলে পুনঃনির্দেশিত করে 0
। এই ক্ষেত্রে, আমি আরও আরামদায়ক হওয়ার পরামর্শ দিচ্ছি > /dev/null
- আপনি এটি সর্বত্র দেখতে পাবেন, কারণ এটি আউটপুট বাতিল করার আদর্শ / যথাযথ উপায়।
-x
প্যারামিটারটি যুক্ত করুন pgrep
যাতে এটি সঠিক অ্যাপ্লিকেশনটির সন্ধান করছে বা অন্য কোনও অ্যাপ্লিকেশানের নামের মধ্যে একই স্ট্রিংটি খুঁজে পেলে এটি একটি মিথ্যা সঠিক পাওয়া যাবে। আমি এটি জানতে সবে মাত্র 1 ঘন্টা ব্যয় করেছি।
! pgrep
যে কোনও সমাধান যা ব্যবহার করে ps aux | grep abc
বা pgrep abc
ত্রুটিযুক্ত কিছু ব্যবহার করে ।
যেহেতু আপনি কোনও নির্দিষ্ট প্রক্রিয়া চলছে কিনা তা যাচাই করছেন না, আপনি মিলছেন এমন কোনও প্রক্রিয়া চলছে কিনা তা আপনি পরীক্ষা করছেন abc
। যে কোনও ব্যবহারকারী সহজেই একটি এক্সিকিউটেবল নামে তৈরি করতে এবং চালাতে পারেন abc
(বা abc
এটির নাম বা যুক্তি কোথাও রয়েছে ), যা আপনার পরীক্ষার জন্য একটি মিথ্যা ইতিবাচক কারণ ঘটায়। বিভিন্ন অপশন আপনার ক্ষেত্রে প্রযোজ্য হতে পারে ps
, grep
এবং pgrep
আপনাকে ধন্যবাদ, কিন্তু আপনি এখনও একটি নির্ভরযোগ্য পরীক্ষা পাবেন না।
এটি আপনার যা পরীক্ষা প্রয়োজন তার উপর নির্ভর করে।
এটি আরম্ভ এবং আপস্টার্টের জন্য। তারা পরিষেবাটি শুরু করবে এবং এটির পিডটি একটি পিডফাইলে সঞ্চিত হবে তা নিশ্চিত করবে। সার্ভিসটি আবার শুরু করার চেষ্টা করুন (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 দেখুন ।
pgrep
বা ps
পুরোপুরি পর্যাপ্ত রয়েছে এবং আপনার পদ্ধতির Overkill মত মনে হয়। আপনি যদি জনসাধারণের বিতরণের জন্য কোনও স্ক্রিপ্ট লিখছেন তবে, আপনার এটি নিরাপদ পথে লেখা উচিত।
rm
কমান্ডটি চালিত হয়। সুতরাং যতক্ষণ এটি ফাঁদ সেট হয়ে যাওয়ার পরে শেষ হয় ততক্ষণ লকটি চলে।
এটি আমি ব্যবহার করি:
#!/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
এটি ব্যর্থও হবে
-x
বিকল্পটি ব্যবহার করেছেন তা নিশ্চিত করুন : "কেবলমাত্র সেই প্রক্রিয়াগুলির সাথে মেলে যাঁর নাম (বা কমান্ড লাইন যদি -f নির্দিষ্ট করা থাকে) ঠিক সেই প্যাটার্নটির সাথে মেলে।"
@ রোমেল-সিডের ধারণাটি বাড়িয়ে আপনি 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
$
"সরল" সমাধানগুলির কোনওটিই আমার পক্ষে কার্যকর হয়নি কারণ আমার যে বাইনারিটি পরীক্ষা করতে হবে তা সিস্টেম-ওয়াইড ইনস্টলড নয়, তাই আমাকে পথটি যাচাই করতে হবে, যার পরিবর্তে 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
আপনার সমস্যার জন্য আমার মনে যে প্রথম জিনিসটি এসেছে:
ps aux | grep -i abc
প্রক্রিয়াটি চলমান থাকলে তার বিশদ প্রদর্শন করবে। আপনি লাইন বা সময়ের সংখ্যার সাথে এটির চলমান এবং শূন্য বা অন্য কোনও হেরফেরের সাথে তুলনা করতে পারেন। আপনি উপরের কমান্ডটি চালানোর সময় এটি আপনাকে আউটপুটে অন্ততপক্ষে এক লাইন প্রদর্শন করবে যেমন থি গ্রেপ কমান্ড দ্বারা নির্মিত প্রক্রিয়া সম্পর্কে বিশদ .. সুতরাং এটির যত্ন নিন care
এটি একটি সহজ হ্যাক হিসাবে করা উচিত। এটিকে ব্যাশ স্ক্রিপ্টে রাখুন এবং দেখুন এটি কার্যকর কিনা।
ব্যবহার start-stop-daemon
:
/sbin/start-stop-daemon --background --make-pidfile --pidfile /tmp/foo.pid -S --startas /usr/bin/program -- arg1 arg2
এটি সাধারণ ব্যবহারকারী হিসাবে কাজ করে।
আমি দেখতে পেয়েছি যে @ জন ভ্রাবানাক পোস্ট করা গৃহীত উত্তরগুলি আমার পক্ষে কাজ করে না, এবং @ গিরাহা পোস্ট করা উত্তরটি মূল প্রশ্নের উত্তর দেয় না।
জন ভারবানাকের সমাধানটি পিএইচপি প্রক্রিয়া আমার জন্য চলছে কিনা তা খতিয়ে দেখার জন্য কাজ করে না, আমি সেন্টোস 7 চালাচ্ছি।
@ গিরিহের জবাব কেবল নিশ্চিত করে যে অন্যটি শুরু করার আগেই ইতিমধ্যে কোনও দৃষ্টান্ত চলছে না। এটি মূল প্রশ্ন ছিল না, আসল প্রশ্নটি ছিল কোনও প্রক্রিয়া চলছে কিনা তা যাচাই করা।
আমার জন্য যা কাজ করেছে তা এখানে:
বলুন আমার প্রক্রিয়াটির প্রক্রিয়াটির নামটিতে "জেন" স্ট্রিং ছিল। এটি চলমান আছে কি না তা খুঁজে পাবে। এটি বেস এবং পিএইচপি স্ক্রিপ্টগুলির জন্য কাজ করে।
ps -aux | grep "[J]ane" > /dev/null 2>&1
if [[ "$?" == "0" ]]; then
echo "It's running"
else
echo "It's not running"
fi
## 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
২৩ সেপ্টেম্বর ২০১ 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 মেশিনে চেষ্টা করেছি এবং পরীক্ষা করেছি। উপভোগ করুন!
#!/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
zombie
প্রসেসের মতো একটি প্রোগ্রামের বিভিন্ন রাজ্যে আটকে রেখেছিল (আমি "চলমান" প্রক্রিয়া হিসাবে কী বর্ণনা করব না)। কি এর একটি পূর্ণ তালিকাSTAT
কলাম মূল্যবোধ, আউটপুট মধ্যেps
, তার ইঙ্গিত দেয় এখানে আনত সেই উত্তর যে এই accommodates লিখুন, অথবা নিজেদের সম্পাদনা করার জন্য।