linux top 10 명령어들을 정리해봤다

linux top 10 명령어들을 정리해봤다

자주 사용하지만 잘 까먹게 되는 명령어들을 정리해봤습니다.

Top 10. Linux 명령어 정리

유튜브 영상을 보다가 자주 사용하는 명령어에 대한 것을 보게 되었고, 그 동안 사용했던 명려어와 관련 내용들을 정리해보면 좋겠다는 생각에 글을 작성하게 되었습니다.

원본 유튜브 영상 주소는 https://www.youtube.com/watch?v=u9RukvKZJZM 여기 입니다!



1. Server 접속하기

보통 쉘을 통해 서버로 접속할 때, ssh을 많이 사용합니다. 단순히 ssh를 사용해 서버에 접속하는 것, 그 이상으로 ssh가 무엇인지, 또 어떤 도구로까지 활용할 수 있는지 안다면, ssh를 더 잘 사용한다고 할 수 있을 것입니다.

ssh는 secured shell 로 암호화 된 채널이기 때문에 보안 상 사용하는 것이 좋습니다. ssh는 사용할 때 붙일 수 있는 다양한 옵션들이 있습니다. AWS에서 특정 서버로 접속할때, pem파일을 사용해서 접속을 한다면 항상 붙이는 -i 옵션이 있습니다. 이것은 무엇에 관한 옵션일까요?

  • -i 옵션?

    -i 는 id_rsa 옵션으로 어떤 암호키가 있다면 이것을 넘겨서 사용하겠다는 의미입니다. 그래서 pem파일 등 암호화된 파일을 사용해서 인증을 하다면 이 옵션을 통해서 인증에 사용할 파일을 지정하는 것입니다.

  • rsa키 인증 방식의 원리?

    잠깐 rsa키 인증 방식에 대해서 짚고 넘어가겠습니다. rsa가 가끔 등장하곤 하는데, 어떤 것인지 제대로 확인하고 넘어간 적이 없었거든요.

    rsa키 인증 방식은 private, public key 두 키를 이용해서 인증 작업을 합니다. user/.ssh 에 있는 authorized_keys를 보면 pem키(private key)의 pair인 public key가 서버에 저장되어 있는 것을 볼 수 있습니다. 그래서 private키를 갖고와서 서버에 저장되어 있는 public key와 대조해, 일치한다면 인증이 된 것입니다. 즉, 서버에 접속이 가능해지는 것입니다.

    이를 key - pair 방식 이라고 합니다. 일반적으로 패스워드 인증방식을 많이 사용하고 친숙하겠지만, 패스워드 방식보다 좀 더 안정한 방식이라고 볼 수 있습니다.

  • (MAC) ssh-add

    이것은 키를 미리 입력해주는 명렁어입니다. pem 키를 포워딩 하는 것으로서, -i옵션을 굳이 붙여 접속하지 않아도 됩니다. 귀찮은 작업이 좀 덜어지겠죠?, -A를 사용한다면, 다음 접속지에서도 같은 키로 그대로 접속할 수 있어, 편하게 사용할 수 있습니다.

  • 포트 넣기

    만약 포트를 지정하고 싶다면 -p 를 사용 하면 됩니다. 일반적으로 ssh는 기본 포트를 사용합니다. 22이번이죠. 하지만 보안 이론에는 well known port를 사용하지 말아야 한다는 것이 있습니다. 그래서 /etc/ssh/sshd_config를 통해서 ssh 포트 정보를 변경해서 사용하는 경우가 있습니다. 나만 알고있는 접속가능한 포트를 만들어서 접근을 하겠다는 것입니다. 이렇게 설정을 한다면, 다른 사람은 일반적인 접근 경로가 22번이니까, 자연스럽게 들어오게 되었을 때, 모두 차단할 수 있게 되겠습니다.



2. IP를 확인하는 리눅스 명령어, 자신의 public ip 확인?

현재 사용하고 있는 서버의 IP를 알고 싶은 경우가 은근히 자주 있습니다. Private IP 확인하고 싶다면 ifconfig를 사용해서 알ㅇ아낼 수 있습니다. 그런데 이 서버의 Public IP를 알고싶다면 어떻게 해야할까요?

