본문 바로가기

CS 학습 정리

쉘 스크립트 자동화와 리눅스 환경설정

728x90

1. 로컬 컴퓨터와 리모트 컴퓨터

- 로컬 컴퓨터는 본인의 물리적 컴퓨터를 의미한다. 리모트 컴퓨터는 가상 컴퓨터나 클라우드 컴퓨터 등 원격으로 접속하여 지금 접속한 물리 컴퓨터의 리소스가 아닌 리소스를 사용할 수 있다. 로컬 컴퓨터에서 작업하여 리모트 컴퓨터에서 배포하는 일은 매우 흔한 일이다. 이 개념은 깃을 관리하며 많이 겪었던 원격저장소와 로컬저장소의 개념과 유사하다. 그리고 이 원격 컴퓨터(자원)에 접속할 때 가장 많이 쓰이는 프로토콜이 바로 SSH이다.

  • SSH
    • 보안: SSH는 데이터 전송 과정에서 암호화를 사용하여 데이터의 기밀성을 보호합니다. 이는 네트워크를 통해 전송되는 정보가 노출되지 않도록 합니다.
    • 원격 접속: SSH를 사용하여 원격 서버나 컴퓨터에 접속할 수 있습니다. 사용자는 SSH 클라이언트를 통해 명령어를 입력하거나 파일을 전송할 수 있습니다.
    • 파일 전송: SSH는 SCP(Secure Copy Protocol)를 통해 파일을 안전하게 전송할 수 있는 기능을 제공합니다. SCP는 SSH를 기반으로 하여 작동하며, 원격 호스트 간에 파일을 복사하거나 전송할 때 사용됩니다.
    • 원격 관리 및 자동화: 서버나 네트워크 장치의 원격 관리와 자동화에 SSH가 널리 사용됩니다. 예를 들어, 원격으로 서버의 설정을 변경하거나 프로그램을 실행시키는 등의 작업을 할 수 있습니다.
    • 포트번호 : 22
  • SSH 작동 원리
  • SSH는 클라이언트-서버 모델을 따릅니다. 일반적으로 다음과 같은 과정으로 작동합니다:
    • SSH 클라이언트는 SSH 서버에 접속을 요청합니다.
    • SSH 서버는 클라이언트의 접속 요청을 수락하고, 클라이언트의 인증을 요구합니다.
    • 클라이언트는 사용자 이름과 비밀번호 또는 공개 키를 이용하여 인증합니다.
    • 인증이 성공하면, 클라이언트와 서버 간의 통신은 암호화된 채널을 통해 이루어집니다.
    • 클라이언트는 SSH 세션을 통해 원격으로 명령어를 실행하거나 파일을 전송할 수 있습니다.

2. 쉘 스크립트

- 쉘은 운영체제에서 제공하는 명령을 실행하는 프로그램, 운영체제의 관리하에 있는 파일, 프린팅, 하드웨어 장치 등을 제공한다. 즉, 운영체제와 다이렉트로 대화하는 프로그램이다. 쉘 스크립트는 리눅스 시스템에서 지원하는 명령어들의 집합을 묶어 프로그램화 한 것이다.

- 쉘 스크립트의 가장 중요한 요소는 자동화하여 자원을 절약할 수 있다는 점이다.

- crontab을 사용하여 자동화할 수도 있고 다른 방법을 사용할 수도 있다.

 

$ crontab -e
$ crontab -l
$ crontab -r
* * * * * ls -al

 

크론은 원하는 시간에 원하는 작업을 할 수 있다. 이것은 스크립트 뿐 아니라 리눅스 명령어 까지 포함되며 javascript나 java 같은 실행파일도 쓸 수 있다. spring 에는 스케줄러가 비슷한 작업을 할 수 있다. 로그를 남기고 싶으면 다음과 같이 사용할 수도 있다.

 *       *        *     	 *        *
분(0-59)  시간(0-23)  일(1-31)  월(1-12)   요일(0-7)
* * * * * /home/script/test.sh > /home/script/test.sh.log 2>&1

 

curl 명령어

  • 다양한 네트워크 프로토콜을 이용하여 데이터를 전송하고 받는 도구입니다. 주로 HTTP, HTTPS를 포함한 FTP, FTPS, SCP, SFTP 등의 프로토콜을 지원하며, 특히 커맨드 라인 환경에서 웹 서버와 통신하거나 파일을 다운로드하는 데 사용
  • curl [옵션] [URL]
    • POST 요청 curl -X POST -d "param1=value1&param2=value2" URL
    • GET 요청 curl [URL]
    • 파일 다운로드 curl -O [URL]
    • curl -H "Authorization: Bearer token123" URL

