プロセスの開始後にファイルが作成されたかどうかを識別しようとしています。コマンドps-f -p PID -o lstart =
を使用してプロセスの開始時刻を取得しています 。これにより、 Fri May 5 09:15:35 2017
のような結果が得られます。 タイムゾーン情報はありません。
一方、ファイルシステムはタイムゾーンで日付を教えてくれます。日付を比較すると、間違った結果が得られます。例:
- プロセス開始:
2017-05-05 10:26:57 +0000 UTC
- 変更されたファイル:
2017-05-05 10:26:57.679508679 +0200 CEST
UNIXの日付など、別の形式でプロセスの開始時刻を取得することは可能ですか? (ミリ秒があると役に立ちます)
コンテキスト: ps
を実行しています goアプリケーションからのコマンドと結果の解析。
承認された回答:
ファイルシステムはタイムゾーンで時間を提供しません。それは、現地時間で時間を表示することを選択した場合にタイムゾーンを提供する可能性のある、人間にわかりやすい形式でその時間を表示するために使用するコマンドです( / etc / localtime
、 $ TZ
またはその他)。
一般に、Unixのタイムスタンプは、タイムゾーンに関係のない方法で表現されます。 UNIXエポック時間は、履歴内の正確なイベント(1970-01-01 00:00:00 UTC、明確な時間)。タイムゾーンは、人間にカレンダー形式で日付を表示する場合にのみ画像に表示されます。
ps -o lstart= -p "$pid"
date -r /some/file
どちらも現地時間を提供します。 日付コード> ロケールに応じて、タイムゾーンオフセットを出力する場合としない場合があります。 UTC時刻が必要な場合は、
TZ =UTC0
で実行します。 :
TZ=UTC0 ps -o lstart= -p "$pid"
TZ-UTC0 date -r /some/file # or use date -u
GNU日付コード>
ps
によって報告された日付を解析できます 、したがって、UNIXエポック時間などの任意の形式に変換できます:
(export TZ=UTC0
date -d "$(ps -o lstart -p "$pid") +%s
date -r /some/file +%s)
(上記のUTC時刻を使用します。また、TZ表示のない時刻出力があいまいな1年の1時間を除いて、環境内の現地時間でも機能します(DSTを実装するゾーン)。
いずれの場合も、プロセスの開始時刻は、プロセスが現在実行しているコマンドを実行した時刻である必要はありません(正確に指定することはできません)。例:
$ TZ=UTC0 strace -qtt -e execve sh -c 'sleep 3; exec env ps -o lstart= -p "$$"'
10:27:24.877397 execve("/bin/sh", ["sh", "-c", "sleep 3; exec env ps -o lstart= "...], [/* 28 vars */]) = 0
10:27:27.882553 execve("/usr/bin/env", ["env", "ps", "-o", "lstart=", "-p", "9397"], [/* 28 vars */]) = 0
10:27:27.885272 execve("/bin/ps", ["ps", "-o", "lstart=", "-p", "9397"], [/* 28 vars */]) = 0
Fri May 5 10:27:24 2017
その9397プロセスは、その存続期間中に4つのコマンドを実行しています: strace
(そこで分岐)、 sh
、 env
、 ps
。 ps
によって報告された時間 strace
によってフォークされた時間に対応します 、 ps
を実行したときではありません 。
1秒未満の精度を取得する場合(最大 1 / $(getconf CLK_TCK)
)、 zsh
、次のことができます:
zmodload zsh/datetime
tick=$(getconf CLK_TCK)
(echo $((EPOCHREALTIME + (${${=$(</proc/self/stat)##*)}[20]}. -
${${=$(</proc/$pid/stat)##*)}[20]})/tick)))
つまり、$ pidと新しく作成されたサブシェル(が最後に出現してから20番目のフィールド)の開始時刻を取得します
/ proc / pid / stat
の文字 Linuxの最新バージョンではCLK_TCKで表されます)、差を CLK_TCK
で割ります 現在の時刻に追加します。