ක්‍රියාවලියක් කොපමණ කාලයක් ක්‍රියාත්මක වී ඇත්දැයි පරීක්ෂා කරන්නේ කෙසේද?


252

අධීක්ෂණ යෙදුමකින් ක්‍රියාවලිය දියත් කිරීමෙන් මෙය කිරීමෙන් වැළකී සිටීමට මම කැමතියි.

Answers:


328

ලිනක්ස් සමග psසිට procps(-ng)(මෙම POSIX විසින් නිශ්චිතව දක්වා ඇති නිසා සහ බොහෝ අනෙකුත් පද්ධති):

ps -o etime= -p "$$" 

$$ඔබට පරීක්ෂා කිරීමට අවශ්‍ය ක්‍රියාවලියේ PID එක කොහේද? මෙය ගත වූ කාලය ආකෘතියෙන් ආපසු ලබා දෙනු ඇත [[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), මෙම පද්ධතියේ තත්පරයට ජිෆි ගණන තීරණය කළ යුතු අතර, ගත වූ කාලය ප්‍රයෝජනවත් ආකෘතියකින් ලබා ගැනීම සඳහා ගණිතය කරන්න.

HZ හි අගය සොයා ගැනීම හාස්‍යජනක ලෙස සංකීර්ණ බව පෙනේ (එනම් තත්පරයට ජිෆි). දී අදහස් දක්වා sysinfo.cඇති procps ඇසුරුම තුල, වෙනස් කර්නලය භාවිතා කරන්නේ නම් එක් A) කර්නල් ශීර්ෂ ගොනුව හා recompile ඇතුලත් කර ගත හැක, බී) POSIX භාවිතා sysconf()අවාසනාවකට, C පුස්තකයන් සම්පාදනය දුෂ්කර-, ව්යංගාර්ථවත්ව අගය යොදා ගන්නා, කර්තව්යයක්, හෝ ඇ) කර්නලය අසන්න, නමුත් එය කිරීමට නිල අතුරු මුහුණතක් නොමැත. එබැවින්, psකේතයට නිවැරදි අගය තීරණය කරන ක්ලඩ්ජ් මාලාවක් ඇතුළත් වේ. වොව්.

එබැවින් එය ඔබට පහසු වන පහසුය ps. :)

පරිශීලක @ 336_ සටහන් ලෙස, ලිනක්ස් හි (මෙය අතේ ගෙන යා නොහැකි), ඔබට statඩිරෙක්ටරිය සඳහා ප්‍රවේශය, වෙනස් කිරීම හෝ තත්වය වෙනස් කිරීමේ දිනයන් බැලීමට විධානය භාවිතා කළ හැකිය /proc/$$(එහිදී නැවත $$උනන්දුවක් දක්වන ක්‍රියාවලිය). අංක තුනම එක හා සමාන විය යුතුය

stat -c%X /proc/$$

එම ක්‍රියාවලිය $$ආරම්භ වූ කාලය, යුගයෙන් තත්පර කිහිපයකින් ඔබට ලබා දෙනු ඇත . එය තවමත් ඔබට අවශ්‍ය දේ නොවේ, මන්දයත් ගතවන කාලය ලබා ගැනීම සඳහා වර්තමාන කාලයේ සිට එය අඩු කිරීම සඳහා ඔබ තවමත් ගණිතය කළ යුතු බැවිනි - මම හිතන්නේ යම් දෙයක් ක්‍රියාත්මක date +%s --date="now - $( stat -c%X /proc/$$ ) seconds"වනු ඇත, නමුත් එය ටිකක් අශෝභන ය. හැකි එක් වාසියක් නම්, ඔබ -c%xඒ වෙනුවට දිගු හැඩැති ප්‍රතිදානය භාවිතා කරන්නේ නම් -c%X, ඔබට සම්පූර්ණ සංඛ්‍යා තත්පරයට වඩා වැඩි විභේදනයක් ලැබෙනු ඇත. නමුත්, ඔබට එය අවශ්‍ය නම්, ඔබ බොහෝ විට ක්‍රියාවලි විගණන ප්‍රවේශය භාවිතා කළ යුතුය. මන්දයත්, සංඛ්‍යා විධානය ක්‍රියාත්මක කිරීමේ වේලාව නිරවද්‍යතාවයට බාධා වන බැවිනි.


1
හායි! වන etime=මුද්රණ දෝෂයක්? මට සොයාගත හැක්කේ etimeමිනිසාගේ පිටුවල පමණි.
කෙන්ට් පවර්