주요 리눅스 스트레스 테스트 도구

  1. Stress
    • 설명: Stress는 리눅스 시스템의 CPU, 메모리, I/O, 디스크 등의 자원을 테스트하는 강력한 도구입니다.
    • 특징: 다양한 스트레스 테스트 시나리오를 지원하며, 여러 CPU 코어를 동시에 사용하여 부하를 가합니다. 유닉스 계열의 다양한 플랫폼에서 사용할 수 있습니다.

 

3. 입출력 리다이렉션과 파이프

표준 출력

  • 표준 출력: 결과를 모니터에 출력.
  • > 문자를 사용해 표준 출력을 파일로 리다이렉션해 저장할 수 있음
    - ls > ls.txt
  • >> : 파일에 추가(append)할 경우 사용
    - cat test1.txt >> ls.txt

표준 입력 - 키보드 : 파일 디스크립터 숫자로 0
표준 출력 - 모니터 : 파일 디스크립터 숫자로 1
표준 에러 - 모니터 : 파일 디스크립터 숫자로 2
2>&1 : 표준 출력이 전달되는 곳으로 표준 에러를 전달하는데, 마지막에 &를 사용해 현재 명령을 백그라운드로 실행

표준 입력

  • 표준 입력 : 키보드로부터 데이터를 입력받는 것. 파일 디스크립터 숫자값으로 0
  • 키보드를 대신해 파일로부터 입력을 받는 경우 < 문자를 사용

파이프

  • | 문자를 사용해 두 명령어를 이어줌. 앞에서 실행한 명령의 결과값을 뒤에 적은 명령어의 입력으로 사용
  • 즉, 파이프로 연결된 하나의 표준 출력을 다른 명령의 표준 입력으로 사용

4. Network TX / RX 

1. TX

  • 데이터 전송을 의미, 네트워크에서 한 장치가 데이터를 전송할 때 사용하는 용어
  • 파일을 다운로드 하거나 이메일을 보내는 경우 데이터가 TX됨.
  • TX는 데이터를 전송하는 동작 자체를 나타냄

2. RX

  • 데이터 수신을 의미하며 데이터를 받을 때 사용하는 용어
  • 웹 페이지를 열거나 파일을 수신받는 경우 데이터가 RX
  • RX는 데이터를 수신하는 동작 자체를 나타냄

 

5. 쉘 스크립트의 다양한 사례

셸 스크립트(Shell script)는 주로 Unix 및 Unix 계열 운영 체제에서 사용되며, 각종 자동화 작업, 시스템 관리, 데이터 처리 등 다양한 목적으로 활용됩니다. 여기에는 몇 가지 흔한 예시들이 있습니다:

  1. 백업 스크립트: 주기적으로 시스템 파일을 백업하거나 데이터베이스를 백업하는 스크립트를 작성할 수 있습니다. 이는 주로 tar나 rsync 같은 유틸리티를 이용하여 파일을 압축하거나 복사합니다.
  2. 로그 파일 처리: 로그 파일을 주기적으로 분석하거나 특정 이벤트를 모니터링하는 스크립트를 작성할 수 있습니다. grep, awk, sed와 같은 명령어를 활용하여 원하는 정보를 추출하거나 처리합니다.
  3. 시스템 모니터링: 시스템 리소스 사용량을 모니터링하고 경고를 보내는 스크립트를 작성할 수 있습니다. top, ps, free 등의 명령어를 사용하여 CPU 사용률, 메모리 사용량 등을 체크하고 이를 이메일이나 메시지로 전송할 수 있습니다.
  4. 자동화된 배치 작업: 특정 조건이 충족되었을 때 파일을 이동하거나 데이터베이스 업데이트를 실행하는 스크립트를 작성할 수 있습니다.
  5. 웹 서버 설정 관리: 웹 서버 설정 파일을 자동으로 수정하고 재시작하는 스크립트를 작성할 수 있습니다. 이는 Apache나 Nginx와 같은 웹 서버의 설정 관리에 유용합니다.

6. 리눅스와 비슷한 터미널 환경 설정 방법

macOS

 
  •   이 의미는 리눅스 명령어를 사용할 수 있으며 쉘 스크립트를 사용할 수 있는 환경이라 해석된다. maxOS의 경우 리눅스 계열로 리눅스의 명령어들이 대부분 허용된다. 그러나 완전한 리눅스라곤 할 수 없으며 Homebrew를 이용하여 필요한 패키지(예: bash-completion, coreutils 등)를 설치하여 더 최적의 환경을 만들 수 있다.

Window

  • WSL을 활용하여 리눅스 배포판을 설치할 수 있습니다. Ubuntu, Debian, Fedora 등을 선택할 수 있다. 

그러나 가장 좋은 것은 도커 아닐까

도커를 사용하면 localhost를 통해 내부의 모든 컨테이너들이 소통하며 작업할 수 있다. 가상환경을 사용하면 결국 내 Spring WAS 가 배포되어있지 않다면 내 가상환경과 편리하게 소통할 수 없다.