psはiso日付形式で出力されますか?

psはiso日付形式で出力されますか?

lstart(プロセス開始)に基づいて出力をソートしたいと思います。

ps -eo lstart,pid,cmd 

YYYY-MM-DD HH:MM:SSと同じISO形式でlstartを出力する方法はありますか?

しかし、ソートだけでは問題は解決しません。 ISO日付形式が本当に欲しいです。

答え1

lstartISO形式で出力する方法はありますかYYYY-MM-DD HH:MM:SS

そしてawk+date協力:

ps -eo lstart,pid,cmd --sort=start_time | awk '{ 
       cmd="date -d\""$1 FS $2 FS $3 FS $4 FS $5"\" +\047%Y-%m-%d %H:%M:%S\047"; 
       cmd | getline d; close(cmd); $1=$2=$3=$4=$5=""; printf "%s\n",d$0 }'

代替使用方法メモ etimesキーワード(プロセスが開始されてから経過した時間(秒)):

ps -eo etimes,pid,cmd --sort=etimes | awk '{ 
       cmd="date -d -"$1"seconds +\047%Y-%m-%d %H:%M:%S\047"; 
       cmd | getline d; close(cmd); $1=""; printf "%s\n",d$0 }' 
  • date -d -"$1"seconds-elapsed現在のタイムスタンプと時間の差が提供されます。タイムスタンププロセス値

答え2

次の基準で並べ替えることができます。

ps -eo lstart,pid,cmd --sort=start_time

答え3

これはlstart標準のUnix列の1つではないことに注意してくださいps

すべてのシステムに出力があるわけではなく、出力は実装ごとに異なり、ロケールごとに異なる場合があります。

たとえば、FreeBSD またはpsfrom procps-ng(非組み込み Linux システムで一般的に見られる)とCロケールを使用すると、次のようになります。

Wed Nov  1 12:36:15 2017

macOSの場合:

Wed  1 Nov 12:36:15 2017

また、GMTオフセットを提供しないため、DSTを実装するタイムゾーン(同じ日付に同じ時間が2回発生する)では、出力はあいまいで常に時系列に並べ替えられません。

ここでは、時間をUTCに設定し、さまざまな自然形式を理解する方法で日付を解析するモジュールをperl使用できます。Date::Manip

(export TZ=UTC0 LC_ALL=C
  ps -A -o lstart= -o pid= -o args= |
    perl -MDate::Manip -lpe '
      s/^(\s*\S+){5}/UnixDate(ParseDate($&), "%Y-%m-%dT%T+00:00")/e' |
    sort
)

または、ksh93次の日付形式も認識できます。

(export TZ=UTC0 LC_ALL=C
  unset -v IFS
  ps -A -o lstart= -o pid= -o args= |
    while read -r a b c d e rest; do
      printf '%(%FT%T+00:00)T %s\n' "$a $b $c $d $e" "$rest"
    done
)

(各行から末尾のスペースを削除します)

またはzshGNUを使用すると、次のようになりますdate

(export LC_ALL=C TZ=UTC0
  (){
    paste -d '\0' <(cut -c1-24 < $1 | date -f- --iso-8601=s) \
                  <(cut -c25-  < $1) | sort
  } =(ps -A -o lstart= -o pid= -o args=)
)

またはLinux bash(またはzsh)でGNUを使用している場合date

(export LC_ALL=C TZ=UTC0
  {
    paste -d '\0' <(cut -c1-24 | date -f- --iso-8601=s) \
                  <(cut -c25- < /dev/stdin) | sort
  } <<< "$(ps -A -o lstart= -o pid= -o args=)"
)

また、プロセス開始時間は、プロセスがコマンドを最後に実行した時間と必ずしも同じである必要はありません。プロセスは寿命の間に複数のコマンドを実行できるためです(コマンドを実行しないプロセスは通常、コマンドを実行しないプロセスです)。つまり、コマンド(argsフィールド、標準同等cmd)が実行される時間と必ずしも一致するわけではありません。

$ sh -c 'sleep 4; exec sleep 123' & sleep 234 & sleep 5
[1] 9380
[2] 9381
$ (export TZ=UTC0 LC_ALL=C; ps -o lstart,pid,args | perl -MDate::Manip -lpe 's/^(\s*\S+){5}/UnixDate(ParseDate($&), "%Y-%m-%dT%T+00:00")/e')

2017-10-30T17:21:06+00:00  3071 zsh
2017-11-01T15:47:48+00:00  9380 sleep 123
2017-11-01T15:47:48+00:00  9381 sleep 234

4秒後に開始したがsleep 123同時に開始されたと見なされる方法を確認してください。sleep 234これは、9388プロセスが実行さshれる前に(私のインタラクティブシェルから分岐されたコードを実行する前に)最初に実行中(4秒間待機)でした。したがって、そのプロセスの他の時点では、出力にSee:が表示されます。 、次に)。sleep 4sleep 123zshpszshshsleep

答え4

他の答えは古いようです。オプションを見てください--date-format '%Y-%m-%dT%H:%M:%S'

procps-ngこれは最新バージョン(Linux標準)で利用可能です。

関連情報