কোনও সরঞ্জাম ইতিমধ্যে কার্যকর হয়েছে কিনা তা সনাক্ত করুন তবে কেবলমাত্র বর্তমান ব্যবহারকারীর জন্য


8

এখন অবধি ব্যবহার করেছি

pidof -o %PPID -x "my-tool"

আমার-সরঞ্জামটির অবশেষে চলমান দৃষ্টান্তের পিড সনাক্ত করতে।

এটি আমার-সরঞ্জাম ফাইলটির একটি সংক্ষিপ্ত সংস্করণ, একটি এক্সিকিউটেবল বাশ স্ক্রিপ্ট

#!/bin/bash 

if pidof -o %PPID -x "my-tool"; then
   echo "Already running"
   exit 1
fi

 ... if not running go on 

তবে এখন আমাকে প্রতি মেশিনে একক উদাহরণ এবং মেশিনে একাধিক অনুমতি দেওয়ার দরকার রয়েছে , যাতে আমাদের একই মুহুর্তে 100 টি আমার-সরঞ্জাম চলতে পারে তবে ব্যবহারকারী প্রতি 1 জনই থাকতে পারে।

নোট করুন যে সিঙ্গলটনের মতো কিছু তৈরি করার জন্য আমার একটি পরীক্ষা দরকার। যদি সরঞ্জামটি শুরু হয়ে যায় এবং অন্য কোনও দৃষ্টান্ত চলমান থাকে তবে এটি নিজেই বন্ধ হয়ে যাবে।

সংক্ষেপে: আমার প্রয়োজন যে কোনও ব্যাশ স্ক্রিপ্টটি সনাক্ত করতে পারে যে এটি ইতিমধ্যে বর্তমান ব্যবহারকারীর জন্য চলছে এবং এই ক্ষেত্রে এটি অবশ্যই প্রস্থান করা উচিত।

কিভাবে ?


আপনার ব্যবহার করা উচিত নয় pidof, আরও ভাল সরঞ্জাম মিথ্যা রয়েছেpgrep
বিড়াল

উত্তর:


12

pgrepপরিবর্তে ব্যবহার করুন:

pgrep -cxu $USER -f my-tool

ব্যবহৃত বিকল্পগুলি হ'ল:

   -c, --count
          Suppress  normal  output; instead print a count of matching pro
          cesses.  When count does not match anything, e.g. returns  zero,
          the command will return non-zero value.
   -x, --exact
          Only match processes whose names (or command line if -f is spec
          ified) exactly match the pattern.
   -u, --euid euid,...
          Only match processes whose effective user ID is listed.   Either
          the numerical or symbolical value may be used.