이 서버의 Public IP를 알고싶다면 curl ifconfig.co 를 사용하면 됩니다.



3. 웹 사이트가 잘 동작하는지 체크할때?

띄워놓은 웹 사이트나 서비스를 체크하는 데 어떤 명령어를 사용해야할지 모르는 경우가 있습니다. 주로 curl을 사용하게 되는데, curl에는 다양한 옵션들이 있습니다.

  • curl의 다양한 옵션
    • X : 사용할 방식 메소드 선택하기
    • d : 함께 전달할 파라미터값 설정하기
    • G : 전송할 사이트 url 및 ip 주소
    • H : 헤더 정보를 전달하기
    • I : 사이트의 Header 정보만 가져오기
    • i : 사이트의 Header와 바디 정보를 함께 가져오기
    • u : 사용자 정보

이것들을 잘 활용하면 API서버에 GET, POST방식을 선택하고 헤더를 더해서 데이터를 넣어 던지는 것을 만들어 볼 수 있습니다.

curl -X POST -H "Content-Type: application/json" -d '{"data":1}' {IP Address} 이런식으로 명령어를 보내서 API가 잘 동작하는지 점검할 수 있습니다.



4. 도메인의 IP를 조회하는 방법

도메인의 IP를 확인하고 싶다면 네임서버에 등록된 정보를 조회할 수 있어야 합니다. nslookup 명령어를 잘 사용해야 관련 정보를 갖고 올 수 있을 것입니다. 기본적으로 nslookup {IP Address} 를 하면 도메인의 IP 정보를 알 수 있습니다.

이를 넘어서 도메인 서버의 동작 원리를 한 번 알아보고 넘어가 보겠습니다.

  1. 웹 브라우저에 www.naver.com을 입력하면 먼저 Local DNS에게 “www.naver.com”이라는 hostname”에 대한 IP 주소를 질의하여 Local DNS에 없으면 다른 DNS name 서버 정보를 받음(Root DNS 정보 전달 받음)

  2. Root DNS 서버에 “www.naver.com” 질의

  3. Root DNS 서버로 부터 “com 도메인”을 관리하는 TLD (Top-Level Domain) 이름 서버 정보 전달 받음

  4. TLD에 “www.naver.com” 질의

  5. TLD에서 “name.com” 관리하는 DNS 정보 전달

  6. “naver.com” 도메인을 관리하는 DNS 서버에 “www.naver.com” 호스트네임에 대한 IP 주소 질의

  7. Local DNS 서버에게 “응! www.naver.com에 대한 IP 주소는 222.122.195.6 응답

  8. Local DNS는 www.naver.com에 대한 IP 주소를 캐싱을 하고 IP 주소 정보 전달



5. 웹 서버 혹은 DB같은 서버들을 확인하는 방법?

특정 프로세스들의 동작여부를 확인하고 싶을 때, 일반적으로 알고 있는 ping을 사용하게 됩니다. 그런데, ping으로는 이게 실제로 살아있는지, 동작하는지를 알기는 어렵습니다. 물론 그에 앞서서 웹서버가 뜨면 어떤 tcp로 올라오는지, 어떤 포트로 뜨는지는 미리 알고 있어야겠습니다.

이런 경우에는 telnet을 주로 사용하게 됩니다.

  • ping? telnet?

    ping은 단순 체크라 mysql, redis등이 살아있는지 알기가 어렵습니다. 반면에 telnet에 ip와 port를 넣어서 체크를 한다면 적합한 포트넘버로 신호를 보냈을 때, 관련된 프로세스가 살아있는지 여부를 알 수 있습니다.

    telnet [ip] [port] 로 명령어를 보낼 수 있습니다. telnet은 udp 지원을 안하는 것을 유념하시기 바랍니다.



6. 서버가 잘 떠있는지, DB커넥션 확인

