tail -f 보다 효율적인 less +F에 대해 알아보자

Stop using tail -f

얼마전 tail -f를사용하며 스크롤 기능을 사용하고 싶어 검색하던 중 less +F를 알게 되었습니다. less +F에 대해 잘 설명한 글이 있어 번역해보려 합니다. 해당 글은 Stop using tail -f (mostly) 에서 볼 수 있습니다.

파일의 변화를 실시간으로 모니터링하기 위해 여전히 많은 사람들이 tail -f를 사용하고 있습니다. tail-f 보다 less +F 를 사용하는게 조금 더 나은 방법이 될 수 있습니다.

less documentation에서 +F에 대해 잘 설명하고 있습니다.

Scroll forward, and keep trying to read when the end of file is reached. Normally this command would be used when already at the end of the file. It is a way to monitor the tail of a file which is growing while it is being viewed. (The behavior is similar to the “tail -f” command.)

tail -f 명령어와 비슷하다고 하는데, 어떤 점에서 더 좋을까요?

간단하게, less +F를 사용하면 navigation과 watching 모드 사이를 쉽게 변경할 수 있습니다. tail -f를 사용하셨던 분들은 아마 file을 실시간으로 모니터링하면서 해당 파일에서 무언가를 검색하거나 위, 아래로 이동하고 싶었던 적이 있을것 입니다. 그럴때마다 tail 명령어를 종료하거나 새로운 shell로 vim을 통해 문제를 해결했을 것입니다. 그러나 less 명령어를 사용하면 더이상 그런 번거로운 수고를 할 필요 없습니다.

production.log 라는 파일을 모니터링한다고 가정해 보겠습니다.

1
2
3
4
5
6
7
8
$ less +F production.log

Important
log
information
here

Waiting for data... (interrupt to abort)

tail 명령어와 결과가 비슷한것 같지만, Ctrl-c를 눌러 normal less 모드로 변경할 수 있습니다. +F 플래그 없이 파일을 오픈한 것과 같은 모드입니다. 그 후, normal less 모드에서 사용할 수 있는 기능들을 똑같이 사용할 수 있습니다. /foo를 검색한다던가, 검색 결과를 n 또는 N을 통해 이동할 수 있습니다. 또한 jk를 통해 라인을 이동할 수도 있습니다. 추가적으로 m을 통해 마크도 생성할 수 있습니다.

필요한 작업을 모두 끝내고 나면, F를 눌러 다시 모니터링 모드로 돌아갈 수 있습니다.

When not to use less

동시에 여러개의 파일을 모니터링 해야하는 경우에는 tail -f가 조금 더 나을 수 있습니다.

1
2
3
4
5
6
7
8
9
10
$ tail -f *.txt

==> file1.txt <==
content for first file

==> file2.txt <==
content for second file

==> file3.txt <==
content for third file

변경이 발생할 때, 파일 이름과 새로운 내용이 보이기 때문에 매우 편리합니다.

그러나, less의 경우에는 다음처럼 출력됩니다.

1
2
3
$ less +F *.txt

content for first file

less는 동시에 오직 하나의 파일 내용만 볼 수 있으며, 2번째 파일을 보고 싶을 경우 Ctrl-c로 normal mode로 변환 후 :n을 눌러 다음 buffer로 이동해야 합니다. 그 후 다시 F를 눌러 모니터링 모드로 돌아가면 됩니다.

필요와 경우에 따라서, lesstail을 잘 사용하면 조금 더 효율적인 작업을 할 수 있을것 입니다.

Screen 사용하기

Screen 이란?

terminal 또는 putty를 이용해 원격에서 작업하다 보면 여러개의 창을 띄우고 싶을 때가 많습니다. 이럴때 보통 여러개의 terminal을 띄워서 작업합니다. (저는 screen을 알기 전까지 그랬습니다…) 그런데 창을 하나, 둘 여러개 띄우고 작업을 하다보면 어느 창에서 어떤 작업을 하고 있었는지도 헷갈리기 시작하면서 관리의 어려움이 생기게 됩니다.