আপনি যদি এটি কোনও ব্যাশ স্ক্রিপ্টে ব্যবহার করতে চান যা এটি ইতিমধ্যে চলমান কিনা তা পরীক্ষা করে দেখে আপনি ব্যবহার করতে পারেন $0। এটি বর্তমান স্ক্রিপ্টের (যেমন /home/username/bin/foo.sh) পথে প্রসারিত হয় তবে আমাদের কেবল প্রয়োজন foo.sh। পেতে, আমরা সবকিছু শেষ পর্যন্ত অপসারণ করতে পারেন /ব্যবহার ব্যাশ এর স্ট্রিং ম্যানিপুলেশন সরঞ্জাম : ${0##*/}। এর অর্থ আমরা এর মতো কিছু করতে পারি:

## If there are more than 1 instances of the current script run
## by this user
if [[ $(pgrep -cxu "$USER" "${0##*/}") -gt 1 ]];
then
        echo "Script already running, exiting."
        exit
fi

আপনি এর জন্য লকফিলগুলি ব্যবহার করার বিষয়টিও বিবেচনা করতে পারেন:

## If the lock file exists
if [ -e /tmp/$USER.foo.lock ]; then
    ## Check if the PID in the lockfile is a running instance
    ## of foo.sh to guard against crashed scripts
    if ps $(cat /tmp/$USER.foo.lock) | grep foo.sh >/dev/null; then
        echo "Script foo.sh is already running, exiting"
        exit
    else
        echo "Lockfile contains a stale PID, continuing"
        rm /tmp/$USER.foo.lock 
    fi
fi
## Create the lockfile by printing the script's PID into it
echo $$ > /tmp/$USER.foo.lock

## Rest of the script here

## At the end, delete the lockfile
rm /tmp/$USER.foo.lock


1
পরিবর্তে touch /tmp/$USER.foo.lockআমি প্রক্রিয়াটির পিআইডি ব্যবহার করব echo $$ >/tmp/$USER.foo.lockতারপরে এই জাতীয় প্রক্রিয়াটি আসলে রয়েছে কিনা তা পরীক্ষা করার জন্য যুক্তি যুক্ত করা যেতে পারে।
মন্টি হার্ডার

@ মন্টিহার্ডার আসলেই খুব ভাল পরামর্শ। উত্তর সম্পাদিত, ধন্যবাদ।
টায়ডন

@ ইটারডন, মোবাইল নিয়ে সমস্যা ছিল, পরবর্তী মন্তব্যটি মুছে ফেলল। আমি এর $(< pidfile)পরিবর্তে বলতে চাইছি $(cat pidfile)
sdkks

7

pgrepকোনও নির্দিষ্ট ব্যবহারকারীর দ্বারা কোনও প্রক্রিয়া চালিত হচ্ছে কিনা তা আপনি খুঁজে পেতে পারেন এবং তারপরে ব্যবহারকারী যদি ইতিমধ্যে চালু না থাকেন তবে প্রক্রিয়াটি শুরু করতে পারেন:

#!/bin/bash
if pgrep -u "$USER" my-tool &>/dev/null; then
    echo 'You already have my-tool running'
else
    /path/to/my_tool
fi

এনভায়রনমেন্ট ভেরিয়েবল,, $USERবর্তমানে লগইন হওয়া ব্যবহারকারী অর্থাৎ স্ক্রিপ্টটি ব্যবহারকারী ব্যবহারকারী পর্যন্ত প্রসারিত হবে। যেহেতু আমরা কেবল my-toolএটি চালাচ্ছি কি না তাতে আগ্রহী, সুতরাং কেবল ifনির্মানের সাথে সরাসরি নির্মানের স্থিতি ব্যবহার করা যথেষ্ট।

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


আমি একটি মোড়ক, দীর্ঘ ইতিহাস তৈরি করতে পারি না ... আমি কীভাবে বর্তমান প্রক্রিয়া পিআইডি বাদ দিতে পারি?
রিয়েলটিবো

@ রিলতেবো উম্মম .. পিআইডি অর্থ অন্তর্ভুক্ত করবেন?
হিমেইল

2

এই স্নিপেট দিয়ে এটি ব্যবহার করে দেখুন:

#!/bin/bash
MyProcessName=$(ps -p $$ -o args=)
Mypid=$$
AllPids=$(pgrep -fu "$(whoami)" "$MyProcessName")
AllPids=$(tr "\n" ' ' <<<"$AllPids")
Pids=$(sed "s/$Mypid//" <<<"$AllPids")
echo "$$: Instances including itself: $AllPids"
echo "$$: Instances different from itself: $Pids"

এটি না লিখতে গুরুত্বপূর্ণ pgrep|trকারণ এটি একই নামের শেলটি কাঁটাবে।


2

আপনি একবারে কেবল একটি অনুলিপি চালাচ্ছেন তা নিশ্চিত করার জন্য আপনি ঝাঁক দৌড়ে যে কমান্ডটি চালাতে চান তা মোড়ানো করুন। ব্যবহারকারীর হোম ডিরেক্টরি গাছের মধ্যে সংরক্ষিত একটি লক_ফাইল ব্যবহার করুন যাতে প্রতিটি ব্যবহারকারীর নিজস্ব লক ফাইল থাকে। উদাহরণ স্বরূপ:

lockfile = "~/lockfile"
(
 if flock -n 200; then
    command
 else
    echo "Could not get lock $lock_file
 fi
) 200>$lock_file

'কমান্ড' কোনও বশ কমান্ড বা স্ক্রিপ্ট হতে পারে।

man flock ব্যবহারের উদাহরণ দেয়


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