포트가 잘 열려있는지 확인을 해야할 일이 자주 발생합니다. 저의 경우에는 airflow를 예로 들자면, 8793포트나 3306, 6379 등의 포트를 확인하는 경우가 많았습니다. 특히 로그의 전송을 담당하는 8793포트를 자주 확인했었습니다. airflow를 사용하면서 UI에서 로그를 확인하려고 하는데, 연결이 되지 않아 로그를 볼 수 없는 경우가 종종 있었기 때문입니다. 그렇다면, 포트가 열려있는지를 봤었어야 했는데, 어떻게 확인하면 좋을까요?

  • netstat 명령어

    nltp 명령어를 사용해서 원하는 포트의 상태를 확인할 수 있습니다. 주로 netstat -nltp|grep {port}를 통해서 포트가 열려있는지를 봤습니다.

  • netstat 옵션

    -a : 현재다른PC와 연결(Established)되어 있거나 대기(Listening)중인 모든 포트 번호를 확인

    -r : 라우팅 테이블 확인 및 커넥션되어 있는 포트번호를 확인

    -n : 현재 다른PC와 연결되어 있는 포트번호를 확인

    -e : 랜카드에서 송수한 패킷의 용량 및 종류를 확인

    -s : IP, ICMP, UDP프로토콜별의 상태 확인

    -t : tcp protocol

    -u : udp protocol

    -p : 프로토콜 사용 Process ID 노출

    -c : 1초 단위로 보여줌



7. process 확인?

아까 airflow의 예를 다시 한번 사용해보자면, 현재 서버에 워커가 죽었는지 살았는지를 보고 싶을 때가 있습니다. 이런 경우에는 워커 프로세스의 상태를 확인하면 될 것입니다. 이럴 때 사용하는 명령어가 ps 입니다.

  • ps 명령어

    ps명령어는 기본적으로 해당 사용자 소유의 프로세스만 보여줍니다. ps를 치게되면 나오는 정보는 다음과 같습니다.

    • PID: 프로세스 아이디
    • TTY: 프로세스와 연결된 터미널 포트
    • TIME: 프로세스에서 사용한 CPU시간
    • CMD: 명령어
  • ps -ef |grep {PROCESS}

    아마 가장 많이 사용하는 명령어이지 않을까 싶습니다. e는 모든 프로세스 상태 출력한다는 의미이고, f는 full format으로 보여달라는 옵션입니다.

  • ps -aux|grep

    이 역시 많이 사용하는 명령어 입니다.

    • a: 모든 사용자의 프로세스를 출력하는 옵션

    • u: 특정 사용자의 프로세스 정보 확인, 지정하지 않으면 현재 사용자 기준

    • x: 자신의 터미널이 없는 프로세스도 출력하는 옵션



8. Linux CPU, MEM, DISK 시스템 정보 확인

