কতক্ষণ একটি প্রক্রিয়া চলছে তা যাচাই করবেন?


242

আমি একটি নিরীক্ষণ অ্যাপ্লিকেশন থেকে প্রক্রিয়া চালু করে এটি করা এড়াতে চাই।

উত্তর:


311

সাথে Linux উপর psথেকে procps(-ng)(এবং সবচেয়ে অন্যান্য সিস্টেমের এই যেহেতু POSIX দ্বারা নির্দিষ্ট করা হয়):

ps -o etime= -p "$$" 

$$আপনি যে প্রক্রিয়াটির পিআইডি চেক করতে চান তা কোথায় । এটি বিন্যাসে সময় কাটবে [[dd-]hh:]mm:ss

ব্যবহারটি আপনাকে -o etimeজানায় psযে আপনি কেবল অতিবাহিত সময় ক্ষেত্রটি চান, এবং এর =শেষে প্রান্তটি হেডারটিকে দমন করে (ছাড়া, আপনি একটি লাইন পেয়েছেন যা বলে ELAPSEDএবং পরের লাইনে সময়; সাথে, আপনি সময়ের সাথে কেবল একটি লাইন পাবেন) ।

অথবা, লিনাক্সে বা ফ্রিবিএসডি 9.0 বা তার উপরের (এবং সম্ভবত অন্যরা) প্রোপক্স-এনজি টুল স্যুটের (3.3.0 বা তার বেশি) নতুন সংস্করণ সহ, ব্যবহার করুন:

ps -o etimes= -p "$$"

(যোগ করা সহ s) সময় সেকেন্ডের মতো বিন্যাস করতে, যা স্ক্রিপ্টগুলিতে আরও কার্যকর।

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

এটি এইচজেডের মান (যা প্রতি সেকেন্ডে জিফিজ) খুঁজে পেতে হাস্যকর জটিল হয়ে উঠেছে। sysinfo.cপ্রোপস প্যাকেজের মন্তব্যে, এ এ) কার্নেল শিরোনাম ফাইলটি অন্তর্ভুক্ত করতে পারে এবং একটি আলাদা কার্নেল ব্যবহার করা হলে পুনরায় কম্পাইল করতে পারে, বি) পসিক্স sysconf()ফাংশনটি ব্যবহার করে , যা দুর্ভাগ্যক্রমে, সি লাইব্রেরিতে সংকলিত একটি হার্ড-কোডেড মান ব্যবহার করে, বা গ) কর্নেলকে জিজ্ঞাসা করুন, তবে এটি করার কোনও অফিসিয়াল ইন্টারফেস নেই। সুতরাং, psকোডটিতে ক্লডেজের একটি সিরিজ রয়েছে যার মাধ্যমে এটি সঠিক মান নির্ধারণ করে। কি দারুন.

সুতরাং এটি সুবিধাজনক যা আপনার পক্ষে এটি psকরে। :)

ব্যবহারকারীর @ ৩6 @_ নোট হিসাবে, লিনাক্সে (এটি পোর্টেবল নয়), আপনি ডিরেক্টরিটি statঅ্যাক্সেস, পরিবর্তন বা স্ট্যাটাস পরিবর্তনের তারিখগুলি দেখতে /proc/$$আবার কমান্ডটি ব্যবহার করতে পারেন (যেখানে আবার $$আগ্রহের প্রক্রিয়া রয়েছে)। তিনটি সংখ্যা একই হওয়া উচিত

stat -c%X /proc/$$

যুগটি $$শুরু হওয়ার কয়েক সেকেন্ড পরে আপনাকে প্রক্রিয়াটি শুরু করার সময় দেবে । এটি এখনও আপনি যা চান তা ঠিক নয়, যেহেতু বর্তমান সময় থেকে বিয়োগ করা সময়টি বিয়োগ করার জন্য আপনার এখনও গণিতটি করা দরকার - আমার ধারণা অনুমান যে এরকম কিছু date +%s --date="now - $( stat -c%X /proc/$$ ) seconds"কাজ করবে তবে এটি কিছুটা কুরুচিপূর্ণ নয়। একটি সম্ভাব্য সুবিধা হ'ল আপনি যদি এর -c%xপরিবর্তে দীর্ঘ-ফর্ম্যাট আউটপুট ব্যবহার করেন তবে আপনি -c%Xপুরো সংখ্যা সেকেন্ডের চেয়ে বেশি রেজোলিউশন পাবেন। তবে, আপনার যদি এটির প্রয়োজন হয় তবে আপনার সম্ভবত প্রক্রিয়া-নিরীক্ষণের পদ্ধতিটি ব্যবহার করা উচিত কারণ স্ট্যাট কমান্ড চালনার সময় সঠিকতার সাথে হস্তক্ষেপ করতে চলেছে।


