監視アプリからプロセスを起動することでこれを回避したいと思います。
procps(-ng)
からのps
を使用するLinux(およびPOSIXで指定されているため、他のほとんどのシステム):
_ps -o etime= -p "$$"
_
ここで、_$$
_は、確認するプロセスのPIDです。これは_[[dd-]hh:]mm:ss
_の形式で経過時間を返します。
_-o etime
_を使用すると、ps
に経過時間フィールドだけが必要であることを伝え、その最後の_=
_はヘッダーを抑制します(なしで、ELAPSED
そして、次の行の時間;と、あなたは時間を1行だけ取得します)。
または、LinuxまたはFreeBSD 9.0以上(およびその他)のprocps-ngツールスイートの新しいバージョン(3.3.0以上)では、以下を使用します。
_ps -o etimes= -p "$$"
_
(s
を追加して)時間を秒単位でフォーマットします。これはスクリプトでより便利です。
Linuxでは、ps
プログラムはこれを_/proc/$$/stat
_から取得します。ここで、フィールドの1つ(_man proc
_を参照)はプロセスの開始時間です。残念ながら、これはシステムが起動してからの時間(Linuxカーネルで使用される任意の時間カウンター)で指定されます。したがって、システムが起動した時刻(_/proc/stat
_から)、このシステムの1秒あたりのjiffyの数を決定し、計算を行って、経過時間を有効な形式で取得する必要があります。
HZの値(つまり1秒あたりのjiffies)を見つけるのは、途方もなく複雑であることがわかります。 procpsパッケージの_sysinfo.c
_のコメントから、A)カーネルヘッダーファイルをインクルードし、別のカーネルが使用されている場合は再コンパイルすることができます。B)posix sysconf()
関数を使用します。 Cライブラリにコンパイルされたハードコードされた値、またはC)カーネルに問い合わせますが、それを行う公式のインターフェースはありません。したがって、ps
コードには、正しい値を決定する一連のクラッジが含まれています。ワオ。
したがって、ps
がすべてを実行するのが便利です。 :)
ユーザー@ 336_がメモしているように、Linux(これは移植可能ではありません)では、stat
コマンドを使用して、ディレクトリ_/proc/$$
_のアクセス、変更、またはステータス変更の日付を確認できます(ここでも_$$
_は対象のプロセスです)。 3つの数値はすべて同じであるため、
_stat -c%X /proc/$$
_
エポックからの秒数で、プロセスが_$$
_を開始した時間を示します。それでも、現在の時間からそれを減算して経過時間を取得するために数学を実行する必要があるので、それはまだあなたが望むものではありません— date +%s --date="now - $( stat -c%X /proc/$$ ) seconds"
のようなものはうまくいくと思いますが、少し不合理です。 1つのpossibleの利点は、_-c%x
_ではなく_-c%X
_のような長い形式の出力を使用すると、整数秒よりも高い解像度が得られることです。ただし、それが必要な場合は、statコマンドを実行するタイミングが正確さを妨げるので、おそらくプロセス監査アプローチを使用する必要があります。
ポータブル:
% 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
)。
ps -eo pid,comm,cmd,start,etime | grep -i X
Xはプロセスの名前です
ps
は-o
オプションを使用して出力形式を指定します。使用可能な列の1つはetime
です。マニュアルページによると:
etime-プロセスが開始されてからの経過時間。形式は[[dd-] hh:] mm:ssです。
したがって、これを実行して、すべてのプロセスのPIDと経過時間を取得できます。
$ ps -eo pid,etime
特定のPIDの経過時間(12345など)が必要な場合は、次のようにします。
$ ps -eo pid,etime | awk '/^12345/ {print $2}'
(Edit:上記のコマンドにはより短い構文があることが判明しました; mattdmの回答 を参照してください)
これがまだ提案されていない理由が不明です:Linuxの場合 PIDの/ proc/[nnn]ディレクトリをstat()
できます。
この動作は、プロセスの開始時間を返すように明示的に設計されています。これは、高解像度で実行でき、カーネルは(明らかに)単純に関連情報をチェックできるため、jiffiesハックなしで正確に実行できます。アクセス、データ変更、およびステータス変更のフィールドはすべて、プロセスの開始時刻を返します。
何よりも、シェルでstat(1)
を使用するか、$ favorite_programming_languageからstat(2)
への適切なバインディングを使用できるため、外部プロセスを起動する必要がない場合もあります。
[〜#〜] note [〜#〜]これは機能not/usr/compat/linux/proc
FreeBSD;返されるアクセス/変更/ステータス変更時刻は現在の時刻であり、誕生時刻はUNIXエポックです。あなたが私に尋ねるなら、かなり愚かなサポートがそこにありません。
実行してコマンドを実行できる場合は、探しているものが正確に得られます。すでに実行中のコマンドに対してこれを行うことはできません。
[0]睡眠時間の割合20
スリープ20 0.00sユーザー0.00sシステム0%cpu 20.014合計
$ 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>)
stat
によって生成されたstatファイルのproc
を調べ、date
を使用してフォーマットし、現在の時刻から減算することで、プロセスの開始時刻を取得できます。
echo $(( $(date +%s) - $(date -d "$(stat /proc/13494/stat | grep Modify | sed 's/Modify: //')" +%s) ))
どこ 13494
はプロセスのpidです