서버의 리소스를 보고 모니터링을 하거나, 상태가 어떤지 보고 싶을 때는 보통 top을 많이 사용합니다. 이외에도 htop, sar도 자주 사용합니다.

  • top

    • Load Average 는 CPU Load의 이동 평균를 표시합니다.

    • Tasks는 현재 프로세스들의 상태를 보여줍니다.

      • 실행(Runnable) - CPU에 의해서 명령어가 실행중인 Process
      • 준비(Ready) - CPU의 명령어 실행을 기다리는 Process
      • 대기(Waiting) - I/O operation이 끝나기를 기다리는 Process
      • 종료(Terminated) - Ctrl + Z 등의 signal로 종료된 Process
      • Zombie - Process는 root Process로 부터 뿌리내린 자식 Process의 형식으로 트리구조를 형성합니다. 이 때 부모가 먼저 종료된 다면 root process로 부터 닿을 수 없는 Process가 생깁니다. 이를 zombie process라고 부릅니다.
    • CPU 사용량은 CPU가 어떻게 사용되고 있는지 그 사용율을 보여주는 영역입니다.

      • us : 프로세스의 유저 영역에서의 CPU 사용률
      • sy : 프로세스의 커널 영역에서의 CPU 사용률
      • ni : 프로세스의 우선순위(priority) 설정에 사용하는 CPU 사용률
      • id : 사용하고 있지 않는 비율
      • wa : IO가 완료될때까지 기다리고 있는 CPU 비율
      • hi : 하드웨어 인터럽트에 사용되는 CPU 사용률
      • si : 소프트웨어 인터럽트에 사용되는 CPU 사용률
      • st : CPU를 VM에서 사용하여 대기하는 CPU 비율
    • 메모리 사용량, MEM

      • total : 총 메모리 양
      • free : 사용가능한 메모리 양
      • used : 사용중인 메모리 양



  • htop (top보다 더 자세한 정보, 편하게 확인 가능)



  • sar (System Activity Reporter)

    • user : 사용자 레벨(application level) 에서 실행중일때의 CPU 사용률 (%)
    • nice : 사용자 레벨(appliaction level) 에서 nice 가중치를 준 CPU 사용률(%)
    • system : 시스템레벨(kernel) 에서 실행중일때의 CPU 사용률(%)
    • iowait : system이 I/O요청을 처리하지 못한 상태에서의 CPU의 idle 상태인 시간의 비율(%)
    • steal : virtual processer에 의한 작업이 진행되는 동안 virtual CPU에 의해 뜻하지 않는 대기시간이 생기는 시간의 비율(%)
    • idle : CPU가 쉬고있는 시간의 %
    • Average : 마지막 라인에 출력되며, 각 값의 평균치 이다.



  • free

    • [total] : 설치된 총 메모리 크기 / 설정된 스왑 총 크기
    • [used] : total에서 free, buff/cache를 뺀 사용중인 메모리. / 사용중인 스왑 크기
    • [free] : total에서 used와 buff/cahce를 뺀 실제 사용 가능한 여유 있는 메모리량 / 사용되지 않은 스왑 크기
    • [shared] : tmpfs(메모리 파일 시스템), ramfs 등으로 사용되는 메모리. 여러 프로세스에서 사용할 수 있는 공유 메모리
    • [buffers] : 커널 버퍼로 사용중인 메모리
    • [cache] : 페이지 캐시와 slab으로 사용중인 메모리
    • [buff/cache] : 버퍼와 캐시를 더한 사용중인 메모리
    • [available] : swapping 없이 새로운 프로세스에서 할당 가능한 메모리의 예상 크기. (예전의 -/+ buffers/cache이 사라지고 새로 생긴 컬럼)

/proc/meminfo를 사용하는 경우도 있는데 free 자체가 /proc/meminfo를 갖고 오는 것이기 때문에 따로 작성하지 않았습니다.



  • df는 사용 가능한 디스크 공간의 양을 알 수 있습니다.

    | 옵션 | Long옵션 | 설명 |
    | — | ————————— | —————————————————————————————- |
    | -a | —all | 0 블록의 파일 시스템을 포함하여, 모든 파일시스템을 출력 |
    | -B | —block-size=SIZE | 지정한 크기(SIZE)를 블록 단위로 정하여 용량을 표시(예:—block-size=1m) |
    | | —total | 총계를 출력 |
    | -h | —human-readable | 사람이 읽을 수 있는 형태의 크기로 출력(예:1K, 512M, 4G) |
    | -H | —si | 1KB는 1,024Byte지만 사용자가 보기 편하도록 1,000단위로 용량을 표시 |
    | -i | —inodes | inode의 남은 공간, 사용 공간, 사용 퍼센트를 출력 |
    | -k | | —block-size=1K와 같은 의미 |
    | -l | —local | 출력하는 목록을 로컬 파일 시스템으로 제한 |
    | | —no-sync | 사용 정보를 얻기 전에 싱크를 하지 않음(디폴트 값) |
    | -P | —portability | POSIX에서 사용되는 형태로 출력 |
    | | —sync | 사용 정보를 얻기 전에 싱크 |
    | -t | —type=TYPE | 보여주는 목록을 파일 시스템의 타입(TYPE)으로 제한 |
    | -T | —print-type | 파일 시스템의 형태를 추가하여 각각의 파티션 정보를 출력 |
    | -x | —exclude-type=TYPE | 지정한 형태(TYPE)를 제외하고 나머지 모든 파일 시스템 정보를 출력 |



9. service 관리

서버가 시작할 때 뜨는 프로세스를 관리하고 싶을 때가 있습니다. 그럴때는 daemon이나 service를 살펴보면 됩니다.

리눅스 서비스 관리하는 명령어는 service와 systemctl이 있습니다.

서비스를 등록할 때는 이런 파일을 하나 작성합니다.