1
ওহে! etime=টাইপো কি ? আমি কেবল etimeম্যান পেজগুলিতেই খুঁজে পেতে পারি ।
ক্যান্ট পওয়ার

16
@ কেনটপাওয়ার এটি কোনও টাইপো নয়। খালি =শিরোনামকে দমন করে। এটি ছাড়াই চেষ্টা করুন, বা চেষ্টা করুনps -p $$ -o etime="Silly Header Here"
ম্যাটডেম

4
PS -p $ (pgrep সন্ধান) -ও ইটাইম =
মাফ্রোসিস

1
খুশী হলাম। আমি etimesনিজেকে ততটাই পছন্দ করি কারণ এটি মেশিনটি পঠনযোগ্য
আসফান্দ কাজী

1
@alexmurray যে কেবল কল করে sysconf()এবং তাই আপনাকে সি লাইব্রেরি থেকে হার্ড-কোডড মান দেয়, যেমনটি উল্লেখ করা হয়েছে, তাই না?
mattdm

36

সুবহ:

% ps -o stime,time $$
STIME     TIME
Jan30 00:00:06

অর্থাত্ এই শেলটি 30 জানুয়ারী থেকে শুরু হয়েছিল এবং সিপিইউর সময়কালের প্রায় 6 সেকেন্ড ছিল।

এই তথ্য পাওয়ার জন্য আরও সুনির্দিষ্ট বা আরও পার্সেবল তবে কম পোর্টেবল উপায় থাকতে পারে। আপনার psকমান্ড বা আপনার procফাইল সিস্টেমের ডকুমেন্টেশন পরীক্ষা করুন ।

লিনাক্সের অধীনে, এই তথ্যটি বাস করে /proc/$pid/stat

awk '{print "CPU time: " $14+$15; print "start time: " $22}' /proc/$$/stat

সিপিইউ সময় জিফিতে হয়; শেল থেকে জিফ্ফাইয়ের মানটি কীভাবে খুঁজে পাওয়া যায় তা আমি জানি না। আরম্ভের সময়টি বুট সময়ের সাথে সম্পর্কিত (পাওয়া যায় /proc/uptime)।


3
এইচজেডের মান (যা প্রতি সেকেন্ডে জিফিজ) সন্ধান করা হাস্যকরভাবে জটিল হিসাবে প্রমাণিত হয়! sysinfo.cপ্রোপস প্যাকেজে থাকা মন্তব্যগুলির মাধ্যমে , ক) কার্নেল শিরোনাম ফাইলটি অন্তর্ভুক্ত করা যেতে পারে (এবং কোনও আলাদা কার্নেল ব্যবহার করা হলে পুনরায় কম্পাইল করা যায়, খ) পিক্সিক সিসকনফ () ফাংশনটি ব্যবহার করুন, যা দুর্ভাগ্যক্রমে, হার্ড-কোডেড মানটি সংকলিত ব্যবহার করে সি লাইব্রেরি, বা গ) কার্নেলকে জিজ্ঞাসা করুন, এবং এটি করার জন্য কোনও অফিসিয়াল ইন্টারফেস নেই। সুতরাং, কোডটিতে ক্লডেজের একটি সিরিজ রয়েছে যার মাধ্যমে এটি সঠিক মান নির্ধারণ করে। কি দারুন.
ম্যাচটিএম

1
psর manpage বলে যে timeহল "ক্রমসঞ্চিত CPU- র সময়"। আমি মনে করি যে ওপি যা খুঁজছিল তা হ'ল etime, বা "প্রক্রিয়া শুরু হওয়ার পরে অতিবাহিত সময়"। pubs.opengroup.org/onlinepubs/000095399/utilities/ps.html
rinogo

1
সর্বোপরি এত "পোর্টেবল" নয়: ফ্রিবিএসডি তে "পিএস: স্টিম: কীওয়ার্ড পাওয়া যায় নি"etimeযদিও এটি কমপক্ষে সমর্থন করে ।
n.st


13

ps-oআউটপুট ফর্ম্যাট নির্দিষ্ট করতে একটি বিকল্প নেয় এবং উপলব্ধ কলামগুলির মধ্যে একটি etime। ম্যান পৃষ্ঠা অনুসারে:

