কোনও প্রক্রিয়া চলছে কিনা তা নির্ধারণের জন্য .pid ফাইলগুলি নির্ভরযোগ্য?


11

অনেক প্রোগ্রাম যেমন sshd / var / run / এ .pid ফাইল তৈরি করে যা তাদের প্রসেস আইডি ধারণ করে। কোনও প্রক্রিয়া চলছে কিনা তা নির্ধারণের জন্য এই ফাইলগুলি নির্ভরযোগ্য? আমার অনুমান যে এই ফাইলগুলি একটি প্রক্রিয়া দ্বারা ম্যানুয়ালি তৈরি করা হয়েছিল এবং প্রোগ্রাম ক্র্যাশ হয়ে গেলে ফাইল ফাইলটিতে এখনও থাকবে।

উত্তর:


16

সহজ কথায়, না : একটি প্রক্রিয়া (যেমন একটি ডেমন) ক্র্যাশ করতে পারে এবং এর .pid ফাইল সাফ করার সময় নেই।

কোনও প্রোগ্রামের স্থিতি সম্পর্কে আরও সুনির্দিষ্ট হওয়ার কৌশল: সকেটের মতো একটি সুস্পষ্ট যোগাযোগ চ্যানেল ব্যবহার করুন। একটি ফাইলে সকেট পোর্ট লিখুন এবং supervisorপ্রক্রিয়াটি এটি সন্ধান করা উচিত।

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

রয়েছে অসংখ্য কৌশল।

একটি বিষয় মনে রাখবেন: পিআইডি ফাইলগুলি পরিচালনা করা ওএসের দায়িত্ব নয়।


1
প্রক্রিয়াটির অস্তিত্বের সাথে মিলিত পিড ফাইলের অস্তিত্ব যথেষ্ট হওয়া উচিত। প্রক্রিয়াটি বন্ধ হয়ে গেলে আপনি এটি পরীক্ষা করতে পারেন। পিআইডিগুলি পুনরায় ব্যবহার করা হয় তবে খুব প্রায়ই হয় না।
মার্কআর

2
কত ঘন ঘন পিড পুনরায় ব্যবহার করা হয় তা নির্ভর করে নির্দিষ্ট সিস্টেমের উপর নির্ভর করে। আমি দেখেছি একটি সিস্টেম কমপক্ষে প্রতিদিন পিআইডি চক্রযুক্ত ছিল। আপনাকে পিড পরীক্ষা করতে হবে, এটি একটি প্রক্রিয়া আছে এবং প্রক্রিয়াটি আপনি পিডের মালিকানা প্রত্যাশা করেছেন বলে মনে হয়।

@ এটাক: হুবহু প্রতি-সেবার কোনও মানক নেই এবং যদি তা ছিল তবে কিছু বাস্তবায়ন দ্বারা এটি খুব ভালভাবে সম্মান করা যায় না। উদাহরণস্বরূপ, আমি এমন একটি ডিমন তৈরি করতে পারি যা কোনও পিআইডি ফাইল লেখেন না এবং এর পরিচালনা আদেশগুলি থেকে কোনও পিছনের চ্যানেল ব্যবহার করতে পারেন।
jldupont

@ এটাক: দুর্ভাগ্যক্রমে, নিশ্চিত হওয়ার কোনও উপায় নেই যে পিআইডি চেক করার সময় এবং ব্যবহারের সময়কালের মধ্যে পুনরায় ব্যবহার না করে ...
সাম্ব

3

Jldupont উল্লেখ করে সঠিক যে .pid ফাইলগুলি প্রক্রিয়া চলছে কিনা তা নির্ধারণের জন্য নির্ভরযোগ্য নয় কারণ ফাইলটি ক্র্যাশ হওয়ার পরে ফাইলটি অপসারণ করা হতে পারে না।

রেসের শর্তগুলি বাদ দিয়ে, আমি প্রায়শই পিগ্রিপ ব্যবহার করি যখন আমার কোনও প্রক্রিয়া চলছে কিনা তা জানতে হবে। আমি যদি প্রয়োজনীয় মনে করি তবে .pid ফাইল (গুলি) এর বিপরীতে আউটপুটকে ক্রস-রেফারেন্স করতে পারি could


3

একটি প্রক্রিয়া আইডিযুক্ত ফাইল নির্ভরযোগ্য নয় কোনও প্রক্রিয়া চলছে কিনা তা নির্ধারণ করে না। প্রক্রিয়াটির জন্য সর্বশেষ প্রদত্ত প্রক্রিয়া আইডি বের করার জন্য এটি কেবল একটি নির্ভরযোগ্য উত্স।

আপনার যখন প্রক্রিয়া আইডি থাকে, তখন প্রক্রিয়াটি সত্যই চলমান থাকে তবে আপনাকে আরও চেক করতে হবে।

এখানে একটি উদাহরণ:

#!/usr/bin/env sh

file="/var/run/sshd.pid"
processid=$(cat /var/run/sshd.pid)

if [ ! -f ${file} ]; then
    echo "File does not exists: ${file}"
    exit 1
