পিআইডি চলছে কিনা তা যাচাই করার উপযুক্ত উপায় কী?


12

আমার একটি .pidফাইল রয়েছে এবং প্রক্রিয়াটি চলছে কিনা তা আমার খতিয়ে দেখার দরকার। এখন পর্যন্ত আমি দুটি বিকল্প খুঁজে পেয়েছি

kill -0 `cat something.pid`

যা পিডটি চালু না থাকলে কোনও ত্রুটি ছাপায়। আমি জানি /dev/nullযে এটিতে পুনঃনির্দেশিত করা যেতে পারে , তবে এটি আমাকে ভাবায় যে এটি সর্বোত্তম সমাধান নয়।

দ্বিতীয় সমাধানটি psহ'ল এটি ব্যবহার করা হবে যা এসটিডিআউটে প্রিন্ট করে

ps -ef `cat something.pid`

আউটপুটটিকে পুনঃনির্দেশ করা /dev/nullএবং কেবল ফিরে আসা স্থিতি কোডটি ব্যবহার করা কি স্বাভাবিক , বা এটি কি আমি কিছু ভুল করছি এবং আমার একটি পৃথক কমান্ডের প্রয়োজন তা সাইন ইন?


5
kill -0এটি স্ট্যান্ডার্ড (POSIX) - অনুবর্তী হিসাবে ব্যবহার করুন ।
Anders

সম্পর্কিত: stackoverflow.com/questions/3043978/...
wisbucky

উত্তর:


10

বেশিরভাগ লিনাক্স ডিস্ট্রোজের জন্য / প্রোক / {পিড ume গণনা করা চলমান প্রক্রিয়াগুলি সম্পর্কে তথ্য প্রাপ্ত করার একটি ভাল উপায় এবং সাধারণত "পিএস" এর মতো ব্যবহারকারী স্থান কমান্ডগুলি কার্নেলের সাথে যোগাযোগ করছে। সুতরাং উদাহরণস্বরূপ আপনি করতে পারেন;

[ -d "/proc/${kpid}" ] && echo "process exists" || echo "process not exists"

সম্পাদনা: আপনার কেপিড সেট করা আছে তা যাচাই করা উচিত তবে এটি আরও কার্যকর কারণ এটি আনসেট না করে exists exists কেপিড}

[ -n "${kpid}" -a -d "/proc/${kpid}" ] && echo "process exists" || echo "process not exists"

@ স্টেভমাস্টার এটি উত্তরটি লিনাক্স-নির্দিষ্ট করে তুলবে। ওএসএক্সে কোনও / প্রোক নেই। এবং আমি মনে করি বিএসডি তে কোনও / প্রোক নেই।
ছাই

এটির সাথে নোটটি আপনার অবশ্যই ${kpid}বিদ্যমান রয়েছে তা নিশ্চিত করতে হবে
উইল্ফ

@ উইলফ আমি এটি সম্পাদনা করেছি, তাই এটি আনসেট না করে "{কেপিড}
টম এইচ

ধন্যবাদ - আমি একটি স্ক্রিপ্ট করছিলাম যা একই পদ্ধতি ব্যবহার করে একটি পিআইডি চেক করে এবং আমি এই সমস্যাটি না পাওয়া পর্যন্ত এটি কার্যকর হয়নি :)
উইলফ

6

অ্যান্ডারস যেমন উল্লেখ করেছেন, আপনার kill -0পসিক্স সম্মতির জন্য ব্যবহার করা উচিত ।

লিনাক্স সিস্টেমগুলিতে, আপনি / proc ফাইল সিস্টেমে কোনও ফাইলের অস্তিত্ব পরীক্ষা করতে পারেন, যেমন,

-f /proc/$(cat something.pid)/status

1

যদি এটি কোনও স্ক্রিপ্টে থাকে (যা আমি ধরে নিচ্ছি যে আপনি স্টাডাউট মুদ্রণের বিষয়ে উদ্বিগ্ন হয়ে আছেন) তবে আপনি কীভাবে এটি করতে পারেন তা নীচে হবে:

if ps -p $(cat something.pid) > /dev/null 2>&1
then
    kill $(cat something.pid)
else
    # Deal with the fact that the process isn't running
    # i.e. clear up the pid file
fi

ps -pPID something.pid উল্লেখিত সঙ্গে একটি প্রক্রিয়ার জন্য সৌন্দর্য ( $()সিনট্যাক্স ব্যাকটিক সামান্য নতুন সংস্করণ। ব্যাকটিক কিছু পরিস্থিতিতে নতুন ফর্ম নেই পলায়নের প্রয়োজন)। 2>&1পুনঃনির্দেশ পাশাপাশি যে কমান্ড জন্য stderr।

যদি ps -pকমান্ডটি সেই পিআইডি সহ প্রক্রিয়াটি না খুঁজে পায় তবে এটি একটি ত্রুটি> 0 দিয়ে প্রস্থান করে এবং তাই elseকার্যকর হয়। অন্যথায় killবিবৃতি। আপনি চাইলে উপরেরটি উপেক্ষা করতে পারেন:

if ! ps -p ...

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


1

এখানে কিছু বিকল্প রয়েছে:

  • আপনি যদি init-স্ক্রিপ্ট লিখছেন (যেমন রাখার মতো একটি /etc/init.d/) এবং আপনি যদি ডেবিয়ান-ভিত্তিক ডিস্ট্রো ব্যবহার করছেন তবে আপনি আরও ভাল ব্যবহার করতে পারবেন start-stop-daemon:
    # start-stop-daemon -T -p $PIDFILE -u $USER_NAME -n $NAME
    এটি চালু থাকলে আপনার প্রস্থান কোড 0 পাওয়া উচিত।
  • আপনি procpsপ্যাকেজ থেকে pgrep এবং pkill ব্যবহার করতে পারেন :
    pgrep --pidfile $PIDFILE

0

আপনার যদি পিড ফাইল থাকে তবে আপনি প্রক্রিয়াটি চলছে কিনা তা পরীক্ষা করতে pgrep ব্যবহার করতে পারেন:

    if pgrep -F something.pid; then
        echo "Running"
    else
        echo "Not running"
    fi
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.