কোনও প্রক্রিয়া ইতিমধ্যে ব্যাকগ্রাউন্ডে চলছে কিনা তা পরীক্ষা করার উপায় (এবং তার ভিত্তিতে পুনরায় কার্যকরকরণ এড়িয়ে যাওয়া)?


11

প্রক্রিয়াটি ইতিমধ্যে চালু না থাকলে (পটভূমিতে) আমি কি কোনও বাশ কমান্ড লাইন তৈরি করতে পারি যা কেবলমাত্র একটি নির্দিষ্ট কমান্ড চালায়?

কোনও কমান্ড ইতিমধ্যে চালু থাকলে আমি কীভাবে * পরীক্ষা করব?

(সুতরাং আমি &&তাদের মধ্যে পরবর্তী কমান্ডটি যুক্ত করতে পারি তাই প্রথমটি সত্য হলে পরবর্তীটি কেবলমাত্র কার্যকর করে)।

*: পরীক্ষা, নির্ধারণ, আবিষ্কার, অনুসন্ধান


3
ps -ef | grep -v grep | grep "process_name" || run_command_here
রাহুল পাতিল

1
@ রাহুলপাতিল আপনি কেবল pgrep "process_name"পরিবর্তে ব্যবহার করতে পারেনps | grep | grep
রাশ

হুম, আমি তা ভুলে গেছি ..: ডি
রাহুল পাতিল

1
আপনি কেন "লক" ফাইলটি ব্যবহার করবেন না এবং আপনি যখন দ্বিতীয়বার লঞ্চ করবেন তখন লক ফাইলটি অদৃশ্য হয়ে গেলে এটি কেবল চালু হবে।
বিটসঅফনিক্স

কোনও প্রক্রিয়া রয়েছে কিনা তা যাচাই করার সর্বোত্তম উপায়: stackoverflow.com/questions/3043978/…
ট্রেভর বয়েড স্মিথ

উত্তর:


6

3

আমি সময়ে সময়ে এই কৌশলটি ব্যবহার করেছি:

$ pgrep <process name> || <process name>

আগে pgrepএটি আগে এইভাবে করা হত:

$ ps -eaf | grep -q <[p]rocess name> || <process name>

উদাহরণ

বিটগুলির সাথে বিট এটি [p]তৈরি করে যাতে grepফলস্বরূপ এটি নিজেকে খুঁজে না।

$ ps -eaf | grep -q [s]leep || sleep 10

2

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

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

দৃষ্টান্তগুলি পরিচালনা করা সহজ যখন এগুলি সমস্ত একই তত্ত্বাবধায়ক প্রক্রিয়া দ্বারা শুরু করা হয় এবং তদারকির প্রক্রিয়া সনাক্ত করে যখন দৃষ্টান্তগুলি মারা যায় এবং তদনুসারে প্রতিক্রিয়া জানায়। অনেক পরিষেবা নিরীক্ষণ প্রোগ্রাম যা এটি করতে পারে।

প্রোগ্রামটি যদি কোনও পরিচিত যোগাযোগের শেষ পয়েন্টে সাড়া না দেয় এবং এটি কোনও তত্ত্বাবধায়ক প্রোগ্রাম দ্বারা পরিচালিত না হয় তবে দরিদ্র লোকটির ট্যাগটি একটি পিডফিল: প্রক্রিয়া আইডিযুক্ত একটি ফাইল। আপনি প্রক্রিয়াটি শুরু করার সময়, পূর্বনির্ধারিত নাম সহ কোনও ফাইলে পিডটি লিখুন। আপনার যখন প্রক্রিয়াটি বিদ্যমান থাকার প্রয়োজন হবে তখন পিডফিলটি পড়ুন এবং দেখুন এই পিডের সাথে কোনও প্রক্রিয়া আছে কিনা। আপনি প্রক্রিয়াটি মারলে, পিডফিলটি মুছুন। আনসারভিজড পিডফাইলে সবচেয়ে স্পষ্ট সমস্যা হ'ল যদি প্রক্রিয়াটি মারা যায় তবে এর পিডটি কিছু সম্পর্কযুক্ত প্রক্রিয়া দ্বারা পুনরায় ব্যবহার করা যেতে পারে। আপনি সঠিক প্রক্রিয়াটির সাথে কথা বলছেন তা নিশ্চিত করার জন্য আপনার অন্তত প্রক্রিয়াটির নাম বা কার্য সম্পাদনযোগ্য পরীক্ষা করা উচিত। অনেকগুলি ইউনিক্স ভেরিয়েন্টে একটি পিগ্রিপ কমান্ড রয়েছে:pgrep SOMENAME "প্রসেস নাম" এর বিভিন্ন সম্ভাব্য ধারণাগুলিগুলির মধ্যে কোনটি ব্যবহৃত হয় তা পরিবর্তন করতে কোনও নির্দিষ্ট ব্যবহারকারীর সীমাবদ্ধ করার জন্য অতিরিক্ত বিকল্প সহ, যার নামের মধ্যে একটি সংক্ষেপ হিসাবে SomeNAME রয়েছে সেই প্রক্রিয়াগুলি তালিকাবদ্ধ করে etc.


1

আপনি এই পদ্ধতির ব্যবহার করতে পারেন:

if [[ -z $(ps -C appname -opid=) ]]; then
    appname && secondapp
fi

1

অন্যান্য অপশন:

  • pgrep -xq processname
    • শুধুমাত্র জিএনইউ / লিনাক্সের প্রথম 15 টি অক্ষরের সাথে মেলে
    • ওএস এক্স-এ পূর্বপুরুষদের অন্তর্ভুক্ত করবেন না
  • ps -eo comm= | sed 's|.*/||' | grep -xq processname
    • শুধুমাত্র জিএনইউ / লিনাক্সের প্রথম 15 টি অক্ষরের সাথে মেলে
    • sed 's|.*/||' ওএস এক্সের ডায়ারনেম অংশগুলি সরিয়ে দেয়