fi

if [ ! -r ${file} ]; then
    echo "Insufficient file persmissons: ${file}"
    exit 1
fi

psoutput=$(ps -p ${processid} -o comm=)

if [ $? == 0 ];then
    if [ ${psoutput} == "sshd" ]; then
        echo "sshd process is realy running with process id ${processid}"
        exit 0
    else
        echo "given process id ${processid} is not sshd: ${psoutput}"
        exit 1
    fi
else
    echo "there is no process runing with process id ${processid}"
    exit 0
fi

pgrep হ'ল একটি দুর্দান্ত আদেশ, তবে আপনি যখন সমস্যায় পড়বেন, তখন আপনার একাধিক ঘটনা চলবে। উদাহরণস্বরূপ, আপনি বন্দর বিভিন্ন TCP / 22 চলমান একটি নিয়মিত sshd কমান্ড আছে এবং আপনি বন্দর চলমান বিভিন্ন TCP / 2222, তারপর pgrep দুই প্রক্রিয়া আইডি যখন অনুসন্ধানের জন্য প্রদান করা হবে আরেকটি sshd কমান্ড আছে sshd কমান্ড ... যখন স্বাভাবিক sshd কমান্ড / var তার PID আছে /run/sshd.pid এবং অন্যটির /var/run/sshd-other.pid তে এর পিড থাকতে পারে আপনি প্রক্রিয়াগুলি পরিষ্কারভাবে আলাদা করতে পারবেন।

আমি কেবল পিএস ব্যবহার করার পরামর্শ দিচ্ছি না , গ্রেপ এবং গ্রেপ-ভি দিয়ে এক বা একাধিক পাইপ দিয়ে পাইপিং করা অন্য সমস্ত জিনিস যা আপনার আগ্রহী না তা ফিল্টার করার চেষ্টা করছে ... এটি ব্যবহার করার মতো কিছুটা

find . | grep myfile

যদি কোন ফাইল প্রস্থান করে, তা বের করতে।


2

ফাইলটিতে থাকা একই পিডের সাথে কেবল কোনও প্রক্রিয়াটির অস্তিত্ব পরীক্ষা করা নির্ভরযোগ্য নয়।

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


1

জাল্ডুপন্ট সঠিক।

প্রক্রিয়াটি এখনও বেঁচে আছে কি না তা দেখতে আপনি প্রসেসটিকে 0 টি সিগন্যাল (কিল-এস 0 পিড) প্রেরণ করতে পারেন (ধরে নিলেন যে এই জাতীয় সংকেত পাঠানোর অধিকার আপনার রয়েছে - সাধারণভাবে, কেবলমাত্র কোনও প্রক্রিয়ার মালিক প্রেরণ করতে পারেন এটি একটি সংকেত)।


4
তবে সেই পিআইডি দিয়ে কোনও প্রক্রিয়াটির অস্তিত্বের জন্য যাচাই করার অর্থ এই নয় যে এটি আপনার আগ্রহী পিআইডি।
জানম

0

আমি জেসমিয়ারের সাথে একমত

কিছু সিস্টেমে আপনি পিগ্রেপ অ্যাক্সেস পাবেন না। এই জাতীয় ক্ষেত্রে, ps -aef | grep <pid>প্রক্রিয়াটি আসলেই চলছে কিনা তা খুঁজে পেতে আপনি যা করতে পারেন।


1
প্রশ্নের মূল বিষয়টি ছিল "নির্ভরযোগ্য"। একটি PS করা এবং পিআইডি সন্ধান করা নির্ভরযোগ্য নয়।
জানম

ভাল ... ধরে নিচ্ছি যে আপনি প্রোগ্রামটির সেই নামটি জানেন, আপনি কেন PS -aef বলে মনে করেন গ্রেপ অবিশ্বাস্য?
ব্যবহারকারী 29584

3
রেসের শর্তসমূহ: পিএস শেষ হওয়ার সাথে সাথে সিস্টেমের অবস্থা পরিবর্তন হয়েছে। প্রক্রিয়া শিরোনাম: আপনার আগ্রহী ব্যক্তির সাথে অন্য প্রক্রিয়াটির অনুরূপ শিরোনাম থাকতে পারে Multi একাধিক উদাহরণ: একই সিস্টেমের দুটি উদাহরণ সহ একটি পিআইডি ফাইল সহ একটি সিস্টেম বিবেচনা করুন। একটি ব্যর্থ হয়, এবং অন্যটি পুনরায় চালু হয় এবং প্রথম পরিষেবার পিআইডি পায়। কীভাবে বলবেন? ইত্যাদি নির্ভরযোগ্য নয়, জাতির অবস্থার কারণে সঠিকভাবে পাওয়া অসম্ভব এবং নির্ভরযোগ্য কৌশলগুলি রয়েছে যা কেবলমাত্র কার্যকর। একটি নির্ভরযোগ্য বিকল্পের জন্য দেখুন, উদাহরণস্বরূপ, cr.yp.to/daemontools.html
janm
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.