How to check how long a process has been running? The Next CEO of Stack OverflowGet process age from command lineHow to know how long a process has been running?How long does my Java process run?Get process elapsed time in secondsRestricting CPU time of processes by executable pathCheck for process already running in webfaction?How to know how long a process has been running?Alert when running process finishesGetting output from a running processLD_PRELOAD equivalent for running process?How do I know when a process has been killedEasy way to create a meaningless, cheap, long-running process?can't capture PID from background process started in a sub-shell that's running in a heredoc passed to `sudo su`How to check the shell of a running process?How to maintain a command from terminal running?
Writing differences on a blackboard
Is there always a complete, orthogonal set of unitary matrices?
What connection does MS Office have to Netscape Navigator?
Why don't programming languages automatically manage the synchronous/asynchronous problem?
Is it possible to replace duplicates of a character with one character using tr
Is it my responsibility to learn a new technology in my own time my employer wants to implement?
0 rank tensor vs 1D vector
Rotate a column
Would be okay to drive on this tire?
Why is information "lost" when it got into a black hole?
"misplaced omit" error when >centering columns
Running a General Election and the European Elections together
RigExpert AA-35 - Interpreting The Information
Why do airplanes bank sharply to the right after air-to-air refueling?
Why is the US ranked as #45 in Press Freedom ratings, despite its extremely permissive free speech laws?
Is it convenient to ask the journal's editor for 2 additional days to complete a review?
Why isn't the Mueller report being released completely and unredacted?
Is a distribution that is normal, but highly skewed considered Gaussian?
What happened in Rome, when the western empire "fell"?
Why doesn't UK go for the same deal Japan has with EU to resolve Brexit?
If Nick Fury and Coulson already knew about aliens (Kree and Skrull) why did they wait until Thor's appearance to start making weapons?
is it ok to reduce charging current for li ion 18650 battery?
What was the first Unix version to run on a microcomputer?
Does Germany produce more waste than the US?
How to check how long a process has been running?
The Next CEO of Stack OverflowGet process age from command lineHow to know how long a process has been running?How long does my Java process run?Get process elapsed time in secondsRestricting CPU time of processes by executable pathCheck for process already running in webfaction?How to know how long a process has been running?Alert when running process finishesGetting output from a running processLD_PRELOAD equivalent for running process?How do I know when a process has been killedEasy way to create a meaningless, cheap, long-running process?can't capture PID from background process started in a sub-shell that's running in a heredoc passed to `sudo su`How to check the shell of a running process?How to maintain a command from terminal running?
I would like to avoid doing this by launching the process from a monitoring app.
process
add a comment |
I would like to avoid doing this by launching the process from a monitoring app.
process
add a comment |
I would like to avoid doing this by launching the process from a monitoring app.
process
I would like to avoid doing this by launching the process from a monitoring app.
process
process
edited Aug 23 '11 at 3:14
Tshepang
asked Feb 22 '11 at 21:14
TshepangTshepang
26.4k72187265
26.4k72187265
add a comment |
add a comment |
9 Answers
9
active
oldest
votes
On Linux with the ps from procps(-ng) (and most other systems since this is specified by POSIX):
ps -o etime= -p "$$"
Where $$ is the PID of the process you want to check. This will return the elapsed time in the format [[dd-]hh:]mm:ss.
Using -o etime tells ps that you just want the elapsed time field, and the = at the end of that suppresses the header (without, you get a line which says ELAPSED and then the time on the next line; with, you get just one line with the time).
Or, with newer versions of the procps-ng tool suite (3.3.0 or above) on Linux or on FreeBSD 9.0 or above (and possibly others), use:
ps -o etimes= -p "$$"
(with an added s) to get time formatted just as seconds, which is more useful in scripts.
On Linux, the ps program gets this from /proc/$$/stat, where one of the fields (see man proc) is process start time. This is, unfortunately, specified to be the time in jiffies (an arbitrary time counter used in the Linux kernel) since the system boot. So you have to determine the time at which the system booted (from /proc/stat), the number of jiffies per second on this system, and then do the math to get the elapsed time in a useful format.
It turns out to be ridiculously complicated to find the value of HZ (that is, jiffies per second). From comments in sysinfo.c in the procps package, one can A) include the kernel header file and recompile if a different kernel is used, B) use the posix sysconf() function, which, sadly, uses a hard-coded value compiled into the C library, or C) ask the kernel, but there's no official interface to doing that. So, the ps code includes a series of kludges by which it determines the correct value. Wow.
So it's convenient that ps does that all for you. :)
As user @336_ notes, on Linux (this is not portable), you can use the stat command to look at the access, modification, or status change dates for the directory /proc/$$ (where again $$ is the process of interest). All three numbers should be the same, so
stat -c%X /proc/$$
will give you the time that process $$ started, in seconds since the epoch. That still isn't quite what you want, since you still need to do the math to subtract that from the current time to get elapsed time — I guess something like date +%s --date="now - $( stat -c%X /proc/$$ ) seconds" would work, but it's a bit ungainly. One possible advantage is that if you use the long-format output like -c%x instead of -c%X, you get greater resolution than whole-number seconds. But, if you need that, you should probably use process-auditing approach because the timing of running the stat command is going to interfere with accuracy.
1
Hi! Isetime=a typo? I can only findetimein the man pages.
– Kent Pawar
Jun 27 '13 at 13:01
16
@KentPawar It's not a typo. The empty=suppresses the header. Try it without, or tryps -p $$ -o etime="Silly Header Here"
– mattdm
Jun 27 '13 at 13:28
4
ps -p $(pgrep find) -o etime=
– mafrosis
Sep 11 '13 at 23:07
1
Nice. I preferetimesmyself as then it's machine readable
– Asfand Qazi
Jul 15 '15 at 9:35
1
@alexmurray That just callssysconf()and therefore gives you the hard-coded value from the C library, as noted, doesn't it?
– mattdm
Apr 1 '16 at 1:55
|
show 9 more comments
Portable:
% ps -o stime,time $$
STIME TIME
Jan30 00:00:06
i.e. that shell was started on January 30 and totaled about 6 seconds of CPU time.
There may be more precise or more parseable but less portable ways to get this information. Check the documentation of your ps command or your proc filesystem.
Under Linux, this information lives in /proc/$pid/stat.
awk 'print "CPU time: " $14+$15; print "start time: " $22' /proc/$$/stat
The CPU time is in jiffies; I don't know offhand how to find the jiffy value from the shell. The start time is relative to the boot time (found in /proc/uptime).
3
Finding the value of HZ (that is, jiffies per second) turns out to be ridiculously complicated! From comments in thesysinfo.cin the procps package, one can a) include the kernel header file (and recompile if a different kernel is used, b) use the posix sysconf() function, which, sadly, uses a hard-coded value compiled into the c library, or c) ask the kernel, and there's no official interface to doing that. So, the code includes a series of kludges by which it determines the correct value. Wow.
– mattdm
Feb 22 '11 at 21:54
1
Thepsmanpage states thattimeis "cumulative CPU time". I think what the OP was looking for isetime, or "the elapsed time since the process was started". pubs.opengroup.org/onlinepubs/000095399/utilities/ps.html
– rinogo
Apr 23 '14 at 20:35
1
Not so "portable" after all: "ps: stime: keyword not found" on FreeBSD. It does at least supportetime, though.
– n.st
May 23 '16 at 11:34
add a comment |
ps -eo pid,comm,cmd,start,etime | grep -i X
X is the name of the process
1
should probably add a grep -v grep.
– Brian
Jun 30 '14 at 20:07
ps -o pid,comm,cmd,start,etime -p Xto look at PID X.
– codeforester
Jul 9 '18 at 17:06
add a comment |
ps takes a -o option to specify the output format, and one of the available columns is etime. According to the man page:
etime - elapsed time since the process was started, in the form [[dd-]hh:]mm:ss.
Thus you can run this to get the PID and elapsed time of every process:
$ ps -eo pid,etime
If you want the elapsed time of a particular PID (e.g. 12345), you can do something like:
$ ps -eo pid,etime | awk '/^12345/ print $2'
(Edit: Turns out there's a shorter syntax for the above command; see mattdm's answer)
add a comment |
Unsure why this has not yet been suggested: on Linux you can stat() the /proc/[nnn] directory for your PID.
This behavior is explicitly designed to return the process start time, which it can do at high resolution, and which the kernel can do accurately without the jiffies hacks since the kernel can (obviously) simply check the relevant information. The access, data-modification and status change fields all return the process start time.
Best of all, you can use stat(1) at the shell, or the appropriate binding to stat(2) from $favorite_programming_language, so you may not even need to launch an external process.
NOTE that this does not work with /usr/compat/linux/proc on FreeBSD; the access/modification/status-change times returned are the current time, and the birth time is the UNIX epoch. Quite stupid the support isn't there if you ask me.
Where in the output of stat do I see the info? I only see Access, Modify, and Change.
– Tshepang
Jan 8 '17 at 22:52
@Tshepang Note that those values are all the same, and they are the process start time. You still have to do the math, but this is definitely better than trying to figure out jiffies as noted in my answer.
– mattdm
Mar 2 '17 at 16:53
add a comment |
If you can run time and then execute a command you will get exactly what you are looking for. You cannot do this against an already-running command.
[0] % time sleep 20
sleep 20 0.00s user 0.00s system 0% cpu 20.014 total
Do you know how can I do it on a running process monitoring until it ends?
– lrkwz
Nov 21 '12 at 22:56
add a comment |
$ ps -eo lstart get start time
$ ps -eo etime get duration/elapsed time
$ ps -eo pid,lstart,etime | grep 61819
PID STARTED ELAPSED
61819 Mon Sep 17 03:01:35 2018 07:52:15
61819 is the process id.
add a comment |
you can get the start time of the process by looking at the stat of the stat file produced by proc, format it using date and subtract it from the current time:
echo $(( $(date +%s) - $(date -d "$(stat /proc/13494/stat | grep Modify | sed 's/Modify: //')" +%s) ))
where 13494 is your process' pid
add a comment |
Time elapsed in seconds: expr $(date +"%s") - $(stat -c%X /proc/<PID HERE>)
This seems to me to be a very slight variation of one that mattdm mentioned already:date +%s --date="now - $( stat -c%X /proc/$$
– Jeff Schaller♦
2 days ago
That one didn't work for me on my very minimal Alpine docker instance so I wrote this one
– Shard
2 days ago
add a comment |
Your Answer
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "106"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f7870%2fhow-to-check-how-long-a-process-has-been-running%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
9 Answers
9
active
oldest
votes
9 Answers
9
active
oldest
votes
active
oldest
votes
active
oldest
votes
On Linux with the ps from procps(-ng) (and most other systems since this is specified by POSIX):
ps -o etime= -p "$$"
Where $$ is the PID of the process you want to check. This will return the elapsed time in the format [[dd-]hh:]mm:ss.
Using -o etime tells ps that you just want the elapsed time field, and the = at the end of that suppresses the header (without, you get a line which says ELAPSED and then the time on the next line; with, you get just one line with the time).
Or, with newer versions of the procps-ng tool suite (3.3.0 or above) on Linux or on FreeBSD 9.0 or above (and possibly others), use:
ps -o etimes= -p "$$"
(with an added s) to get time formatted just as seconds, which is more useful in scripts.
On Linux, the ps program gets this from /proc/$$/stat, where one of the fields (see man proc) is process start time. This is, unfortunately, specified to be the time in jiffies (an arbitrary time counter used in the Linux kernel) since the system boot. So you have to determine the time at which the system booted (from /proc/stat), the number of jiffies per second on this system, and then do the math to get the elapsed time in a useful format.
It turns out to be ridiculously complicated to find the value of HZ (that is, jiffies per second). From comments in sysinfo.c in the procps package, one can A) include the kernel header file and recompile if a different kernel is used, B) use the posix sysconf() function, which, sadly, uses a hard-coded value compiled into the C library, or C) ask the kernel, but there's no official interface to doing that. So, the ps code includes a series of kludges by which it determines the correct value. Wow.
So it's convenient that ps does that all for you. :)
As user @336_ notes, on Linux (this is not portable), you can use the stat command to look at the access, modification, or status change dates for the directory /proc/$$ (where again $$ is the process of interest). All three numbers should be the same, so
stat -c%X /proc/$$
will give you the time that process $$ started, in seconds since the epoch. That still isn't quite what you want, since you still need to do the math to subtract that from the current time to get elapsed time — I guess something like date +%s --date="now - $( stat -c%X /proc/$$ ) seconds" would work, but it's a bit ungainly. One possible advantage is that if you use the long-format output like -c%x instead of -c%X, you get greater resolution than whole-number seconds. But, if you need that, you should probably use process-auditing approach because the timing of running the stat command is going to interfere with accuracy.
1
Hi! Isetime=a typo? I can only findetimein the man pages.
– Kent Pawar
Jun 27 '13 at 13:01
16
@KentPawar It's not a typo. The empty=suppresses the header. Try it without, or tryps -p $$ -o etime="Silly Header Here"
– mattdm
Jun 27 '13 at 13:28
4
ps -p $(pgrep find) -o etime=
– mafrosis
Sep 11 '13 at 23:07
1
Nice. I preferetimesmyself as then it's machine readable
– Asfand Qazi
Jul 15 '15 at 9:35
1
@alexmurray That just callssysconf()and therefore gives you the hard-coded value from the C library, as noted, doesn't it?
– mattdm
Apr 1 '16 at 1:55
|
show 9 more comments
On Linux with the ps from procps(-ng) (and most other systems since this is specified by POSIX):
ps -o etime= -p "$$"
Where $$ is the PID of the process you want to check. This will return the elapsed time in the format [[dd-]hh:]mm:ss.
Using -o etime tells ps that you just want the elapsed time field, and the = at the end of that suppresses the header (without, you get a line which says ELAPSED and then the time on the next line; with, you get just one line with the time).
Or, with newer versions of the procps-ng tool suite (3.3.0 or above) on Linux or on FreeBSD 9.0 or above (and possibly others), use:
ps -o etimes= -p "$$"
(with an added s) to get time formatted just as seconds, which is more useful in scripts.
On Linux, the ps program gets this from /proc/$$/stat, where one of the fields (see man proc) is process start time. This is, unfortunately, specified to be the time in jiffies (an arbitrary time counter used in the Linux kernel) since the system boot. So you have to determine the time at which the system booted (from /proc/stat), the number of jiffies per second on this system, and then do the math to get the elapsed time in a useful format.
It turns out to be ridiculously complicated to find the value of HZ (that is, jiffies per second). From comments in sysinfo.c in the procps package, one can A) include the kernel header file and recompile if a different kernel is used, B) use the posix sysconf() function, which, sadly, uses a hard-coded value compiled into the C library, or C) ask the kernel, but there's no official interface to doing that. So, the ps code includes a series of kludges by which it determines the correct value. Wow.
So it's convenient that ps does that all for you. :)
As user @336_ notes, on Linux (this is not portable), you can use the stat command to look at the access, modification, or status change dates for the directory /proc/$$ (where again $$ is the process of interest). All three numbers should be the same, so
stat -c%X /proc/$$
will give you the time that process $$ started, in seconds since the epoch. That still isn't quite what you want, since you still need to do the math to subtract that from the current time to get elapsed time — I guess something like date +%s --date="now - $( stat -c%X /proc/$$ ) seconds" would work, but it's a bit ungainly. One possible advantage is that if you use the long-format output like -c%x instead of -c%X, you get greater resolution than whole-number seconds. But, if you need that, you should probably use process-auditing approach because the timing of running the stat command is going to interfere with accuracy.
1
Hi! Isetime=a typo? I can only findetimein the man pages.
– Kent Pawar
Jun 27 '13 at 13:01
16
@KentPawar It's not a typo. The empty=suppresses the header. Try it without, or tryps -p $$ -o etime="Silly Header Here"
– mattdm
Jun 27 '13 at 13:28
4
ps -p $(pgrep find) -o etime=
– mafrosis
Sep 11 '13 at 23:07
1
Nice. I preferetimesmyself as then it's machine readable
– Asfand Qazi
Jul 15 '15 at 9:35
1
@alexmurray That just callssysconf()and therefore gives you the hard-coded value from the C library, as noted, doesn't it?
– mattdm
Apr 1 '16 at 1:55
|
show 9 more comments
On Linux with the ps from procps(-ng) (and most other systems since this is specified by POSIX):
ps -o etime= -p "$$"
Where $$ is the PID of the process you want to check. This will return the elapsed time in the format [[dd-]hh:]mm:ss.
Using -o etime tells ps that you just want the elapsed time field, and the = at the end of that suppresses the header (without, you get a line which says ELAPSED and then the time on the next line; with, you get just one line with the time).
Or, with newer versions of the procps-ng tool suite (3.3.0 or above) on Linux or on FreeBSD 9.0 or above (and possibly others), use:
ps -o etimes= -p "$$"
(with an added s) to get time formatted just as seconds, which is more useful in scripts.
On Linux, the ps program gets this from /proc/$$/stat, where one of the fields (see man proc) is process start time. This is, unfortunately, specified to be the time in jiffies (an arbitrary time counter used in the Linux kernel) since the system boot. So you have to determine the time at which the system booted (from /proc/stat), the number of jiffies per second on this system, and then do the math to get the elapsed time in a useful format.
It turns out to be ridiculously complicated to find the value of HZ (that is, jiffies per second). From comments in sysinfo.c in the procps package, one can A) include the kernel header file and recompile if a different kernel is used, B) use the posix sysconf() function, which, sadly, uses a hard-coded value compiled into the C library, or C) ask the kernel, but there's no official interface to doing that. So, the ps code includes a series of kludges by which it determines the correct value. Wow.
So it's convenient that ps does that all for you. :)
As user @336_ notes, on Linux (this is not portable), you can use the stat command to look at the access, modification, or status change dates for the directory /proc/$$ (where again $$ is the process of interest). All three numbers should be the same, so
stat -c%X /proc/$$
will give you the time that process $$ started, in seconds since the epoch. That still isn't quite what you want, since you still need to do the math to subtract that from the current time to get elapsed time — I guess something like date +%s --date="now - $( stat -c%X /proc/$$ ) seconds" would work, but it's a bit ungainly. One possible advantage is that if you use the long-format output like -c%x instead of -c%X, you get greater resolution than whole-number seconds. But, if you need that, you should probably use process-auditing approach because the timing of running the stat command is going to interfere with accuracy.
On Linux with the ps from procps(-ng) (and most other systems since this is specified by POSIX):
ps -o etime= -p "$$"
Where $$ is the PID of the process you want to check. This will return the elapsed time in the format [[dd-]hh:]mm:ss.
Using -o etime tells ps that you just want the elapsed time field, and the = at the end of that suppresses the header (without, you get a line which says ELAPSED and then the time on the next line; with, you get just one line with the time).
Or, with newer versions of the procps-ng tool suite (3.3.0 or above) on Linux or on FreeBSD 9.0 or above (and possibly others), use:
ps -o etimes= -p "$$"
(with an added s) to get time formatted just as seconds, which is more useful in scripts.
On Linux, the ps program gets this from /proc/$$/stat, where one of the fields (see man proc) is process start time. This is, unfortunately, specified to be the time in jiffies (an arbitrary time counter used in the Linux kernel) since the system boot. So you have to determine the time at which the system booted (from /proc/stat), the number of jiffies per second on this system, and then do the math to get the elapsed time in a useful format.
It turns out to be ridiculously complicated to find the value of HZ (that is, jiffies per second). From comments in sysinfo.c in the procps package, one can A) include the kernel header file and recompile if a different kernel is used, B) use the posix sysconf() function, which, sadly, uses a hard-coded value compiled into the C library, or C) ask the kernel, but there's no official interface to doing that. So, the ps code includes a series of kludges by which it determines the correct value. Wow.
So it's convenient that ps does that all for you. :)
As user @336_ notes, on Linux (this is not portable), you can use the stat command to look at the access, modification, or status change dates for the directory /proc/$$ (where again $$ is the process of interest). All three numbers should be the same, so
stat -c%X /proc/$$
will give you the time that process $$ started, in seconds since the epoch. That still isn't quite what you want, since you still need to do the math to subtract that from the current time to get elapsed time — I guess something like date +%s --date="now - $( stat -c%X /proc/$$ ) seconds" would work, but it's a bit ungainly. One possible advantage is that if you use the long-format output like -c%x instead of -c%X, you get greater resolution than whole-number seconds. But, if you need that, you should probably use process-auditing approach because the timing of running the stat command is going to interfere with accuracy.
edited Jun 20 '17 at 14:03
answered Feb 22 '11 at 21:20
mattdmmattdm
29k1372117
29k1372117
1
Hi! Isetime=a typo? I can only findetimein the man pages.
– Kent Pawar
Jun 27 '13 at 13:01
16
@KentPawar It's not a typo. The empty=suppresses the header. Try it without, or tryps -p $$ -o etime="Silly Header Here"
– mattdm
Jun 27 '13 at 13:28
4
ps -p $(pgrep find) -o etime=
– mafrosis
Sep 11 '13 at 23:07
1
Nice. I preferetimesmyself as then it's machine readable
– Asfand Qazi
Jul 15 '15 at 9:35
1
@alexmurray That just callssysconf()and therefore gives you the hard-coded value from the C library, as noted, doesn't it?
– mattdm
Apr 1 '16 at 1:55
|
show 9 more comments
1
Hi! Isetime=a typo? I can only findetimein the man pages.
– Kent Pawar
Jun 27 '13 at 13:01
16
@KentPawar It's not a typo. The empty=suppresses the header. Try it without, or tryps -p $$ -o etime="Silly Header Here"
– mattdm
Jun 27 '13 at 13:28
4
ps -p $(pgrep find) -o etime=
– mafrosis
Sep 11 '13 at 23:07
1
Nice. I preferetimesmyself as then it's machine readable
– Asfand Qazi
Jul 15 '15 at 9:35
1
@alexmurray That just callssysconf()and therefore gives you the hard-coded value from the C library, as noted, doesn't it?
– mattdm
Apr 1 '16 at 1:55
1
1
Hi! Is
etime= a typo? I can only find etime in the man pages.– Kent Pawar
Jun 27 '13 at 13:01
Hi! Is
etime= a typo? I can only find etime in the man pages.– Kent Pawar
Jun 27 '13 at 13:01
16
16
@KentPawar It's not a typo. The empty
= suppresses the header. Try it without, or try ps -p $$ -o etime="Silly Header Here"– mattdm
Jun 27 '13 at 13:28
@KentPawar It's not a typo. The empty
= suppresses the header. Try it without, or try ps -p $$ -o etime="Silly Header Here"– mattdm
Jun 27 '13 at 13:28
4
4
ps -p $(pgrep find) -o etime=
– mafrosis
Sep 11 '13 at 23:07
ps -p $(pgrep find) -o etime=
– mafrosis
Sep 11 '13 at 23:07
1
1
Nice. I prefer
etimes myself as then it's machine readable– Asfand Qazi
Jul 15 '15 at 9:35
Nice. I prefer
etimes myself as then it's machine readable– Asfand Qazi
Jul 15 '15 at 9:35
1
1
@alexmurray That just calls
sysconf() and therefore gives you the hard-coded value from the C library, as noted, doesn't it?– mattdm
Apr 1 '16 at 1:55
@alexmurray That just calls
sysconf() and therefore gives you the hard-coded value from the C library, as noted, doesn't it?– mattdm
Apr 1 '16 at 1:55
|
show 9 more comments
Portable:
% ps -o stime,time $$
STIME TIME
Jan30 00:00:06
i.e. that shell was started on January 30 and totaled about 6 seconds of CPU time.
There may be more precise or more parseable but less portable ways to get this information. Check the documentation of your ps command or your proc filesystem.
Under Linux, this information lives in /proc/$pid/stat.
awk 'print "CPU time: " $14+$15; print "start time: " $22' /proc/$$/stat
The CPU time is in jiffies; I don't know offhand how to find the jiffy value from the shell. The start time is relative to the boot time (found in /proc/uptime).
3
Finding the value of HZ (that is, jiffies per second) turns out to be ridiculously complicated! From comments in thesysinfo.cin the procps package, one can a) include the kernel header file (and recompile if a different kernel is used, b) use the posix sysconf() function, which, sadly, uses a hard-coded value compiled into the c library, or c) ask the kernel, and there's no official interface to doing that. So, the code includes a series of kludges by which it determines the correct value. Wow.
– mattdm
Feb 22 '11 at 21:54
1
Thepsmanpage states thattimeis "cumulative CPU time". I think what the OP was looking for isetime, or "the elapsed time since the process was started". pubs.opengroup.org/onlinepubs/000095399/utilities/ps.html
– rinogo
Apr 23 '14 at 20:35
1
Not so "portable" after all: "ps: stime: keyword not found" on FreeBSD. It does at least supportetime, though.
– n.st
May 23 '16 at 11:34
add a comment |
Portable:
% ps -o stime,time $$
STIME TIME
Jan30 00:00:06
i.e. that shell was started on January 30 and totaled about 6 seconds of CPU time.
There may be more precise or more parseable but less portable ways to get this information. Check the documentation of your ps command or your proc filesystem.
Under Linux, this information lives in /proc/$pid/stat.
awk 'print "CPU time: " $14+$15; print "start time: " $22' /proc/$$/stat
The CPU time is in jiffies; I don't know offhand how to find the jiffy value from the shell. The start time is relative to the boot time (found in /proc/uptime).
3
Finding the value of HZ (that is, jiffies per second) turns out to be ridiculously complicated! From comments in thesysinfo.cin the procps package, one can a) include the kernel header file (and recompile if a different kernel is used, b) use the posix sysconf() function, which, sadly, uses a hard-coded value compiled into the c library, or c) ask the kernel, and there's no official interface to doing that. So, the code includes a series of kludges by which it determines the correct value. Wow.
– mattdm
Feb 22 '11 at 21:54
1
Thepsmanpage states thattimeis "cumulative CPU time". I think what the OP was looking for isetime, or "the elapsed time since the process was started". pubs.opengroup.org/onlinepubs/000095399/utilities/ps.html
– rinogo
Apr 23 '14 at 20:35
1
Not so "portable" after all: "ps: stime: keyword not found" on FreeBSD. It does at least supportetime, though.
– n.st
May 23 '16 at 11:34
add a comment |
Portable:
% ps -o stime,time $$
STIME TIME
Jan30 00:00:06
i.e. that shell was started on January 30 and totaled about 6 seconds of CPU time.
There may be more precise or more parseable but less portable ways to get this information. Check the documentation of your ps command or your proc filesystem.
Under Linux, this information lives in /proc/$pid/stat.
awk 'print "CPU time: " $14+$15; print "start time: " $22' /proc/$$/stat
The CPU time is in jiffies; I don't know offhand how to find the jiffy value from the shell. The start time is relative to the boot time (found in /proc/uptime).
Portable:
% ps -o stime,time $$
STIME TIME
Jan30 00:00:06
i.e. that shell was started on January 30 and totaled about 6 seconds of CPU time.
There may be more precise or more parseable but less portable ways to get this information. Check the documentation of your ps command or your proc filesystem.
Under Linux, this information lives in /proc/$pid/stat.
awk 'print "CPU time: " $14+$15; print "start time: " $22' /proc/$$/stat
The CPU time is in jiffies; I don't know offhand how to find the jiffy value from the shell. The start time is relative to the boot time (found in /proc/uptime).
answered Feb 22 '11 at 21:31
GillesGilles
545k12811071622
545k12811071622
3
Finding the value of HZ (that is, jiffies per second) turns out to be ridiculously complicated! From comments in thesysinfo.cin the procps package, one can a) include the kernel header file (and recompile if a different kernel is used, b) use the posix sysconf() function, which, sadly, uses a hard-coded value compiled into the c library, or c) ask the kernel, and there's no official interface to doing that. So, the code includes a series of kludges by which it determines the correct value. Wow.
– mattdm
Feb 22 '11 at 21:54
1
Thepsmanpage states thattimeis "cumulative CPU time". I think what the OP was looking for isetime, or "the elapsed time since the process was started". pubs.opengroup.org/onlinepubs/000095399/utilities/ps.html
– rinogo
Apr 23 '14 at 20:35
1
Not so "portable" after all: "ps: stime: keyword not found" on FreeBSD. It does at least supportetime, though.
– n.st
May 23 '16 at 11:34
add a comment |
3
Finding the value of HZ (that is, jiffies per second) turns out to be ridiculously complicated! From comments in thesysinfo.cin the procps package, one can a) include the kernel header file (and recompile if a different kernel is used, b) use the posix sysconf() function, which, sadly, uses a hard-coded value compiled into the c library, or c) ask the kernel, and there's no official interface to doing that. So, the code includes a series of kludges by which it determines the correct value. Wow.
– mattdm
Feb 22 '11 at 21:54
1
Thepsmanpage states thattimeis "cumulative CPU time". I think what the OP was looking for isetime, or "the elapsed time since the process was started". pubs.opengroup.org/onlinepubs/000095399/utilities/ps.html
– rinogo
Apr 23 '14 at 20:35
1
Not so "portable" after all: "ps: stime: keyword not found" on FreeBSD. It does at least supportetime, though.
– n.st
May 23 '16 at 11:34
3
3
Finding the value of HZ (that is, jiffies per second) turns out to be ridiculously complicated! From comments in the
sysinfo.c in the procps package, one can a) include the kernel header file (and recompile if a different kernel is used, b) use the posix sysconf() function, which, sadly, uses a hard-coded value compiled into the c library, or c) ask the kernel, and there's no official interface to doing that. So, the code includes a series of kludges by which it determines the correct value. Wow.– mattdm
Feb 22 '11 at 21:54
Finding the value of HZ (that is, jiffies per second) turns out to be ridiculously complicated! From comments in the
sysinfo.c in the procps package, one can a) include the kernel header file (and recompile if a different kernel is used, b) use the posix sysconf() function, which, sadly, uses a hard-coded value compiled into the c library, or c) ask the kernel, and there's no official interface to doing that. So, the code includes a series of kludges by which it determines the correct value. Wow.– mattdm
Feb 22 '11 at 21:54
1
1
The
ps manpage states that time is "cumulative CPU time". I think what the OP was looking for is etime, or "the elapsed time since the process was started". pubs.opengroup.org/onlinepubs/000095399/utilities/ps.html– rinogo
Apr 23 '14 at 20:35
The
ps manpage states that time is "cumulative CPU time". I think what the OP was looking for is etime, or "the elapsed time since the process was started". pubs.opengroup.org/onlinepubs/000095399/utilities/ps.html– rinogo
Apr 23 '14 at 20:35
1
1
Not so "portable" after all: "ps: stime: keyword not found" on FreeBSD. It does at least support
etime, though.– n.st
May 23 '16 at 11:34
Not so "portable" after all: "ps: stime: keyword not found" on FreeBSD. It does at least support
etime, though.– n.st
May 23 '16 at 11:34
add a comment |
ps -eo pid,comm,cmd,start,etime | grep -i X
X is the name of the process
1
should probably add a grep -v grep.
– Brian
Jun 30 '14 at 20:07
ps -o pid,comm,cmd,start,etime -p Xto look at PID X.
– codeforester
Jul 9 '18 at 17:06
add a comment |
ps -eo pid,comm,cmd,start,etime | grep -i X
X is the name of the process
1
should probably add a grep -v grep.
– Brian
Jun 30 '14 at 20:07
ps -o pid,comm,cmd,start,etime -p Xto look at PID X.
– codeforester
Jul 9 '18 at 17:06
add a comment |
ps -eo pid,comm,cmd,start,etime | grep -i X
X is the name of the process
ps -eo pid,comm,cmd,start,etime | grep -i X
X is the name of the process
edited Aug 28 '13 at 8:30
Anthon
61.4k17107170
61.4k17107170
answered Aug 28 '13 at 8:11
mezimezi
7041917
7041917
1
should probably add a grep -v grep.
– Brian
Jun 30 '14 at 20:07
ps -o pid,comm,cmd,start,etime -p Xto look at PID X.
– codeforester
Jul 9 '18 at 17:06
add a comment |
1
should probably add a grep -v grep.
– Brian
Jun 30 '14 at 20:07
ps -o pid,comm,cmd,start,etime -p Xto look at PID X.
– codeforester
Jul 9 '18 at 17:06
1
1
should probably add a grep -v grep.
– Brian
Jun 30 '14 at 20:07
should probably add a grep -v grep.
– Brian
Jun 30 '14 at 20:07
ps -o pid,comm,cmd,start,etime -p X to look at PID X.– codeforester
Jul 9 '18 at 17:06
ps -o pid,comm,cmd,start,etime -p X to look at PID X.– codeforester
Jul 9 '18 at 17:06
add a comment |
ps takes a -o option to specify the output format, and one of the available columns is etime. According to the man page:
etime - elapsed time since the process was started, in the form [[dd-]hh:]mm:ss.
Thus you can run this to get the PID and elapsed time of every process:
$ ps -eo pid,etime
If you want the elapsed time of a particular PID (e.g. 12345), you can do something like:
$ ps -eo pid,etime | awk '/^12345/ print $2'
(Edit: Turns out there's a shorter syntax for the above command; see mattdm's answer)
add a comment |
ps takes a -o option to specify the output format, and one of the available columns is etime. According to the man page:
etime - elapsed time since the process was started, in the form [[dd-]hh:]mm:ss.
Thus you can run this to get the PID and elapsed time of every process:
$ ps -eo pid,etime
If you want the elapsed time of a particular PID (e.g. 12345), you can do something like:
$ ps -eo pid,etime | awk '/^12345/ print $2'
(Edit: Turns out there's a shorter syntax for the above command; see mattdm's answer)
add a comment |
ps takes a -o option to specify the output format, and one of the available columns is etime. According to the man page:
etime - elapsed time since the process was started, in the form [[dd-]hh:]mm:ss.
Thus you can run this to get the PID and elapsed time of every process:
$ ps -eo pid,etime
If you want the elapsed time of a particular PID (e.g. 12345), you can do something like:
$ ps -eo pid,etime | awk '/^12345/ print $2'
(Edit: Turns out there's a shorter syntax for the above command; see mattdm's answer)
ps takes a -o option to specify the output format, and one of the available columns is etime. According to the man page:
etime - elapsed time since the process was started, in the form [[dd-]hh:]mm:ss.
Thus you can run this to get the PID and elapsed time of every process:
$ ps -eo pid,etime
If you want the elapsed time of a particular PID (e.g. 12345), you can do something like:
$ ps -eo pid,etime | awk '/^12345/ print $2'
(Edit: Turns out there's a shorter syntax for the above command; see mattdm's answer)
edited Apr 13 '17 at 12:36
Community♦
1
1
answered Feb 22 '11 at 21:20
Michael Mrozek♦Michael Mrozek
62.1k29193213
62.1k29193213
add a comment |
add a comment |
Unsure why this has not yet been suggested: on Linux you can stat() the /proc/[nnn] directory for your PID.
This behavior is explicitly designed to return the process start time, which it can do at high resolution, and which the kernel can do accurately without the jiffies hacks since the kernel can (obviously) simply check the relevant information. The access, data-modification and status change fields all return the process start time.
Best of all, you can use stat(1) at the shell, or the appropriate binding to stat(2) from $favorite_programming_language, so you may not even need to launch an external process.
NOTE that this does not work with /usr/compat/linux/proc on FreeBSD; the access/modification/status-change times returned are the current time, and the birth time is the UNIX epoch. Quite stupid the support isn't there if you ask me.
Where in the output of stat do I see the info? I only see Access, Modify, and Change.
– Tshepang
Jan 8 '17 at 22:52
@Tshepang Note that those values are all the same, and they are the process start time. You still have to do the math, but this is definitely better than trying to figure out jiffies as noted in my answer.
– mattdm
Mar 2 '17 at 16:53
add a comment |
Unsure why this has not yet been suggested: on Linux you can stat() the /proc/[nnn] directory for your PID.
This behavior is explicitly designed to return the process start time, which it can do at high resolution, and which the kernel can do accurately without the jiffies hacks since the kernel can (obviously) simply check the relevant information. The access, data-modification and status change fields all return the process start time.
Best of all, you can use stat(1) at the shell, or the appropriate binding to stat(2) from $favorite_programming_language, so you may not even need to launch an external process.
NOTE that this does not work with /usr/compat/linux/proc on FreeBSD; the access/modification/status-change times returned are the current time, and the birth time is the UNIX epoch. Quite stupid the support isn't there if you ask me.
Where in the output of stat do I see the info? I only see Access, Modify, and Change.
– Tshepang
Jan 8 '17 at 22:52
@Tshepang Note that those values are all the same, and they are the process start time. You still have to do the math, but this is definitely better than trying to figure out jiffies as noted in my answer.
– mattdm
Mar 2 '17 at 16:53
add a comment |
Unsure why this has not yet been suggested: on Linux you can stat() the /proc/[nnn] directory for your PID.
This behavior is explicitly designed to return the process start time, which it can do at high resolution, and which the kernel can do accurately without the jiffies hacks since the kernel can (obviously) simply check the relevant information. The access, data-modification and status change fields all return the process start time.
Best of all, you can use stat(1) at the shell, or the appropriate binding to stat(2) from $favorite_programming_language, so you may not even need to launch an external process.
NOTE that this does not work with /usr/compat/linux/proc on FreeBSD; the access/modification/status-change times returned are the current time, and the birth time is the UNIX epoch. Quite stupid the support isn't there if you ask me.
Unsure why this has not yet been suggested: on Linux you can stat() the /proc/[nnn] directory for your PID.
This behavior is explicitly designed to return the process start time, which it can do at high resolution, and which the kernel can do accurately without the jiffies hacks since the kernel can (obviously) simply check the relevant information. The access, data-modification and status change fields all return the process start time.
Best of all, you can use stat(1) at the shell, or the appropriate binding to stat(2) from $favorite_programming_language, so you may not even need to launch an external process.
NOTE that this does not work with /usr/compat/linux/proc on FreeBSD; the access/modification/status-change times returned are the current time, and the birth time is the UNIX epoch. Quite stupid the support isn't there if you ask me.
answered Jan 7 '17 at 23:57
i336_i336_
361317
361317
Where in the output of stat do I see the info? I only see Access, Modify, and Change.
– Tshepang
Jan 8 '17 at 22:52
@Tshepang Note that those values are all the same, and they are the process start time. You still have to do the math, but this is definitely better than trying to figure out jiffies as noted in my answer.
– mattdm
Mar 2 '17 at 16:53
add a comment |
Where in the output of stat do I see the info? I only see Access, Modify, and Change.
– Tshepang
Jan 8 '17 at 22:52
@Tshepang Note that those values are all the same, and they are the process start time. You still have to do the math, but this is definitely better than trying to figure out jiffies as noted in my answer.
– mattdm
Mar 2 '17 at 16:53
Where in the output of stat do I see the info? I only see Access, Modify, and Change.
– Tshepang
Jan 8 '17 at 22:52
Where in the output of stat do I see the info? I only see Access, Modify, and Change.
– Tshepang
Jan 8 '17 at 22:52
@Tshepang Note that those values are all the same, and they are the process start time. You still have to do the math, but this is definitely better than trying to figure out jiffies as noted in my answer.
– mattdm
Mar 2 '17 at 16:53
@Tshepang Note that those values are all the same, and they are the process start time. You still have to do the math, but this is definitely better than trying to figure out jiffies as noted in my answer.
– mattdm
Mar 2 '17 at 16:53
add a comment |
If you can run time and then execute a command you will get exactly what you are looking for. You cannot do this against an already-running command.
[0] % time sleep 20
sleep 20 0.00s user 0.00s system 0% cpu 20.014 total
Do you know how can I do it on a running process monitoring until it ends?
– lrkwz
Nov 21 '12 at 22:56
add a comment |
If you can run time and then execute a command you will get exactly what you are looking for. You cannot do this against an already-running command.
[0] % time sleep 20
sleep 20 0.00s user 0.00s system 0% cpu 20.014 total
Do you know how can I do it on a running process monitoring until it ends?
– lrkwz
Nov 21 '12 at 22:56
add a comment |
If you can run time and then execute a command you will get exactly what you are looking for. You cannot do this against an already-running command.
[0] % time sleep 20
sleep 20 0.00s user 0.00s system 0% cpu 20.014 total
If you can run time and then execute a command you will get exactly what you are looking for. You cannot do this against an already-running command.
[0] % time sleep 20
sleep 20 0.00s user 0.00s system 0% cpu 20.014 total
answered Feb 25 '11 at 17:56
slashdotslashdot
61053
61053
Do you know how can I do it on a running process monitoring until it ends?
– lrkwz
Nov 21 '12 at 22:56
add a comment |
Do you know how can I do it on a running process monitoring until it ends?
– lrkwz
Nov 21 '12 at 22:56
Do you know how can I do it on a running process monitoring until it ends?
– lrkwz
Nov 21 '12 at 22:56
Do you know how can I do it on a running process monitoring until it ends?
– lrkwz
Nov 21 '12 at 22:56
add a comment |
$ ps -eo lstart get start time
$ ps -eo etime get duration/elapsed time
$ ps -eo pid,lstart,etime | grep 61819
PID STARTED ELAPSED
61819 Mon Sep 17 03:01:35 2018 07:52:15
61819 is the process id.
add a comment |
$ ps -eo lstart get start time
$ ps -eo etime get duration/elapsed time
$ ps -eo pid,lstart,etime | grep 61819
PID STARTED ELAPSED
61819 Mon Sep 17 03:01:35 2018 07:52:15
61819 is the process id.
add a comment |
$ ps -eo lstart get start time
$ ps -eo etime get duration/elapsed time
$ ps -eo pid,lstart,etime | grep 61819
PID STARTED ELAPSED
61819 Mon Sep 17 03:01:35 2018 07:52:15
61819 is the process id.
$ ps -eo lstart get start time
$ ps -eo etime get duration/elapsed time
$ ps -eo pid,lstart,etime | grep 61819
PID STARTED ELAPSED
61819 Mon Sep 17 03:01:35 2018 07:52:15
61819 is the process id.
answered Sep 17 '18 at 4:57
Terry wangTerry wang
112
112
add a comment |
add a comment |
you can get the start time of the process by looking at the stat of the stat file produced by proc, format it using date and subtract it from the current time:
echo $(( $(date +%s) - $(date -d "$(stat /proc/13494/stat | grep Modify | sed 's/Modify: //')" +%s) ))
where 13494 is your process' pid
add a comment |
you can get the start time of the process by looking at the stat of the stat file produced by proc, format it using date and subtract it from the current time:
echo $(( $(date +%s) - $(date -d "$(stat /proc/13494/stat | grep Modify | sed 's/Modify: //')" +%s) ))
where 13494 is your process' pid
add a comment |
you can get the start time of the process by looking at the stat of the stat file produced by proc, format it using date and subtract it from the current time:
echo $(( $(date +%s) - $(date -d "$(stat /proc/13494/stat | grep Modify | sed 's/Modify: //')" +%s) ))
where 13494 is your process' pid
you can get the start time of the process by looking at the stat of the stat file produced by proc, format it using date and subtract it from the current time:
echo $(( $(date +%s) - $(date -d "$(stat /proc/13494/stat | grep Modify | sed 's/Modify: //')" +%s) ))
where 13494 is your process' pid
answered Aug 10 '18 at 10:12
bobbinsbobbins
1
1
add a comment |
add a comment |
Time elapsed in seconds: expr $(date +"%s") - $(stat -c%X /proc/<PID HERE>)
This seems to me to be a very slight variation of one that mattdm mentioned already:date +%s --date="now - $( stat -c%X /proc/$$
– Jeff Schaller♦
2 days ago
That one didn't work for me on my very minimal Alpine docker instance so I wrote this one
– Shard
2 days ago
add a comment |
Time elapsed in seconds: expr $(date +"%s") - $(stat -c%X /proc/<PID HERE>)
This seems to me to be a very slight variation of one that mattdm mentioned already:date +%s --date="now - $( stat -c%X /proc/$$
– Jeff Schaller♦
2 days ago
That one didn't work for me on my very minimal Alpine docker instance so I wrote this one
– Shard
2 days ago
add a comment |
Time elapsed in seconds: expr $(date +"%s") - $(stat -c%X /proc/<PID HERE>)
Time elapsed in seconds: expr $(date +"%s") - $(stat -c%X /proc/<PID HERE>)
answered 2 days ago
ShardShard
1137
1137
This seems to me to be a very slight variation of one that mattdm mentioned already:date +%s --date="now - $( stat -c%X /proc/$$
– Jeff Schaller♦
2 days ago
That one didn't work for me on my very minimal Alpine docker instance so I wrote this one
– Shard
2 days ago
add a comment |
This seems to me to be a very slight variation of one that mattdm mentioned already:date +%s --date="now - $( stat -c%X /proc/$$
– Jeff Schaller♦
2 days ago
That one didn't work for me on my very minimal Alpine docker instance so I wrote this one
– Shard
2 days ago
This seems to me to be a very slight variation of one that mattdm mentioned already:
date +%s --date="now - $( stat -c%X /proc/$$ – Jeff Schaller♦
2 days ago
This seems to me to be a very slight variation of one that mattdm mentioned already:
date +%s --date="now - $( stat -c%X /proc/$$ – Jeff Schaller♦
2 days ago
That one didn't work for me on my very minimal Alpine docker instance so I wrote this one
– Shard
2 days ago
That one didn't work for me on my very minimal Alpine docker instance so I wrote this one
– Shard
2 days ago
add a comment |
Thanks for contributing an answer to Unix & Linux Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f7870%2fhow-to-check-how-long-a-process-has-been-running%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown