백엔드 개발자를 위한 리눅스 필수 명령어 21

이 글은 [Node.js 백엔드 개발자 되기]에서 발췌했습니다.
골든래빗 출판사

백엔드 개발자가 아니면 리눅스를 사용할 일이 거의 없습니다. 그러므로 백엔드 입문자인 여러분께 리눅스 명령어는 낯설기 마련입니다. 명령어는 방대하기 때문에 처음부터 모든 명령어를 다 외우고 사용할 수는 없습니다. 그래서 백엔드 개발라자면 꼭 알아야 하는, 자주 사용하는 명령어의 사용법을 정리해두었습니다. 이 정도만 알면 명령어 입문은 뗀 겁니다. 그 외 명령어는 현업에서 부딪히며 그때그때 익히거나, 명령어 관련 서적으로 익히면 됩니다.

[notice] 유닉스 계열인 리눅스에서는 대소문자를 구분합니다. 명령어는 모두 소문자입니다. 일부 옵션에서 대문자를 사용하기도 합니다.

01 pwd

pwd는 print work directory의 약자로 작업 중인 디렉터리를 보여줍니다.

$ pwd
/Users/gyus

02 ls

list segments의 약자로 현재 디렉터리의 파일과 디렉터리를 보여줍니다. 보통 단독으로 잘 사용하지 않고 a, l 등의 옵션을 함께 사용합니다.

  • ls -l : 파일들의 상세 정보를 보여줌
  • ls -a : 숨김 파일 표시
  • ls -t : 최신 파일부터 표시
  • ls -rt : 오래된 파일부터 표시
  • ls -F : 파일을 표시할 때 파일의 타입을 나타내는 문자열을 표시( / 디렉터리, * 실행 파일, @ 심볼릭 링크)
  • ls -R : 하위 디렉터리의 내용까지 표시

보통은 위 옵션들을 조합해 ls -al, ls -alt, ls -altF 등으로 사용합니다.

* 심볼릭 링크(symbolic link) : 원본 파일을 가리키도록 링크만 연 결시켜둔 겁니다. 윈도우의 바로가 기 링크와 같은 개념입니다.

03 cd

change directory의 약자로 말그대로 디렉터리 이동 시 사용하는 명령입니다.

  • cd ~ : 홈디렉터리로 이동
  • cd .. : 상위 디렉터리로 이동. cd ../../ 같은 식으로 여러 단계를 한 번에 이동 가능
  • cd /dir : 절대 경로를 지정해 이동 가능
  • cd – : 바로 전의 디렉터리로 이동

04 mkdir

make directory의 약자로 디렉터리를 만들 때 사용합니다.

# <이름>의 디렉터리를 현재 디렉터리에 만듭니다.
$ mkdir <이름>

# -p 옵션으로 하위 디렉터리까지 한 번에 생성할 수 있습니다.
$ mkdir -p <디렉터리명>/<하위 디렉터리명>

05 cp

copy의 약자입니다. 파일 또는 디렉터리를 복사할 때 사용합니다.

# source를 target으로 복사하기
$ cp source target

# target 파일이 이미 있는 경우 덮어쓰기
$ cp -f source target

# 디렉터리를 복사할 때 사용. 하위 디렉터리도 모두 복사하기
$ cp -R sourceDir targetDir

06 mv

move의 약자입니다. 파일 또는 디렉터리의 위치를 옮길 때 사용합니다. 혹은 이름을 변경할 때도 사용합니다.

# afile 이름을 bfile로 변경
$ mv afile bfile

# afile을 상위 디렉터리로 옮김
$ mv afile ../

# afile을 /opt 이하 디렉터리로 옮김
$ mv afile /opt/

07 rm

remove의 약자입니다. 파일 또는 디렉터리를 삭제할 때 사용합니다.

# afile을 삭제
$ rm afile

# 디렉터리 adir을 삭제. 삭제 시 확인을 함
$ rm -r adir

# 디렉터리 adir을 삭제. 삭제 시 확인 안 함
$ rm -rf adir