1
2
3
4
5
6
7
8
9
10
[Unit]
Description=Service Desceiption

[Service]
Type=simple
ExecStart=/path/to/shellscript.sh
Restart=on-failure

[Install]
WantedBy=multi-user.target
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Unit
- Description: 해당 유닛에 대한 설명
- Requires : 상위 의존성 구성, 포함하는 유닛이 정상적이어야 실행
- RequiresOverridable : 상위 의존성 구성이며 이것이 실패하더라도 무시하고 유닛을 시작
...

Service
- Type: [simple | forking | oneshot | notify | dbus] 유닛의 타입
- Environment: 해당 유닛에서 사용할 환경 변수 선언
- ExecStart: 시작 명령을 정의
- ExecStop: 중지 명령을 정의

Install
- WantedBy: 유닛을 등록하기 위한 종속성 검사. 유닛을 등록할 때 등록에 필요한 유닛을 지정
  • Before=, After=
    • 유닛 시작의 전후 관계를 설정합니다. 해당 설정은 “Requires=” 설정과는 독립적입니다. “Before=” 에 나열된 유닛이 시작되기 전에 실행하고 “After=” 은 해당 유닛이 시작된 이후 나열된 유닛이 실행합니다.
    • 이 설정은 시스템이 종료(shutdown) 될때는 역으로 작동하게 됩니다.
  • [Install] 섹션
    • systemctl enable [service name] 으로 VM 구동시 서비스가 자동으로 구동되도록 할 때 이용하는 섹션입니다.
    • [Install]은 해당 서비스를 등록할 때 사용되는 설정이다. 같이 등록/해지할 서비스나 필요한 서비스등을 지정해줄 수 있습니다.
  • [WantedBy]
    • 서비스가 어떤 전제조건 하에서 실행되는 지를 결정하는 프로퍼티입니다.
    • WantedBy는 해당 install한 서비스가 설치되어 있어야 본 서비스를 설치한다는 뜻입니다.

이렇게 만들어진 파일을 /usr/lib/systemd/system에 넣어주고(리눅수 버전이나 종류별로 상이할 수 있음) 서비스를 start해주고 실행이 되고 enable까지 해주면 서버가 재시작 되더라도, 서비스가 실행됩니다.

  • service start : systemctl start servicename
  • service enable : systemctl start servicename



10. 리눅스 파일 권한 체계

어떤 파일을 실행하고 사용할 때, 권한이 없다는 에러가 나와서 실행이 되지 않는 경우가 아주 많은 것을 아실 겁니다. 이런 경우에는 파일의 권한을 풀어주면 해결이 되곤 합니다. 이럴 때 주로 사용하는 명령어는 chmod그리고 chown입니다.

  • chmod

    • 파일이나 폴더의 권한(읽기, 쓰기, 실행)를 변경

    • 권한들을 mode라고 부른다

  • chown

    • 파일, 또는 폴더의 소유권을 변경하는 명령어
  • ls -l을 했을때 나오는 정보에 대한 이해

    • long listing format
    1
    2
    3
    4
    user@user_group:~/exp$ ls -l
    drwxrwxr-x 2 user user_group 4096 Sep 17 06:39 dir1
    drwxrwxr-x 2 user user_group 4096 Sep 17 06:39 dir2
    -rw-rw-r-- 1 user user_group 0 Sep 17 06:39 file1
    • 첫번째 블락이 권한 문자열(Permission string)
    • 두번째 블락이 해당 디렉토리 내부의 파일과 디렉토리 갯수,
    • 세번째 블락이 소유주,
    • 네번째가 소유주가 속한 그룹,
    • 다섯번째가 크기,
    • 6,7,8번째는 마지막으로 파일/디렉토리에 접근한 시각,
    • 아홉번째가 파일/디렉토리의 이름을 의미한다.

root와 chmod 777 는 full 권한을 부여하는 것이므로 사용을 지양합니다.




Reference

linux top 10 명령어들을 정리해봤다

http://tkdguq05.github.io/2021/12/04/linux-top10/

Author

SangHyub Lee, Jose

Posted on

2021-12-04

Updated on

2023-12-08

Licensed under

Comments