16
Ent කෙන්ට්පවර් එය යතුරු ලියනය නොවේ. හිස් හිස් =ශීර්ෂය යටපත් කරයි. එය නොමැතිව උත්සාහ කරන්න, නැතහොත් උත්සාහ කරන්නps -p $$ -o etime="Silly Header Here"
mattdm

4
ps -p $ (pgrep find) -o etime =
mafrosis

1
හොඳයි. etimesයන්ත්‍රය කියවිය හැකි පරිදි මම මට වඩා කැමතියි
අස්ෆන්ඩ් කාසි

1
@alexmurray එය හුදෙක් ඇමතුමක් sysconf()ලබා දෙන අතර එම නිසා C පුස්තකාලයෙන් දෘඩ කේත කළ අගයක් ඔබට ලබා දෙයි.
mattdm

36

අතේ ගෙන යා හැකි:

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

එනම් එම කවචය ජනවාරි 30 වන දින ආරම්භ කරන ලද අතර එය තත්පර 6 ක CPU වේලාවකි.

මෙම තොරතුරු ලබා ගැනීම සඳහා වඩාත් නිවැරදි හෝ වැඩි විග්‍රහ කළ හැකි නමුත් අඩු අතේ ගෙන යා හැකි ක්‍රම තිබිය හැකිය. ඔබගේ psවිධානයේ හෝ procගොනු පද්ධතියේ ප්‍රලේඛනය පරීක්ෂා කරන්න .

ලිනක්ස් යටතේ, මෙම තොරතුරු ජීවත් වේ /proc/$pid/stat.

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

CPU කාලය ජිෆීස් වල ඇත; කවචයෙන් ජිෆී අගය සොයා ගන්නේ කෙසේදැයි මම නොදනිමි. ආරම්භක වේලාව ඇරඹුම් වේලාවට සාපේක්ෂව වේ (හමු වී ඇත /proc/uptime).


3
HZ හි අගය සොයා ගැනීම (එනම් තත්පරයට ජිෆීස්) හාස්‍යජනක ලෙස සංකීර්ණ වේ! තුළ අදහස් සිට sysinfo.cමෙම procps පැකේජය, එක් අ) කර්නල් ශීර්ෂ ගොනුව (හා recompile වෙනස් කර්නලය භාවිතා කරන්නේ නම් ආ ඇතුලත් කර ගත හැක,) කනගාටුවට කරුණක් වන්නේ, සම්පාදනය දුෂ්කර-, ව්යංගාර්ථවත්ව අගය භාවිතා වන, POSIX sysconf () යන ශ්රිතය භාවිතා c පුස්තකාලය, හෝ ඇ) කර්නලය අසන්න, එය කිරීමට නිල අතුරු මුහුණතක් නොමැත. එබැවින්, කේතයට නිවැරදි අගය තීරණය කරන ක්ලඩ්ජ් මාලාවක් ඇතුළත් වේ. වොව්.
mattdm

1
මෙම psබව manpage රාජ්යයන් time"CPU කාලය සමුච්චිත" වේ. මම හිතන්නේ OP සොයන දේ etimeහෝ "ක්‍රියාවලිය ආරම්භ වූ දින සිට ගත වූ කාලය" යන්නයි. pubs.opengroup.org/onlinepubs/000095399/utilities/ps.html
rinogo

1
සියල්ලට පසු එතරම් "අතේ ගෙන යා හැකි" නොවේ : FreeBSD හි "ps: stime: keyword සොයාගත නොහැකි" . එය අවම වශයෙන් සහය දක්වයි etime.
n.st

20
ps -eo pid,comm,cmd,start,etime | grep -i X

X යනු ක්‍රියාවලියේ නමයි


2
බොහෝ විට grep -v grep එකතු කළ යුතුය.
බ්‍රයන්

ps -o pid,comm,cmd,start,etime -p XPID X දෙස බැලීමට.
codeforester

14

psයම් යම් ප්රශ්න -oප්රතිදානය ආකෘතිය නියම කිරීමට විකල්පය, සහ ලබා ගත හැකි තීරු එක් etime. මෑන් පිටුවට අනුව:

etime - ක්‍රියාවලිය ආරම්භ වූ දින සිට ගත වූ කාලය [[dd-] hh:] mm: ss.

සෑම ක්‍රියාවලියකම PID සහ ගත වූ කාලය ලබා ගැනීම සඳහා ඔබට මෙය ක්‍රියාත්මක කළ හැකිය:

$ ps -eo pid,etime

විශේෂිත PID එකක ගත වූ කාලය ඔබට අවශ්‍ය නම් (උදා: 12345), ඔබට මෙවැනි දෙයක් කළ හැකිය:

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

( සංස්කරණය කරන්න : ඉහත විධානය සඳහා කෙටි වාක්‍ය ඛණ්ඩයක් ඇති බව පෙනේ; mattdm හි පිළිතුර බලන්න )