# txt로 끝나는 모든 파일을 삭제할지 물어보면서 삭제
$ rm -i *.txt

08 cat

catenate (잇다 연결하다)의 약자입니다. 파일의 내용을 확인할 때 사용합니다.

# test.txt 파일의 내용을 확인
$ cat test.txt

09 touch

touch는 빈 파일을 생성합니다. 혹은 파일의 날짜와 시간을 수정할 때 사용합니다.

# afile을 생성
$ touch afile

# afile의 시간을 현재 시간으로 갱신
$ touch -c afile

# bfile의 날짜 정보를 afile의 정보와 동일하게 변경
$ touch -r afile bfile

10 echo

echo는 어떤 문자열을 화면에 보여줄 때 사용합니다. echo와 리다이렉션을 사용해 파일을 생성, 추가하는 작업을 많이 합니다.

# helloworld 출력
$ echo 'helloworld'

# 패스로 지정된 문자열을 출력 
$ echo $PATH 

# 이스케이프 문자열을 해석 
$ echo -e 문자열 

# 개행을 표시할 수 있음 
$ echo -e "안녕하세요\n이렇게 하면\n새 줄이생겨요" 

# ls와 유사하게 현재 디렉터리의 파일과 폴더를 출력 
$ echo * 

# 리다이렉션 '>'을 사용해 hello.txt 파일 생성. 파일 내용에는 echo로 표시되는 내용이 들어감 
$ echo hello redirection > hello.txt 

# 추가 연산자 >>를 사용해 기존 파일에 문자열 추가 
$ echo hello2 >> hello.txt

11 ip addr / ifconfig

접속한 리눅스의 IP 정보를 알아낼 때 사용합니다.

$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP
group default qlen 50000
link/ether fa:16:3e:5d:0b:d7 brd ff:ff:ff:ff:ff:ff
inet 10.201.1.10/16 brd 10.202.255.255 scope global eth0
valid_lft forever preferred_lft forever

ip addr이 설치되어 있지 않은 경우에는 ifconfig를 사용하면 됩니다.

$ ifconfig
    eth0 Link encap:Ethernet HWaddr 06:4d:de:ae:a8:50
    inet addr:172.31.27.212 Bcast:172.31.31.255 Mask:255.255.240.0
    inet6 addr: fe80::44d:deff:feae:a850/64 Scope:Link
    UP BROADCAST RUNNING MULTICAST MTU:9001 Metric:1
    RX packets:68903966 errors:0 dropped:0 overruns:0 frame:0
    TX packets:75295223 errors:0 dropped:0 overruns:0 carrier:0
    collisions:0 txqueuelen:1000
    RX bytes:15691124260 (15.6 GB) TX bytes:42265387295 (42.2 GB)

lo  Link encap:Local Loopback
    inet addr:127.0.0.1 Mask:255.0.0.0
    inet6 addr: ::1/128 Scope:Host
    UP LOOPBACK RUNNING MTU:65536 Metric:1
    RX packets:6623596 errors:0 dropped:0 overruns:0 frame:0
    TX packets:6623596 errors:0 dropped:0 overruns:0 carrier:0
    collisions:0 txqueuelen:1
    RX bytes:349206971 (349.2 MB) TX bytes:349206971 (349.2 MB)

12 ss

socket statistics의 약자입니다. 네트워크 상태를 확인하는 데 사용합니다. 원래는 netstat를 사용했는데, 최근에는 ss를 주로 사용합니다. 옵션으로 a, t, u, l, p, n 등이 있습니다.

  • ss -a : 모든 포트 확인
  • ss -t : TCP 포트 확인
  • ss -u : UDP 포트 확인
  • ss -l : LISTEN 상태 포트 확인
  • ss -p : 프로세스 표시
  • ss -n : 호스트, 포트, 사용자명을 숫자로 표시

TCP 포트 중 LISTEN 상태인 포트의 번호를 알고 싶을 때 다음과 같이 합니다.

$ ss -tln
LISTEN 0 511 *:443 *:*
LISTEN 0 1 127.0.0.1:8006 *:*
LISTEN 0 511 *:80 *:*

