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 열 중 하나가 아니라는 점에 유의하십시오 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를 구현하는 시간대(같은 날짜에 같은 시간이 두 번 발생함)에서는 출력이 모호하며 항상 시간순으로 정렬되지는 않습니다.
여기에서 시간을 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 표준)에서 사용할 수 있습니다.