description
**screen**은 한 terminal로 한번만 로그인 한 후에 여러 쉘과 프로그램을 사용할 수 있습니다. 또한 **세션관리 기능**도 지원합니다. 세션관리 기능은 상당히 유용합니다. 예를 들면, 터미널을 통해 원격 서버에 접속하여 작업을 하다가 네트워크 장애로 연결이 끊어진다면 매우 난감할 수 있습니다. 이때 screen을 사용해서 작업중이 였다면 **세션을 유지**할 수 있기 때문에 해당 작업은 로컬에서 계속 진행되고 있으며 언제든지 다시 해당 세션을 통해 작업을 계속 할 수 있습니다. 더불어 하나의 서버에 여러명의 사용자가 접속하여 **해당 스크린을 공유**하여 같은 화면을 공유할 수도 있습니다.

description


description
screen은 하나의 프로세스 입니다. 따라서 무분별하게 생성하기 보다는 필요한 용도에 맞게 적당한 개수를 유지하며 사용하는것이 중요합니다.

Screen 실행 명령어

screen 관련 명령어에 대해 알아보겠습니다.

1
2
// screen 을 시작하는 기본 명령어 입니다. 기본 세션명으로 시작합니다.
$ screen
1
2
// 해당 세션명으로 스크린을 시작합니다.
$ screen -S 세션명
1
2
// 이전에 작업 했던 screen 목록을 불러와 세션명과 함께 보여 줍니다.
$ screen -list
1
2
3
// 이전에 작업 했던 세션이 있을 경우 해당 세션을 불러옵니다.
// 세션명을 주지 않았을 경우에는 이전 세션이 한개일 경우 그 작업을 불러오고, 여러개 일 경우에는 작업 리스트를 보여 줍니다.
$ screen -R 세션명
1
2
// 스크린을 삭제합니다.
$ screen -S 세션명 -X quit

Screen 실행 후 명렁어

Screen 실행 후의 명령어는 **Ctrl-a로 시작**합니다.

1
2
// 새로운 쉘을 생성(create) 하여 그 쉘로 이동합니다.
$ Ctrl-a, c
1
2
// 바로 전(previous) 창으로 이동합니다.
$ Ctrl-a, p
1
2
// 바로 다음(next) 창으로 이동합니다.
$ Ctrl-a, n
1
2
// 숫자에 해당하는 창으로 이동합니다.
$ Ctrl-a, 숫자
1
2
// 창번호 또는 창이름으로 이동합니다. (' => 싱글 쿼테이션)
$ Ctrl-a, '
1
2
// 창목록을 보여 줍니다. (방향키와 Enter를 통해 창 선택 후 이동가능, " => 더블 쿼테이션)
$ Ctrl-a, "
1
2
// 현재 창의 title을 수정합니다.
$ Ctrl-a, A
1
2
// screen의 명령행 모드로 전환합니다. (: => 콜론)
$ Ctrl-a, :
1
2
// 현재 작업을 유지하면서 screen 세션에서 빠져나옵니다.(detach)  세션이 종료 되지 않습니다.
$ Ctrl-a, d
1
2
// 해당 스크린을 삭제합니다.
$ Ctrl-a, k
1
2
// 해당 스크린에 lock을 겁니다. (해당 유저의 비밀번호를 입력해야 해제할 수 있다.)
$ Ctrl-a, x

다음은 창 관련 명령어입니다.

1
2
// 창을 분할합니다(split).
$ Ctrl-a, S
1
2
// 분할된 창으로 이동합니다.
$ Ctrl-a, Tab
1
2
// 분할된 구역중 현재 구역을 제외하고 나머지를 숨깁니다.
$ Ctrl-a, Q
1
2
// Ctrl-a, d(세션 유지) 와는 달리 세션을 완전히 종료합니다.
$ exit

.bashrc 와 .bash_profile 의 차이

bash 쉘(Shell) 이란?

쉘(Shell)은 운영체제에서 **사용자가 입력하는 명령을 읽고 해석하여 대신 실행해주는 프로그램**입니다. 운영체제 상에서 다양한 운영체제 기능과 서비스를 구현하는 인터페이스를 제공하며, 사용자와 운영체제의 내부(커널)` 사이의 인터페이스를 감싸는 층이기 때문에 셸이라는 이름이 붙었습니다. 쉘은 운영체제에서 필수적으로 존재합니다.

운영체제는 로그인한 사용자가 없다면 하나의 쉘도 실행되지 않은 상태이며, 사용자가 로그인을 시도하면 운영체제는 ID와 패스워드를 받아들이는 로기은 프로그램을 실행하고, 사용자가 입력한 ID와 패스워드를 검증한 후 인증된 사용자라면 쉘을 실행하여 사용자 세션을 쉘에게 전달합니다.

쉘의 역할은 사용자가 입력한 명령을 해석하여 대신 실행해주는 것입니다. 쉘의 내부 명령어라면 스스로 실행한 뒤 화면에 표시해주고 내부 명령어가 아니라면 PATH 환경변수에 지정된 경로에서 입력받은 명령과 같은 파일을 찾아 exec() 시스템콜을 호출하여 실행한 뒤 키보드와 마우스 등의 입력장치와 모니터에 해당하는 표준 출력장치의 제어권을 해당 프로그램에 넘겨준 뒤 프로그램이 끝날 때 까지 대기하는 역할을 합니다.

bash 쉘은 유닉스에서 사용하는 커맨드 쉘의 일종으로 GNU 프로젝트를 위해 만들어졌습니다. 초기의 유닉스 쉘인 본 쉘(Bourne Shell)과 새로 태어났다는 뜻의 영어 ‘born again’을 합쳐 **본 어게인 쉘(Bourne-again Shell)**이라고 불렸으나, 일반적으로 bash로 줄여 부릅니다.

Login Shell 과 Non-Login Shell

Login Shell

Login은 ID와 패스워드를 입력해서 Shell을 실행하는 것을 말합니다. 따라서 ssh로 접속하거나 로컬에서 GUI를 통해 Shell을 실행하는 것은 Login Shell 입니다.
.profile, .bash_profile 이 두 파일은 Login할 때 로드되는 파일입니다. .profile은 꼭 bash가 아니더라도 로그인하면 로드되며, .bash_profile은 꼭 bash로 로그인 할 때만 실행됩니다.

Non-Login Shell

Non-Login Shell은 로그인 없이 실행하는 Shell을 말합니다. ssh로 접속하고 나서 다시 bash를 실행하는 경우나, GUI 세션에서 터미널을 띄우는 것도 여기 해당합니다. ‘sudo bash’나 ‘su’같은 것도 해당합니다.

.bashrc 와 .bash_profile 의 차이

.bashrc

이미 로그인 한 상태에서 새 터미널 창을 열 때마다 로드됩니다. (Non-Login Shell에서 실행됩니다.)

.bash_profile

시스템에 로그인할 때마다 로드됩니다. (Login Shell에서 실행됩니다.) 대부분 개별 사용자에 대한 설정에 대한 코드들이 들어갑니다. 예를 들면 nvm(Node Version Manager)은 기본적으로 nvm을 사용하지 않고 Node를 설치할 때와는 다르게 각 사용자의 경로에 설치되게 되는데, 이럴때 nvm의 PATH를 .bash_profile 파일에 기재합니다.

.profile

로그인할 때 로드됩니다. 개별 사용자에 대한 설정 코드들 중 bash와는 관계없는 부분을 기재합니다.

  • 만약 Mac에서 새 터미널 창을 열 때마다 .bashrc를 로드하고 싶다면 .bash_profile에서 .bashrc를 로드하면 됩니다.
    1
    2
    3
    4
    # Source bashrc
    if [ -f ~/.bashrc ]; then
    . ~/.bashrc
    fi

ls 명령어 결과 색상 변경하기

미리보는 결과 화면

이번 글에서는 다음과 같이 ls 명령어를 사용했을 때 보이는 결과를 색상을 이용하여 쉽게 구분할 수 있도록 만들어 보겠습니다.

ls 명령어 결과

색상 표시 여부 설정 & 색상 설정

~/.bashrc 또는 ~/.bash_profile 파일에 다음 코드를 추가합니다.

1
2
3
# ls 명령어 색상 표시 여부 & 색상 설정
export CLICOLOR=1
export LSCOLORS=DxFxBxDxCxegedabagacad

색상 변경하기

CLICOLOR색상표시 여부를 활성화하는 것이며 0일때 비활성, 1일때 활성입니다.
LSCOLORS는 CLICOLOR로 색상이 활성화 되었을 때 각 종류별로 어떤 색으로 표시할 지를 지정하는 것 입니다. 두 글자씩 쌍으로 이루어져 있으며 앞 글자는 전경색(foreground), 뒤의 글자는 배경색(background)를 의미합니다. 각 알파벳이 의미하는 색상은 다음과 같습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
a : 검은색
b : 빨강색
c : 녹색
d : 갈색
e : 파란색
f : 마젠타색(magenta)
g : 시안(cyan)
h : 밝은 회색
A : 두꺼운 검은색(보통 어두운 회색으로 보인다.)
B : 두꺼운 빨간색
C : 두꺼운 녹색
D : 두꺼운 갈색(보통 노란색으로 보인다)
E : 두꺼운 파란색
F : 두꺼운 마젠타색
G : 두꺼운 시안
H : 두꺼운 밝은 회색(밝은 흰색처럼 보인다)
x : 전경생과 배경색의 기본색상

fb의 쌍 순서는 다음과 같은 순서로 색을 지정합니다.

1
2
3
4
5
6
7
8
9
10
11
1. 디렉토리
2. 심볼릭 링크
3. 소켓
4. 파이프
5. 실행가능 파일
6. 특수 블락
7. 특수문자
8. setuid 비트가 설정된 실행파일
9. setgid 비트가 설정된 실행파일
10. sticky비트가 있으면서 다름사람이 쓸 수 있는 디렉토리
11. sticky비트가 없으면서 다름사람이 쓸 수 있는 디렉토리

Linux & Ubuntu 계정 추가 & 설정

AWS의 EC2를 사용하면서 ubuntu에 사용자를 추가해주는 경우가 빈번히 생겨 그 과정을 정리해보려 합니다. 각각의 유저가 자신의 사용자 계정을 사용한다면 자신만의 파일과 작업 공간을 가질 수 있고, 잘못사용해서 시스템에 피해가 생기는 일도 어느정도 예방할 수 있습니다.

EC2 인스턴스에 사용자를 추가하는 작업에는 (1) 사용자를 시스템에 추가하고 (2) 해당 사용자에게 원격으로 로그인하는 방법을 제공하는 두 가지 작업이 포함됩니다.

올바른 방법은 하나의 EC2에서 생성한 각각의 사용자 계정마다 key pair를 생성해 주고, 각 계정에 맞게 설정된 key pair를 통해서만 접속 할 수 있도록 설정을 해야합니다.

그러나 최초 EC2 인스턴스를 생성하며 만들었던 key pair를 모든 사용자가 공유한다던가, password 기반의 로그인을 활성화 하여 ssh key를 사용하지 않고 password 기반으로 로그인을 할 수도 있습니다.

이번 포스팅에서는 (1) 사용자를 시스템에 추가한 후 (2-1) EC2 인스턴스를 생성하며 사용했던 key pair(기본 사용자 로그인시 사용하는 key pair)를 사용하거나, (2-2) password 기반의 로그인을 활성화하여 ssh key를 사용하지않고 로그인할 수 있도록하는 방법에 대해 정리합니다.

root password 설정

1
[ubuntu ~] $ sudo passwd root

password 기반의 로그인을 활성화하기

1
[ubuntu ~] $ sudo vi /etc/ssh/sshd_config

다음을 수정합니다. no를 yes로 변경합니다.
# Change to no to disable tunnelled clear text passwords
PasswordAuthentication no

root 계정으로 로그인

1
[ubuntu ~] $ su - root

다른 사용자 계정 추가

1
[root ~] $ adduser newuser

새로 생성한 사용자 계정의 비밀번호 변경

1
[root ~] $ sudo passwd newuser

새로 생성한 사용자 계정에 root 권한을 사용할 수 있도록 설정

1
[root ~] $ sudo visudo

다음을 수정합니다.
root ALL=(ALL) ALL 아래에
newuser ALL=(ALL) ALL을 추가합니다.

같은 key pair로 로그인 할 수 있도록 새로 생성한 사용자 계정으로 ubuntu 의 것을 복사

* 이부분에 대한 자세한 내용은 SSH KEY 에 대하여 알아야합니다.
* ubuntu 계정의 .ssh 폴더를 복사해 newuser 계정에 복사합니다.

1
[root ~] $ ssudo cp /home/ubuntu/.ssh /home/newuser/.ssh

복사한 key pair의 소유자를 jmkim으로 변경 (-R : 하위 폴더까지 모두 소유권을 바꿔줌)

1
[root ~] $ sudo chown -R newuser:newuser /home/newuser/.ssh

sshd 서비스 재시작

-Ubuntu

1
[root ~] $ sudo service ssh restart

-Linux

1
[root ~] $ sudo service sshd restart

이제 EC2 instance를 생성할때 만들었던 .pem 파일과 설정한 비밀번호를 통해 새로 생성한 계정으로 서버에 접속할 수 있습니다.

참고 : AWS 공식 사이트 - Managing User Accounts on Your Linux Instance