プロセスが実行されている時間を確認する方法は?


243

これを回避するには、監視アプリからプロセスを起動します。

回答:


311

psfrom procps(-ng)(およびPOSIXで指定されているため、他のほとんどのシステム)を使用するLinux :

ps -o etime= -p "$$" 

$$チェックするプロセスのPIDはどこにありますか。これは、経過時間を形式で返します[[dd-]hh:]mm:ss

を使用する-o etimeps、経過時間フィールドだけが必要であり、=その最後にヘッダーが表示されないことがわかります(なしでELAPSED、次の行に時間を示す行が表示されます。 。

または、LinuxまたはFreeBSD 9.0以降(および場合によってはその他)の新しいバージョンのprocps-ngツールスイート(3.3.0以降)では、次を使用します。

ps -o etimes= -p "$$"

(追加s)を使用して、時間を秒単位でフォーマットします。これはスクリプトでより便利です。

Linuxでは、psプログラムはこれをから取得/proc/$$/statします。フィールドの1つ(を参照man proc)はプロセスの開始時間です。残念ながら、これはシステム起動後のjiffies(Linuxカーネルで使用される任意の時間カウンター)の時間として指定されます。したがって、システムが起動する時間(から/proc/stat)、このシステムでの1秒あたりのジフィー数を決定し、数学を実行して経過時間を有用な形式で取得する必要があります。

HZの値(つまり、1秒あたりのjiffies)を見つけるのはとてつもなく複雑です。sysinfo.cprocpsパッケージのコメントから、A)カーネルヘッダーファイルをインクルードし、別のカーネルが使用されている場合は再コンパイルできます。B)posix sysconf()関数を使用します。C)カーネルに尋ねますが、それを行うための公式のインターフェースはありません。そのため、psコードには一連のクラッジが含まれており、それによって正しい値が決定されます。ワオ。

そのため、それpsはすべてあなたにとって便利です。:)

ユーザー(@ 336_)はLinux(これは移植性がありません)では、statコマンドを使用して、ディレクトリのアクセス、変更、またはステータス変更の日付を確認できます/proc/$$(ここでも$$目的のプロセスです)。3つの数字はすべて同じでなければなりません。

stat -c%X /proc/$$

プロセス$$が開始された時間を、エポックからの秒数で示します。経過時間を取得するために現在の時間からそれを減算する計算を行う必要があるので、それはまだあなたが望んでいるものとはまったくdate +%s --date="now - $( stat -c%X /proc/$$ ) seconds"異なります。考えられる利点の1つ-c%x-c%X、の代わりに長い形式の出力を使用すると、整数秒よりも高い解像度が得られることです。ただし、必要な場合は、statコマンドを実行するタイミングが正確性を妨げるため、プロセス監査アプローチを使用する必要があります。


1
こんにちは!あるetime=タイプミスは?etimeマニュアルページでしか見つけることができません。
ケントパワー

16
@KentPawarそれはタイプミスではありません。空の場合=、ヘッダーは抑制されます。試してみるか、試してくださいps -p $$ -o etime="Silly Header Here"
mattdm

4
ps -p $(pgrep find)-o etime =
マフロシス

1
いいね 私が好むetimes、それは機械読み取り可能だとして自分自身を
Asfand Qazi

1
@alexmurrayこれは単に呼び出しsysconf()、したがって、Cライブラリからハードコードされた値を提供します。
mattdm

36

ポータブル:

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

つまり、そのシェルは1月30日に開始され、合計で約6秒のCPU時間になりました。

この情報を取得する方法は、より正確または解析可能ですが、移植性の低い方法があります。psコマンドまたはprocファイルシステムのドキュメントを確認してください。

Linuxでは、この情報はにあり/proc/$pid/statます。

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

CPU時間はわずかです。シェルからjiffy値を見つける方法を知らない。開始時間は、ブート時間に関連しています(にあります/proc/uptime)。


3
HZの値(つまり、1秒あたりのjiffies)を見つけるのはとてつもなく複雑です!sysinfo.cprocpsパッケージのコメントから、a)カーネルヘッダーファイルを含めることができます(異なるカーネルが使用されている場合は再コンパイルします、b)posix sysconf()関数を使用します。 cライブラリ、またはc)カーネルに問い合わせます。これを行うための公式のインターフェースはありません。そのため、コードには一連のクラッジが含まれており、それによって正しい値が決定されます。ワオ。
mattdm

1
psマニュアルによるtime「累積CPU時間」です。OPが探していたのはetime、または「プロセスが開始されてからの経過時間」だと思います。pubs.opengroup.org/onlinepubs/000095399/utilities/ps.html
rinogo

1
結局のところ「ポータブル」ではありません:FreeBSDでは「ps:stime:キーワードが見つかりません」etimeただし、少なくともサポートしています。
n.st


13

ps-o出力形式を指定するオプションを取り、使用可能な列の1つはetimeです。manページによると:

etime-プロセスが開始されてからの経過時間([[dd-] hh:] mm:ss形式)。

したがって、これを実行して、すべてのプロセスのPIDと経過時間を取得できます。

$ ps -eo pid,etime

特定のPID(例:12345)の経過時間が必要な場合は、次のようなことができます。

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

編集:上記のコマンドには短い構文があります。mattdmの回答を参照してください)


5

これがまだ提案されていない理由は不明です。Linuxではstat()、PIDの/ proc / [nnn]ディレクトリを使用できます。

この動作は、プロセスの開始時間を返すように明示的に設計されており、高解像度で実行でき、カーネルは(明らかに)関連情報を簡単に確認できるため、jiffiesのハッキングなしで正確に実行できます。アクセス、データ変更、およびステータス変更フィールドはすべて、プロセスの開始時間を返します。

何よりもstat(1)、シェルまたはstat(2)$ favorite_programming_languageからの適切なバインドで使用できるため、外部プロセスを起動する必要さえありません。

注意これはないということではないと動作/usr/compat/linux/procFreeBSD上で、返されるaccess / modification / status-change時間は現在の時間であり、誕生時間はUNIXエポックです。あなたが私に尋ねると、サポートはそこにありません。


statの出力のどこに情報が表示されますか?アクセス、変更、変更のみが表示されます。
シェパン

これらの値がすべて同じであり、彼らがいることに注意してください@Tshepang あるプロセスの開始時刻。あなたはまだ数学をしなければなりませんが、これは私の答えに記されているようにジフィーを理解しようとするよりも間違いなく良いです。
mattdm

次のように呼び出します。stat /proc/4480これにより、プロセスの生年月日、変更日、変更日、アクセス日がわかります。あなたはプロセスIDが必要な場合は、単に「トップ」を使用
user890332

2

時間を実行してからコマンドを実行できる場合、探しているものを正確に取得できます。すでに実行中のコマンドに対してこれを行うことはできません。

[0]睡眠時間20%

スリープ20 0.00sユーザー0.00sシステム0%CPU 20.014合計


終了するまで、実行中のプロセス監視でそれを行う方法を知っていますか?
lrkwz

1

プロセスの開始時刻を取得するには、statで生成されたstatファイルを見て、現在の時刻からprocそれを使用dateしてフォーマットし、減算します。

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

13494あなたのプロセスのpidはどこですか



1

秒単位の経過時間: expr $(date +"%s") - $(stat -c%X /proc/<PID HERE>)


これは、1つの非常にわずかな変化であることを私には思えるすでに述べたmattdmdate +%s --date="now - $( stat -c%X /proc/$$
ジェフ・シャラーは

それは私の非常に最小限のAlpine Dockerインスタンスでは動作しなかったので、これを書きました
Shardj
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.