
監視アプリケーションでプロセスを開始してこれを回避したいと思います。
答え1
ps
fromを使用するLinux procps(-ng)
(およびPOSIXで指定されている他のほとんどのシステム):
ps -o etime= -p "$$"
$$
確認したいプロセスのPIDはどこにありますか?これにより経過時間が形式で返されます[[dd-]hh:]mm:ss
。
経過時間だけ-o etime
を知らせるフィールドとその末尾に抑制ヘッダーを使用します(そうでない場合は1行が表示され、次の行には時間が表示されます。を使用すると1行だけが表示されます。時間)。ps
=
ELAPSED
または、LinuxまたはFreeBSD 9.0以降(およびその他のバージョン)の最新バージョンのprocps-ngツールバー(3.3.0以降)の場合は、次のものを使用してください。
ps -o etimes= -p "$$"
(追加s
)時間を秒単位でフォーマットし、スクリプトでより便利に使用します。
Linuxでは、ps
プログラムはこの情報をから取得します/proc/$$/stat
。ここで、フィールドの1つ(参照man proc
)はプロセスの開始時間です。残念ながら、これはシステム起動後のjuffies時間として指定されます(Linuxカーネルで使用される任意の時間カウンタ)。したがって、システムが起動された時間/proc/stat
、システムの1秒あたりのjifiesの数を確認してから、有用な形式で経過時間を得るために数学を実行する必要があります。
HZ(つまり、1秒あたりのジフィー)の値を見つけることは非常に複雑です。 procpsパッケージのコメントによれば、sysinfo.c
A)カーネルヘッダーを含み、他のカーネルを使用するときに再コンパイルするか、B)sysconf()
残念ながら、Cライブラリにコンパイルされたハードコードされた値を使用するposix関数を使用するか、C)カーネルに尋ねることができますあります。しかし、これを行うことができる公式のインターフェースはありません。したがって、コードはps
正しい値を決定するために使用される一連のパッチワークで構成されます。うわー。
ps
これで非常に便利にすべての作業が完了しました。 :)
(ノート:stat -c%X /proc/$$
動作しません。バラより関連質問に対するStéphane Chazelasの回答.)
答え2
持ち運べる:
% ps -o stime,time $$
STIME TIME
Jan30 00:00:06
つまり、1月30日にシェルが始まり、CPU時間を合計6秒ほど占めました。
この情報を取得するにはより正確で構文解析が可能ですが、移植性が悪い方法があるかもしれません。ps
コマンドまたはファイルシステムのマニュアルを確認してくださいproc
。
Linuxでは、この情報は次の場所にあります。/proc/$pid/stat
。
awk '{print "CPU time: " $14+$15; print "start time: " $22}' /proc/$$/stat
CPU 時間は jiffies 単位です。シェルでjiffy値を見つける方法がわかりません。開始時間は開始時間に関連しています(で見つけることができます/proc/uptime
)。
答え3
プロセスのPIDがわからない場合は、名前だけがわかります。
ps -eo pid,comm,cmd,start,etime | grep -i <name of the process>
PIDを知っている場合:
ps -o pid,comm,cmd,start,etime -p <PID>
答え4
まだ提案がない理由はよくわかりません。Linuxでstat()
/ proc / [nnn]ディレクトリにPIDを見つけることができます。
この動作はプロセスの開始時間を返すように明示的に設計されており、高解像度でこれを行うことができ、カーネルは(明らかに)関連情報を簡単に確認できるため、ハッキングなしで正確に実行できます。アクセス、データ変更、および状態変更フィールドはすべてプロセスの開始時間を返します。
とりわけ、stat(1)
これをシェルで使用したり、stat(2)
$favorite_programming_言語の適切なバインディングと一緒に使用したりすることができるので、外部プロセスを開始する必要さえありません。
ノートこれは実際にいいえ/usr/compat/linux/proc
FreeBSDで動作します。返されるアクセス/変更/状態変更時間は現在の時間であり、生成時間はUNIX時代です。私に尋ねたら、サポートを提供しないのは愚かなことです。