docker logs는 특정 컨테이너가 발생시킨 로그들을 가져오기 위해 사용합니다.

docker logs [OPTIONS] CONTAINER

아래는 로컬에 띄워 두었던 MongoDB의 로그를 조회한 결과입니다.

> docker logs e3c
...
2018-05-16T06:39:45.127+0000 I NETWORK  [conn508] end connection 172.17.0.1:38064 (2 connections now open)
2018-05-16T06:39:45.127+0000 I NETWORK  [conn505] end connection 172.17.0.1:38058 (0 connections now open)
2018-05-16T06:39:45.127+0000 I NETWORK  [conn506] end connection 172.17.0.1:38060 (3 connections now open)
2018-05-16T06:39:45.127+0000 I NETWORK  [conn507] end connection 172.17.0.1:38062 (1 connection now open)
...

여기에 아래의 옵션들을 추가할 수 있습니다.

  • --details : 로그에 추가적인 세부 정보를 표시합니다.
  • --follow, -f : 로그를 출력한 후 커맨드를 종료하지 않고, interrupt가 일어날 때까지 그대로 유지합니다.
  • --since : 특정 타임스탬프 이후, 또는 상대적인 시간 이후(42m, 5h 등)의 로그만 출력합니다.
  • --tail : 최근 순으로 n개의 로그만 가져오기 위해 사용합니다. 기본값은 "all"이며, 1, 2, 3처럼 정수 형태로 값을 전달합니다.
  • --timestamps, -t : 로그에 타임스탬프를 함께 표시합니다.
  • --until : 특정 타임스탬프 이전, 또는 상대적인 시간 이전의 로그만 출력합니다.
> docker logs --since 6h --until 4h --tail 5 -t e3c
2018-05-16T06:39:44.892008600Z 2018-05-16T06:39:44.891+0000 I COMMAND  [conn508] dropDatabase Tellin - finished
2018-05-16T06:39:45.127658000Z 2018-05-16T06:39:45.127+0000 I NETWORK  [conn508] end connection 172.17.0.1:38064 (2 connections now open)
2018-05-16T06:39:45.127706200Z 2018-05-16T06:39:45.127+0000 I NETWORK  [conn505] end connection 172.17.0.1:38058 (0 connections now open)
2018-05-16T06:39:45.127718400Z 2018-05-16T06:39:45.127+0000 I NETWORK  [conn506] end connection 172.17.0.1:38060 (3 connections now open)
2018-05-16T06:39:45.127931900Z 2018-05-16T06:39:45.127+0000 I NETWORK  [conn507] end connection 172.17.0.1:38062 (1 connection now open)


ps는 프로세스 목록을 조회하기 위해, grep은 원하는 텍스트가 포함된 문자열만 콘솔에 출력하기 위해, awk는 입력 데이터를 행과 단어 별로 처리해 출력하기 위해 사용합니다. 이 3개를 조합하면, python이라는 키워드가 포함된 프로세스 목록에서 프로세스 ID만을 가져오는 등의 일을 할 수 있습니다.

ps

실행 중인 프로세스를 봅니다. 자주 사용하는 flag들은 아래와 같습니다.

ps au

a는 다른 유저의 프로세스까지 함께 조회하는 것을 의미하고, u는 프로세스를 실행한 유저, CPU, 메모리 usage, 상태 등을 함께 조회합니다.

> ps au
USER    PID  %CPU %MEM      VSZ    RSS   TT  STAT STARTED      TIME COMMAND
root  31206   0.7  0.0  4268244   1164 s001  R+   10:39PM   0:00.00 ps au
planb 29678   0.1  0.0  4308544   1608 s001  S    10:32PM   0:00.05 -bash
root  29677   0.0  0.0  4341328   6336 s001  S    10:32PM   0:00.02 login -fp planb
planb 29676   0.0  0.1  4345384  14428 s001  Ss   10:32PM   0:00.03 /Applications/iTerm.app/Cont

프로세스의 상태

모든 프로세스에는 상태가 있습니다. 위의 STAT 컬럼에 있는 R+, S, Ss 등이 상태입니다.

  • D : Uninterruptible sleep(종료할 수 없는(깨울 수 없는) sleep 상태)
  • R : 실행 중, 또는 실행 가능한 상태
  • S : Interruptible sleep(종료할 수 있는(깨울 수 있는) sleep 상태)
  • T : 중지됨(작업 제어 신호를 받거나, 트레이싱 때문에)
  • X : 죽음(대부분 보이지 않음)
  • Z : Defunct(좀비) 프로세스. 종료되었으나 부모 프로세스에 의해 수습되지 않음