প্রক্রিয়া শুরু হওয়ার পর থেকে ইটাইম - অতিবাহিত সময়, [[dd-] hh:] মিমি: এসএস আকারে।

সুতরাং আপনি প্রতিটি প্রক্রিয়াটির পিআইডি এবং অতিবাহিত সময় পেতে এটি চালাতে পারেন:

$ ps -eo pid,etime

আপনি যদি কোনও নির্দিষ্ট পিআইডি এর অতিবাহিত সময় চান (যেমন 12345), আপনি এর মতো কিছু করতে পারেন:

$ ps -eo pid,etime | awk '/^12345/ {print $2}'

( সম্পাদনা করুন : দেখা যাচ্ছে উপরের কমান্ডের জন্য একটি সংক্ষিপ্ত বাক্য গঠন রয়েছে; ম্যাটডেমের উত্তর দেখুন )


5

এখনও কেন এটি প্রস্তাবিত হয়নি তা নিশ্চিত করুন : লিনাক্সে আপনি stat()আপনার পিআইডি-র জন্য / proc / [nnn] ডিরেক্টরি করতে পারেন ।

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

সর্বোপরি, আপনি stat(1)শেলটি বা b প্রিয়_pramramming_language stat(2)থেকে উপযুক্ত বাঁধাই করতে পারেন, যাতে আপনার একটি বাহ্যিক প্রক্রিয়া আরম্ভ করার প্রয়োজনও নাও হতে পারে।

লক্ষ্য করুন যে এটি ফ্রিবিএসডি-তে কাজ করে না/usr/compat/linux/proc ; অ্যাক্সেস / পরিবর্তন / স্থিতি-পরিবর্তনের সময়গুলি এখনকার সময় এবং জন্মের সময়টি ইউনিক্সের যুগ। আপনি যদি আমাকে জিজ্ঞাসা করেন তবে বেশ বোকা সমর্থন নেই isn't


স্ট্যাটের আউটপুটে কোথায় আমি তথ্যটি দেখতে পাচ্ছি? আমি কেবল অ্যাক্সেস, পরিবর্তন এবং পরিবর্তন দেখতে পাই see
tshepang

উল্লেখ্য @Tshepang সেই মান সব একই, এবং তারা হয় প্রক্রিয়া শুরুর সময়। আপনাকে এখনও গণিত করতে হবে, তবে আমার উত্তরটিতে উল্লিখিত জিফিগুলি বের করার চেষ্টা করার চেয়ে এটি অবশ্যই ভাল।
mattdm

আপনি এটিকে এটি কল করেন: stat /proc/4480এটি আপনাকে প্রক্রিয়াটির জন্ম, পরিবর্তন, পরিবর্তন এবং অ্যাক্সেসের তারিখ দেয়। আপনার যদি প্রক্রিয়া আইডি দরকার হয় তবে কেবল "শীর্ষ" ব্যবহার করুন
ব্যবহারকারীর 9033232

2

আপনি যদি সময় চালাতে পারেন এবং তারপরে একটি কমান্ড কার্যকর করতে পারেন তবে আপনি যা খুঁজছেন ঠিক তা পাবেন। আপনি ইতিমধ্যে চলমান কমান্ডের বিরুদ্ধে এটি করতে পারবেন না।

[0]% সময় নিদ্রা 20

ঘুম 20 0.00s ব্যবহারকারী 0.00s সিস্টেম 0% সিপিইউ 20.014 মোট


আপনি কী জানেন কীভাবে এটি শেষ না হওয়া পর্যন্ত চলমান প্রক্রিয়া পর্যবেক্ষণে এটি করতে পারি?
lrkwz

1

আপনি statউত্পাদিত স্ট্যাটাস ফাইলটি দেখে প্রক্রিয়া শুরু করার সময় পেতে পারেন proc, এটি ব্যবহার করে ফর্ম্যাট dateএবং বর্তমান সময় থেকে বিয়োগ:

echo $(( $(date +%s) - $(date -d "$(stat /proc/13494/stat | grep Modify | sed 's/Modify: //')" +%s) ))

13494আপনার প্রক্রিয়া 'pid কোথায়


1

$ ps -eo lstart শুরু সময় পেতে

$ ps -eo etime সময়কাল / অতিবাহিত সময় পান

$ ps -eo pid,lstart,etime | grep 61819
  PID                   STARTED     ELAPSED
  61819 Mon Sep 17 03:01:35 2018    07:52:15

61819 প্রক্রিয়া আইডি।


Lstart ব্যবহারের সমস্যা হতে পারে, এটা skews - unix.stackexchange.com/questions/274610/...
SLM

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