lstart
(プロセス開始)に基づいて出力をソートしたいと思います。
ps -eo lstart,pid,cmd
YYYY-MM-DD HH:MM:SSと同じISO形式でlstartを出力する方法はありますか?
しかし、ソートだけでは問題は解決しません。 ISO日付形式が本当に欲しいです。
答え1
lstart
ISO形式で出力する方法はありますか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 またはps
from 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
)
(各行から末尾のスペースを削除します)
またはzsh
GNUを使用すると、次のようになります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 4
sleep 123
zsh
ps
zsh
sh
sleep
答え4
他の答えは古いようです。オプションを見てください--date-format '%Y-%m-%dT%H:%M:%S'
。
procps-ng
これは最新バージョン(Linux標準)で利用可能です。