grep

grep은 사실 특정 문자열이 들어있는 파일을 검색하고 싶을 때 사용하는데, 콘솔 output에서 특정 문자열이 들어있는 부분만 가져오기 위해서도 사용됩니다.

> ps au | grep python
root     15790  0.0  0.1  68008  4036 pts/6    S    21:46   0:00 sudo -E python3.4 server.py
root     15791  1.4  3.1 1757368 63708 pts/6   Sl   21:46   0:50 python3.4 server.py
root     15806 99.8  2.1 546964 43980 pts/6    R    21:46  57:09 python3.4 server.py

python이 포함된 라인만 출력되는 것을 볼 수 있습니다.

-v

grep -v는 해당 문자열이 제외된, 즉 문자열이 포함되어 있지 않은 라인을 출력합니다.

> ps au | grep -v python
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root       812  0.0  0.0  14556    12 tty4     Ss+  Jan11   0:00 /sbin/getty -8 38400 tty4
root       815  0.0  0.0  14556    12 tty5     Ss+  Jan11   0:00 /sbin/getty -8 38400 tty5
root       820  0.0  0.0  14556    12 tty2     Ss+  Jan11   0:00 /sbin/getty -8 38400 tty2

python이 포함되어 있지 않은 라인만 출력되는 것을 볼 수 있습니다.

egrep

egrep은 정규 표현식을 지원하여 여러 개의 문자열을 동시에 찾을 수 있습니다.

> ps au | egrep "python|mongod" | grep -v sudo
root      6129  1.8  5.5 367280 113984 pts/1   Sl+  May09  36:18 mongod --auth
root     15791  1.4  3.1 1757368 63708 pts/6   Sl   21:46   0:52 python3.4 server.py
root     15806 99.8  2.1 546964 43980 pts/6    R    21:46  61:36 python3.4 server.py
root     17320  0.0  0.1   8184  2108 pts/0    S+   22:48   0:00 egrep --color=auto python|mongod

python이나 mongod가 포함되어 있고, sudo가 포함되지 않은 라인을 출력합니다.

awk

grep과 비슷하게, 패턴을 검색하고 처리하기 위한 언어입니다. grep처럼 파일에서 특정 문자열을 검색하여 가공하기 위한 명령어인데, 콘솔 출력에 적용할 수 있습니다. awk 'pattern', awk {action}, awk 'pattern {action}' 중에 하나의 문법을 사용할 수 있습니다. 여기서는 ps와 grep을 섞어 여기서는 특정 필드만 출력하기 위해 사용하겠습니다. 위에서 말했던, python이라는 키워드가 포함된 프로세스 목록에서 프로세스 ID만을 가져오는 커맨드입니다.

> ps au | grep -v python | awk '{print $2}'
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root       812  0.0  0.0  14556    12 tty4     Ss+  Jan11   0:00 /sbin/getty -8 38400 tty4
root       815  0.0  0.0  14556    12 tty5     Ss+  Jan11   0:00 /sbin/getty -8 38400 tty5
root       820  0.0  0.0  14556    12 tty2     Ss+  Jan11   0:00 /sbin/getty -8 38400 tty2

screen가상 터미널 다중화, 터미널 멀티 세션 등으로 설명하곤 합니다. screen은 말 그대로 하나의 가상 스크린(터미널)을 마치 백그라운드로 동작하는 것처럼 만들어 줍니다.

screen -S [name]

screen -S [name] 명령어를 이용하면, 주어진 이름으로 가상 스크린이 만들어지고 일반 터미널과 같이 작업을 할 수 있습니다. 다시 터미널로 돌아가려면 Ctrl+a+d를 사용하면 됩니다.

screen -r [name]

screen -r [name]을 통해, 해당 이름과 동일한 스크린으로 진입합니다. 동작하고 있는 스크린이 하나만 있다면 이름은 생략할 수도 있습니다.

screen -list

screen -list를 입력하면 현재 동작하고 있는 스크린 목록을 확인할 수 있습니다.

There is a screen on:
    18142.test    (06/14/2018 11:11:31 AM)    (Detached)
1 Socket in /var/run/screen/S-ubuntu.

스크린에 해당하는 pid와 이름, 생성된 시각을 볼 수 있습니다. 스크린을 종료하려면 내부에서 exit을 입력하거나, 외부에서 kill [pid]를 사용하면 됩니다.

+ Recent posts