回答:
ps
from procps(-ng)
(およびPOSIXで指定されているため、他のほとんどのシステム)を使用するLinux :
ps -o etime= -p "$$"
$$
チェックするプロセスのPIDはどこにありますか。これは、経過時間を形式で返します[[dd-]hh:]mm:ss
。
を使用する-o etime
とps
、経過時間フィールドだけが必要であり、=
その最後にヘッダーが表示されないことがわかります(なしで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.c
procpsパッケージのコメントから、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コマンドを実行するタイミングが正確性を妨げるため、プロセス監査アプローチを使用する必要があります。
=
、ヘッダーは抑制されます。試してみるか、試してくださいps -p $$ -o etime="Silly Header Here"
etimes
、それは機械読み取り可能だとして自分自身を
sysconf()
、したがって、Cライブラリからハードコードされた値を提供します。
ポータブル:
% 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
)。
sysinfo.c
procpsパッケージのコメントから、a)カーネルヘッダーファイルを含めることができます(異なるカーネルが使用されている場合は再コンパイルします、b)posix sysconf()関数を使用します。 cライブラリ、またはc)カーネルに問い合わせます。これを行うための公式のインターフェースはありません。そのため、コードには一連のクラッジが含まれており、それによって正しい値が決定されます。ワオ。
ps
マニュアルによるtime
「累積CPU時間」です。OPが探していたのはetime
、または「プロセスが開始されてからの経過時間」だと思います。pubs.opengroup.org/onlinepubs/000095399/utilities/ps.html
etime
ただし、少なくともサポートしています。
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の回答を参照してください)
これがまだ提案されていない理由は不明です。Linuxではstat()
、PIDの/ proc / [nnn]ディレクトリを使用できます。
この動作は、プロセスの開始時間を返すように明示的に設計されており、高解像度で実行でき、カーネルは(明らかに)関連情報を簡単に確認できるため、jiffiesのハッキングなしで正確に実行できます。アクセス、データ変更、およびステータス変更フィールドはすべて、プロセスの開始時間を返します。
何よりもstat(1)
、シェルまたはstat(2)
$ favorite_programming_languageからの適切なバインドで使用できるため、外部プロセスを起動する必要さえありません。
注意これはないということではないと動作/usr/compat/linux/proc
FreeBSD上で、返されるaccess / modification / status-change時間は現在の時間であり、誕生時間はUNIXエポックです。あなたが私に尋ねると、サポートはそこにありません。
stat /proc/4480
これにより、プロセスの生年月日、変更日、変更日、アクセス日がわかります。あなたはプロセスIDが必要な場合は、単に「トップ」を使用
$ 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はプロセスIDです。
秒単位の経過時間: expr $(date +"%s") - $(stat -c%X /proc/<PID HERE>)
date +%s --date="now - $( stat -c%X /proc/$$
etime=
タイプミスは?etime
マニュアルページでしか見つけることができません。