6

මෙය තවම යෝජනා නොකිරීමට හේතුව: ලිනක්ස් හි ඔබට stat()ඔබේ PID සඳහා / proc / [nnn] නාමාවලිය කළ හැකිය.

මෙම හැසිරීම පැහැදිලිවම සැලසුම් කර ඇත්තේ ක්‍රියාවලියේ ආරම්භක වේලාව නැවත ලබා දීම සඳහා වන අතර එය ඉහළ විභේදනයකින් කළ හැකි අතර කර්නලයට (පැහැදිලිවම) සරලවම අදාළ තොරතුරු පරීක්ෂා කළ හැකි බැවින් ජිෆීස් හක්ක නොමැතිව කර්නලයට නිවැරදිව කළ හැකිය. ප්‍රවේශය, දත්ත වෙනස් කිරීම සහ තත්වය වෙනස් කිරීමේ ක්ෂේත්‍ර සියල්ලම ක්‍රියාවලිය ආරම්භක වේලාව ලබා දෙයි.

සියල්ලටම වඩා, ඔබට stat(1)කවචයේ භාවිතා කළ හැකිය , නැතහොත් stat(2)$ ප්‍රියතම_ප්‍රෝග්‍රැමිං_ලැන්ගුවේ සිට සුදුසු බන්ධනය භාවිතා කළ හැකිය , එබැවින් ඔබට බාහිර ක්‍රියාවලියක් දියත් කිරීමට පවා අවශ්‍ය නොවනු ඇත.

සටහන මෙම බව නොවේ සමග වැඩ /usr/compat/linux/procඒ අතරින් කිහිපයකි මත; ආපසු පැමිණීම / වෙනස් කිරීම / තත්වය වෙනස් කිරීමේ වේලාවන් වර්තමාන කාලය වන අතර උපන් කාලය යුනික්ස් යුගය වේ. ඔබ මගෙන් ඇසුවොත් තරමක් මෝඩ සහයෝගයක් නැත.


සංඛ්‍යාලේඛන ප්‍රතිදානයේ තොරතුරු මා දකින්නේ කොතැනින්ද? මට පෙනෙන්නේ ප්‍රවේශය, වෙනස් කිරීම සහ වෙනස් කිරීම පමණි.
tshepang

එම වටිනාකම් එකම වන අතර, ඔවුන් ඒ @Tshepang සටහන වේ ක්රියාවලිය ආරම්භ කාලය. ඔබ තවමත් ගණිතය කළ යුතුව ඇත, නමුත් මෙය මගේ පිළිතුරේ සඳහන් කර ඇති පරිදි ජිෆීස් සොයා ගැනීමට උත්සාහ කරනවාට වඩා හොඳය.
mattdm

ඔබ එය මේ ආකාරයට හඳුන්වයි: stat /proc/4480මෙය ඔබට ක්‍රියාවලියේ උපත, වෙනස් කිරීම, වෙනස් කිරීම සහ ප්‍රවේශ දිනයන් ලබා දෙනු ඇත. ඔබට ක්‍රියාවලි හැඳුනුම්පත අවශ්‍ය නම්, "ඉහළට" භාවිතා කරන්න
user890332

2

ඔබට වේලාව ධාවනය කර විධානයක් ක්‍රියාත්මක කළ හැකි නම් ඔබ සොයන දේ හරියටම ලැබෙනු ඇත. දැනටමත් ක්‍රියාත්මක වන විධානයකට එරෙහිව ඔබට මෙය කළ නොහැක.

[0]% නින්ද 20

නින්ද 20 0.00s පරිශීලක 0.00s පද්ධතිය 0% cpu 20.014 එකතුව


එය අවසන් වන තුරු ක්‍රියාත්මක වන ක්‍රියාවලියක් අධීක්ෂණය කිරීමේදී මා එය කරන්නේ කෙසේදැයි ඔබ දන්නවාද?
lrkwz

2

$ 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 යනු ක්‍රියාවලි හැඳුනුම්පතයි.


1
Lstart භාවිතය ගැටළු සහගත විය හැකිය, එය මඟ හැරේ - unix.stackexchange.com/questions/274610/…
slm

1

statනිෂ්පාදිත සංඛ්‍යාලේඛන ගොනුව දෙස බැලීමෙන් ඔබට එය ක්‍රියාවලියේ ආරම්භක වේලාව ලබා ගත හැකිය proc, එය භාවිතා කර ආකෘතිකරණය කර dateවර්තමාන කාලයෙන් අඩු කරන්න:

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

13494ඔබේ ක්‍රියාවලිය කොහෙද ?


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.