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 열 중 하나가 아니라는 점에 유의하십시오 ps.

모든 시스템에 출력이 있는 것은 아니며 출력은 구현마다 다르며 로케일마다 다를 수 있습니다.

예를 들어, FreeBSD에서 또는 psfrom 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
)

(각 줄에서 후행 공백을 제거합니다)

또는 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 표준)에서 사용할 수 있습니다.

관련 정보