GNU/Linux >> Linux の 問題 >  >> Linux

タイムゾーンで開始時間を処理しますか?

プロセスの開始後にファイルが作成されたかどうかを識別しようとしています。コマンド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で割ります 現在の時刻に追加します。

関連:bashスクリプトのスペースをエスケープできないのはなぜですか?
Linux
  1. エクスポートありまたはエクスポートなしの変数の定義

  2. PHP でリアルタイム出力を使用してプロセスを実行する

  3. Linux プロセスの状態

  1. Java ProcessBuilder:結果のプロセスがハングする

  2. 長時間実行されている Linux プロセスの開始時刻を取得するには?

  3. 独自のプロセスグループでプロセスを開始する方法は?

  1. CentOS 7 で postgresql サービスを開始できません

  2. execv() と fork() の時間の無駄

  3. ps出力をプロセス開始時間でソートする方法は?