13 nc

netcat의 약자입니다. 예전에는 포트가 열렸는지 확인하는 데 telnet 명령어를 사용했지만 요즘은 주로 nc를 사용합니다.

# 포트가 오픈됐는지 확인
$ nc IP주소 포트

# 더 자세한 정보가 남음
$ nc -v IP주소 포트

# 현재 서버의 포트를 오픈(방화벽에 해당 포트 번호가 설정 함)
$ nc -l 포트

14 which, whereis, locate

which는 특정 명령어의 위치를 찾아줍니다.

$ which git
/usr/local/bin/git

# which -a : 검색 가능한 모든 경로에서 명령어를 찾아줍니다.
$ which -a git
/usr/local/bin/git
/usr/bin/git

# where : which -a와 같습니다.
$ where git
/usr/local/bin/git
/usr/bin/git

# whereis는 실행 파일, 소스, man 페이지의 파일을 찾아줍니다.
$ whereis ssh
ssh: /usr/bin/ssh /usr/share/man/man1/ssh.1

# locate는 파일명을 패턴으로 빠르게 찾아줍니다.
# 아래 예제는 .java 파일을 찾아주는 명령입니다.
$ locate *.java

15 tail

tail은 꼬리라는 의미처럼 파일의 마지막 부분을 보여줍니다. tail이 있으면 당연히 head도 있는데 사용법은 같습니다. 필자는 tail -f {파일}을 가장 많이 쓰는 편입니다. 서버의 로그를 실시간으로 보고 싶을 때 사용합니다.

# 파일의 마지막 라인부터 숫자만큼의 파일의 라인 수를 보여주기
$ tail -n {숫자} {파일경로}

# 숫자로 지정한 라인부터 보여주기
$ tail -n +{숫자} {파일경로}

# 파일의 마지막 라인부터 숫자로 지정한 바이트 수 만큼 보여주기
$ tail -c {숫자} {파일경로}

# Ctrl + C로 중단하기 전까지 지정한 파일의 마지막에 라인이 추가되면 계속 출력하기
$ tail -f {파일경로} :

# 파일의 마지막 라인부터 지정한 숫자만큼을
# {초}로 지정한 시간이 지날 때마다 리프레시해서 보여주기
$ tail -n {숫자} -s {초} -f {파일경로}

16 find

find는 명령어의 뜻 그대로 파일이나 디렉터리를 찾는 데 사용하는 명령어입니다. 굉장히 많은 옵션이 있으나 그중에 자주 사용되는 것만 소개합니다.

# 확장자 명으로 찾기
$ find {디렉터리} -name '*.bak'

# 디렉터리를 지정해 찾기
$ find {디렉터리} -path '**/검색 시 사용하는 디렉터리명/**.*.js'

# 파일명을 패턴으로 찾기
$ find {디렉터리} -name '*패턴*'

# 파일명을 패턴으로 찾되 특정 경로는 제외하기
$ find {디렉터리} -name '*.py' -not -path '*/site-packates/*'

# 파일을 찾은 다음 명령어 실행하기
$ find {디렉터리} -name '*.ext' -exec wc -l {} \;

# 최근 7일간 수정된 파일을 찾고 삭제하기
$ find {디렉터리} -daystart -mtime -7 -delete

# 0바이트인 파일을 찾고 삭제하기
$ find {디렉터리} -type f -empty -delete

 

17 ps

현재 실행 중인 프로세스 목록과 상태를 보여줍니다.

# 실행 중인 모든 프로세스를 보여주기
$ ps aux

# 실행 중인 모든 프로세스를 전체 커맨드를 포함해 보여주기
$ ps auxww

# 특정 문자열과 매칭되는 프로세스 찾기(grep은 바로 다음에 나옵니다)
$ ps aus | grep {패턴}

# 메모리 사용량에 따라 정렬하기
$ ps --sort size

18 grep

grep은 입력에서 패턴에 매칭되는 내용을 찾는 명령어입니다. grep이라는 이름은 ed의 명령어인 g/re/p(내용 전체를 정규식으로 찾은 다음 프린트하라: globally search for a regular expression and print matching lines)에서 왔습니다. 보통 find, ps 등과 조합해 사용합니다.