জিএনইউ / লিনাক্সে ps -o commকমান্ডের নামগুলি 15 টি অক্ষরে ছিন্ন করা হয় pgrepএবং ps -Cকেবল প্রথম 15 টি অক্ষরের সাথে মেলে।

ps -C (ম্যাচের কমান্ডের নামগুলি) ওএস এক্সে সমর্থিত নয়।

ওএস এক্সে ps -o commকমান্ডের পরম পাথগুলি মুদ্রণ করে এবং ps -co commকেবল কমান্ডের নাম মুদ্রণ করে। জিএনইউতে ps -o commকেবল কমান্ডের নাম মুদ্রিত হয় এবং -cএর আলাদা অর্থ রয়েছে।

ওএস এক্স-এর pgrep এ পূর্বপুরুষ প্রক্রিয়াগুলি (যেমন ব্যাশ, টার্মিনাল বা লঞ্চ করা হয়নি) অন্তর্ভুক্ত নয় -a। GNU এর pgrep এগুলিকে ডিফল্টরূপে অন্তর্ভুক্ত করে এবং এটি সমর্থন করে না -a

grep -xএবং pgrep -xবোঝাবেন না -F, তাই -Fxযদি প্রক্রিয়াটির নামটিতে রেজেক্স অক্ষর থাকতে পারে তবে ব্যবহার করুন ।


-সি আমার সাইগউইনেও উপলভ্য নয় :)
n611x007

1

আমি দুঃখিত তবে এই সমস্ত সমাধানগুলি কনট্যাবকে সমর্থন করে না কারণ একই কমান্ড লাইন 'পিএস' ফলাফলটিতে দু'বার প্রদর্শিত হবে।

সুতরাং এখানে আমার:

## Test pour voir si le même script tourne déjà
## Un fichier .pid est utilisé pour stocké le numéro de process
## Si le pid est en train de tourner alors on sort.
lock_file=$0".pid"
[ -r $lock_file ] && read pid <$lock_file
if [ "$pid" -gt 1 ] && [ `ps --no-headers -p "$pid" | wc -l` -gt 0 ] ; then
    echo "WARNING : le process $pid tourne deja : $0"
    ps -edf | grep `basename $0` | grep -v grep
    echo "WARNING : Arrêt de cette instance ($$)."
    exit 7
fi
echo $$ >$lock_file

তুমি কিসের জন্য দুঃখিত? কনট্যাব কী? আপনি কি কোনও cronকাজের মধ্যে থেকে চেক করতে চান ?
অ্যান্থন

0

বাশ সহ

#!/usr/bin/env bash

[[ $# -eq 0 ]] && { echo -e "Usage:\t\t $0 <Process_name>  <Command here>"; exit 1;  }

ifnotrun(){
        local p=$1
        if ! ps -C "$1" -opid=
        then
                cmd=($@)
                echo ${cmd[@]:1}
        else
                echo "Process \"$p\" Already Running.."
                exit 1
        fi

}

ifnotrun $*

দ্রষ্টব্য: - echoআউটপুট ঠিক আছে কিনা তা সরিয়ে ফেলুন ।


0

আপনি যে কমান্ডটি বেকগ্রিডে চালাচ্ছেন সে বিষয়ে আমি ব্যাখ্যা করব। ""! " শেষ পটভূমি প্রসেসের পিআইডি সংরক্ষণ করুন। সুতরাং, আপনি উপরের উত্তরগুলি অনুসরণ করে প্রসেস টেবিলগুলিতে এটি সন্ধান করতে এটি ব্যবহার করতে পারেন:

sleep 4 &
ps -ef | grep -w  $!  ...

বিল্টিন কমান্ড "কাজ" - এটি চেষ্টা করুন:

sleep 4&
J=`jobs`
while [ "$J" ]; do
        sleep 1
        jobs # This line flush the jobs' bufer.
        J=`jobs`
done

"&&" বিকল্পটি সম্পর্কিত

&& এর পরিবর্তে অপেক্ষা কমান্ডটি ব্যবহার করুন। নিম্নলিখিত উদাহরণে মাইপ্রোক 2 শেষ হবে না যতক্ষণ না মাইপ্রোক 1 শেষ হবে:

myproc1 &
wait
myproc2

0

আপনার প্রক্রিয়া অবস্থা পান:

ps -lp $(pgrep <YOUR_PROCESS_NAME>) | tail -1 | awk '{print $11}'

রেফারেন্স:

D    uninterruptible sleep (usually IO)
R    running or runnable (on run queue)
S    interruptible sleep (waiting for an event to complete)
T    stopped, either by a job control signal or because it is being traced
W    paging (not valid since the 2.6.xx kernel)
X    dead (should never be seen)
Z    defunct ("zombie") process, terminated but not reaped by its parent

উদাহরণস্বরূপ, আমি এটি শর্তসাপেক্ষে টিএমউक्स সেশনে আমার সোেক্স প্রক্রিয়াটি খেলতে বা বিরতিতে ব্যবহার করেছি:

/usr/local/bin/tmux if-shell -t sox "[ $(ps -lp $(pgrep sox) | tail -1 | awk '{print $11}') == 'T' ]" \
  'send -t sox "fg" Enter' \
  'send -t sox C-z'

-1

আপনি এটি কোনও স্ক্রিপ্টের মধ্যে ব্যবহার করতে পারেন:

if [ `ps -ef | grep "script.sh" | grep -v grep | wc -l` -gt 1 ] ; then
echo "RUNNING...."
else
echo "NOT RUNNING..."
fi
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.