# 파일에서 특정 패턴을 만족하는 부분 찾기
$ grep "패턴" 파일경로

# 파일명과 라인을 함께 표시하기
$ grep --with-filename --line-number "패턴" 파일경로

# 매칭하지 않는 부분 표시하기 
$ grep --invert-match "패턴" 

# cat과 함께 사용하기 
$ cat 파일경로 | grep "패턴"

19 kill

프로세스를 죽이는 명령어입니다. 프로세스를 죽인다고는 하지만 원리는 프로세스에 중지하라는 시그널을 보내는 겁니다. SIGKILL, SIGSTOP은 강제 종료이며 나머지는 정상적으로 종료시킵니다. 프로세스 아이디는 ps 명령어로 알아낼 수 있습니다 .

# kill에서 사용할 수 있는 시그널 표시하기
$ kill -l

# 프로세스 죽이기 SIGTERM(terminate)
$ kill 프로세스ID

# 백그라운드 잡 종료시키기
$ kill {잡ID}

# 프로세스 강제 종료
$ kill -9 | KILL 프로세스ID

20 alias

자주 사용하는 명령어가 길면 타이핑하려면 귀찮습니다. 이때 alias를 사용하면 줄여서 사용할 수 있습니다.

# 모든 alias 표시하기
$ alias

# alias 만들기
# 예) alias ll="ls -al"
$ alias 단어="명령"

# cd ../..을 cd …으로 줄여 쓰기
# cd ../../../은 cd ….으로 가능
$ alias ...=../..
$ alias ....=../../..
$ alias .....=../../../..
$ alias ......=../../../../..

# alias 삭제하기
$ unalias 단어

21 vi / vim

vi 혹은 vim은 대부분의 리눅스에 기본적으로 설치되어 있는 텍스트 에디터입니다. 백엔드 개발 환경에서는 적지 않게 사용할 기회를 만나게 됩니다. 최소한의 vim 사용법을 알려드리겠습니다.

vi {파일명 혹은 디렉터리명}을 사용해 진입할 수 있습니다.

$ vi test.txt

test.txt 파일이 있다면 text.txt 파일을 읽어서 화면에 보여주고 없다면 다음과 같이 빈 화면을 보여줍니다.

여기서 i, 혹은 a를 눌러서 편집 모드로 들어갈 수 있습니다.

편집 모드에서 “hello vim”을 적고 esc 를 누르면 편집 모드가 종료되고 명령 모드로 변경됩니다.

명령모드에서 :wq 또는 :x를 입력하고 enter 를 누르면 저장하고 vim을 빠져나오게 됩니다.

명령 모드에서 커서 이동은 h (왼쪽), j (아래), k (위), l (오른쪽) 키로 합니다. vim은 여기서 소개한 것보다 더 강력한 편집 도구입니다. 공들여 공부할 가치가 있으니 추가로 공 부해두기 바랍니다.

박승규


아직도 개발이 재미 있는 15년차 천상 개발자입니다. 웹 개발, 게임 백엔드 개발, 플랫폼 및 인프라 개발 등 다양한 영역을 경험했습니다. 현재는 카카오엔터테인먼트에서 백엔드 개발자로 일합니다.


현) 카카오엔터테인먼트 페이지 서비스 개발팀
전) 트리노드 (포코팡, 포코포코) 서버 개발자
전) NHN Japan 플랫폼 개발팀

Leave a Reply

©2020 GoldenRabbit. All rights reserved.
상호명 : 골든래빗 주식회사
(04051) 서울특별시 마포구 양화로 186, 5층 512호, 514호 (동교동, LC타워)
TEL : 0505-398-0505 / FAX : 0505-537-0505
대표이사 : 최현우
사업자등록번호 : 475-87-01581
통신판매업신고 : 2023-서울마포-2391호
master@goldenrabbit.co.kr
개인정보처리방침
배송/반품/환불/교환 안내