본문 바로가기
Study/Linux,Ubuntu

Linux(3)

by 왕방개 2024. 4. 1.

**Linux
1.프로세스 


1)한 번만 자동으로 수행: at 패키지를 이용
=>기본 패키지가 아니라서 설치

2)주기적으로 수행되는 작업
=>crontab 이용: 기본 패키지
=>crontab은 유저 별로 생성되며 파일에 작성해서 수행
=>명령어 형식
crobtab [-u 사용자ID] [옵션] [파일 경로]

  - 옵션
e: 편집
l: 파일 목록을 출력
r: 삭제

  - 하나의 파일에 여러 개의 cron을 설정하는 경우에는 행 단위로 작성
    하나의 행에 하나의 cron을 설정

=>cron 작성 방법
  분 시간 일 월 요일 작업 내용

=>작성
 - 바로 작성: crontab -e
  12 * * * * /usr/bin/ls -l ~adam > ~adam/cron.out

  20 * * * * /usr/bin/ls ~adam > ~adam/ls.out
  작성한 후 나가기에 해당하는 CTRL + x를 누르고 저장하기 위해서 y를 누르고 파일명을 확인하고 Enter
  작성이 제대로 되었다면 새로운 crontab이 만들어졌다고 메시지가 보임
 
=> cron 파일 확인: crontab -l
=> cron 내용 삭제: crontab -r

=>windows 에도 이와 비슷한 역할을 해주는 프로그램이 존재
=>주기적인 작업을 할 때는 사람이 직접 하는 것보다는 cron 작업하는 것을 권장
운영체제 차원에서 제공하기도 하고 응용 프로그램에서 제공하기도 합니다.
Spring Batch 나 Kubenetes 의 Cron, Airflow 등이 있습니다.

3)System Service
=>systemd는 리눅스의 시스템 과 서비스 관리자로 유닉스의 init 프로세스가 하던 작업을 대신 수행
=>systemd는 다양한 서비스 데몬을 시작하고 프로세스들의 상태를 유지하고 시스템의 상태를 관리
=>unit: 서비스
systemd 가 프로세스를 관리할 때 서비스이름.유닛종류 의 형태로 관리
=>유닛 종류
 - service: 시스템 서비스 유닛으로 데몬을 시작, 종료, 재시작, 로드하는 역할
   서버 애플리케이션을 실행할 때 이 유닛을 주로 이용

=>명령
 systemctl [옵션] [명령] [유닛이름]
 - 옵션
a: 유닛 전체를 출력
t: 유닛 종류를 지정해서 출력
 - 명령
start: 시작
stop: 종료

=>현재 동작 중인 유닛을 확인: systemctl
=>특정 종류의 유닛 확인: systemctl -t service

=>서비스 시작: 백그라운드에서 서비스 시작 
 - cron 이라는 서비스를 백그라운드에서 시작
   sudo systemctl start cron
 - cron의 상태 확인
   systemctl is-active cron
 - cron의 서비스 상태 확인
   systemctl status cron.service

=>서비스 중지
 - cron 서비스를 중지
   systemctl status stop cron

4)cgroup
=>개요
 - 자원 사용을 프로세스 그룹 단위로 제어할 수 있는 리눅스 커널 기능
 - 성능면에서는 자원 경합을 줄이고 예측성을 높임
 - 자원에는 CPU/CPUSET, Memory, Network, I/O 등

=>사용
 - cgroup 이라는 가상 파일 시스템을 수동으로 마운트해서 사용
 - libcgroup 같은 툴을 이용해서 그룹을 생성하고 관리하는데 자주 사용되는 명령어는 cgcreate, cgexec, cgclassfy 
 - cgroup을 이용하는 대표적인 소프트웨어가 Docker, LXC 가상화, libvert 등
 - private 이나 public cloud를 구축할 때 중요

=>실제 명령어 실습 등을 하고자 할 때는 apt-get install cgroup-bin libcgroup 을 이용해서 설치를 하고 실습

 

2.Package

1)개요

 

=>리눅스에서는 소프트웨어를 소스 코드 형식 또는 바로 설치해서 사용할 수 있는 패키지 형태로 배포
=>소스 코드로 배포하는 경우 대부분 하나의 아카이브 파일로 묶은 후 압축해서 배포
=>바이너리 패키지로 배포하는 경우에 리눅스에서 주로 사용하는 패키지는 RPM 과 deb 형식인데 우분투는 기본적으로 deb를 사용하고 Redhat 계열에서 RPM을 이용
=>우분투에서도 RPM을 사용할 수 는 있지만 별도의 명령을 설치해야 하기 때문에 특별한 경우가 아니면 사용하지 않음
=>최근의 우분투는 스냅이라는 새로운 패키지의 개념을 도입했는데 이는 의존성 문제(다른 패키지를 설치해야 하는 문제)를 해결한 형태이며 기존의 deb 지원

 

2)특징


=>바이너리 파일로 구성되어 있어서 컴파일이 필요없음
 - 프로그램을 작성해서 실행
 - 소스 코드 작성 -> 컴파일(소스 코드를 번역해서 운영체제 나 VM이 알아볼 수 있는 코드로 변환) -> 빌드(실행가능한 바이너리 파일을 생성) -> 실행

=>패키지의 파일이 관련 디렉토리에 바로 설치됨

=>패키지를 삭제할 때 관련된 파일을 일괄적으로 삭제

=>기존에 설치한 패키지를 삭제하지 않고 바로 업그레이드 가능

=>기존의 설치 상태를 검증할 수 있음

=>패키지에 대한 정보를 제공

=>의존성있는 패키지가 있다면 미리 설치하고 패키지를 설치해도 되고 apt-get 명령을 사용하면 의존성있는 패키지가 자동으로 설치가 됩니다.

 

3)우분투 패키지의 카테고리 - 기업에 가서 소프트웨어를 만들 때 반드시 확인


=>main: 우분투에 의해서 공식적으로 지원이 되고 자유롭게 배포할 수 있음
=>restricted: 우분투에 의해서 지원되나 완전한 자유 소프트웨어는 아닐 수 있음
=>universe: 리눅스에서 사용할 수 있는 소프트웨어로 자유 소프트웨어 일 수 도 있고 아닐 수 도 있으면 기술적 지원이 보장되지 않음
=>multiverse: 자유 소프트웨어가 아닌 소프트웨어가 포함되어 있으므로 개인이 직접 확인

4)우분투 패키지의 이름


패키지명_버전_데비안리비전_ubunth리비전_아키텍쳐.deb
=>아키텍쳐에 all 이 있으면 모든 종류의 시스템에서 사용이 가능하고 amd64 이면 64비트 운영체제에서만 사용 가능

5)apt-cache


=>APT 캐시에 질의해서 여러 가지 정보를 검색
=>형식: apt-cache [옵션] 서브 명령
=>옵션
 f: 패키지에 대한 전체 기록을 출력
 h: 간단한 도움말을 출력
=>서브 명령
 status: 캐시에 대한 통계 정보를 출력
 dump: 현재 설치된 패키지를 업그레이드
 search 키워드: 키워드 검색
 showpkg 패키지이름: 패키지에 대한 정보를 확인하는데 의존성 과 역의존성을 같이 출력
 pkgnames: 사용가능한 모든 패키지의 이름을 출력

=>명령 실습
 - 캐시 정보 확인: apt-cache stats

 - 사용 가능한 패키지 이름 확인: apt-cache pkgnames

 - 패키지 검색: apt-cache search vsftpd


6)apt-get


=>형식: apt-get [옵션] 서브명령
=>옵션
 d: 패키지를 내려 받기만 함
 f: 의존성이 깨진 패키지를 수정하기 위해 시도
 h: 도움말
 - Open Source는 사용자의 동의를 거치거나 알림을 보내지 않고 수정될 수 있기 때문에 의존성 같은 것을 잘 확인해야 함
개발을 할 때는 특정 버전을 지정하고 하는 경우가 많음

=>서브 명령
 - update: 패키지 저장소에서 새로운 패키지 정보를 가져옴
   /etc/apt/sources.list 에 명시한 저장소로부터 패키지 정보를 읽어서 동기화
   /etc/apt/sources.list 파일을 수정한 경우는 반드시 이 명령을 수행해야 합니다.

 - upgrade: 현재 설치된 패키지를 업그레이드

 - install 패키지이름: 패키지를 설치
   xterm 이라는 패키지를 설치: apt-get install xterm
   패키지가 설치된 경우는 업그레이드

 - remove 패키지이름: 패키지 삭제

 - download 패키지이름: 패키지를 현재 디렉토리에 내려 받기
 - autoclean: 불완전하게 내려받았거나 오래된 패키지를 삭제
 - check: 의존성이 깨진 패키지를 확인
 - clean: /var/cache/apt/archives 에 캐시되어 있는 모든 패키지를 삭제해서 디스크 공간을 확보

 - 소스 코드 내려받기: 압축을 풀고자 하는 경우
    sudo apt-get source 패키지이름
 - 소스 코드를 내려받고 컴파일 하고자 하는 경우
    sudo apt-get  --compile source 패키지이름
    패키지를 만들 때 사용한 컴파일러가 설치되어 있어야 컴파일이 가능 - c++: gcc
 

3.파일 아카이브(압축)

=>리눅스는 압축을 할 때 tar를 이용
=>명령어 형식
tar 기능 [옵션] [아카이브파일] [파일명]
=>기능
 c: tar 파일을 생성
 t: 내용을 출력
 x: 원본 파일 추출
 r: 새로운 파일을 추가 - 리눅스는 기존의 압축된 파일에 다른 파일을 추가하는 것이 가능
 u: 수정된 파일을 업데이트

=>옵션
 f: 파일명을 - 으로 지정하면 tar 대신 표준 입력에서 읽어들임
 v: 파일 정보 출력
 h: 심볼릭 링크의 원본 파일을 포함
 p: 파일 복구 시 원래의 접근 권한을 유지
 j: bzip2로 압축하거나 해제
 z: gzip으로 압축하거나 해제

=>많이 사용하는 조합
 - 압축 생성: cvf
 - 내용 확인: tvf
 - 업데이트: uvf
 - 파일 추가: rvf

 

4. 프로그래밍

1)편집기 설치
=>sudo apt-get install vim

2)Shell Programming
=>개요
 - 리눅스의 셸 스크립트는 C언어 와 유사한 방법으로 프로그래밍이 가능
 - 별도로 컴파일하지 않고 텍스트 파일 형태로 작성해서 셸에서 바로 실행할 수 있습니다.
 - 확장자는 sh를 주로 이용
 Mac 을 사용하거나 Linux를 사용할 때 확장자가 sh 라면 이 파일은 셸 스크립트 파일이고 실행이 가능합니다.
 Tomcat 같은 WAS(Web Application Server) 프로그램의 경우 윈도우 와 리눅스 또는 Mac에서 전부 사용할 수 있도록 바이너리 파일을 다운로드 받을 수 있는데 이 때 Windows 용은 bat 나 exe를 실행하는데 리눅스나 Mac 사용자는 sh 파일을 실행하면 됩니다.  

=>실습
 - nano name.sh 명령을 수행하고 작성
 #!/bin/sh
 echo "사용자 이름:" $USER
 echo "홈 디렉토리:" $HOME
 exit 0
 - 실행: sh 파일경로
이 경우는 스크립트 파일의 속성을 변경할 필요가 없음
 - 실행 시 sh 명령을 생략하고자 하는 경우에는 실행 속성을 추가해야 함
  권한 추가 명령 수행: chmod +x name.sh
  명령 실행: 현재 디렉토리에 있는 파일을 개방할 때는 파일 이름 앞에 ./를 붙이지 않아도 되지만 파일을 실행할 때는 현재 디렉토리인 경우 반드시 앞에 ./를 추가해야 합니다.

=>변수 생성 및 값 대입
- 변수=값 
 좌우에 공백이 있으면 안됨
 값에 공백이 있는 경우는 " "로 묶어야 합니다.
 모든 값은 문자열
 변수를 사용할 때는 $변수명 으로 작성
 $를 포함한 문자열을 출력하고자 하는 경우 ' ' 로 묶어야 합니다.

- 변수 작성 및 출력
myvar="Hello Adam"
echo $myvar
echo "$myvar"
exit 0 

=>계산식은 백틱 안에 expr 다음에 기재
괄호를 사용할 때는 \ 와 함께 입력
곱하기(*)는 \를 함께 사용 - 기본적으로 linux 에서 *은 0개 이상의 문자열을 나태나는 wildcard 문자

num=100
echo $num + 10              -> 100 + 10
echo `expr $num + 10`      -> 110


=>셸 프로그래밍 한 내용을 crontab 에 등록해서 실행
 - 실행하고자 하는 셸 파일을 작성 - nano 파일이름.sh
   #!/bin/sh
   echo "Hello Cron"
   exit 0

 - 실행 확인: sh cron.sh

 - crontab에 명령을 등록할 때는 절대 경로를 사용
   sh 명령의 위치를 확인: which sh -> /usr/bin/sh
   실행할 파일의 경로: /home/adam/cron.sh -> ~/cron.sh

 - crontab 실행: crontab -e
   17 * * * * /usr/bin/sh /home/adam/cron.sh

=>제어문
 if [조건]
 then
조건이 true일 때 수행할 문장
 else
조건이 false 일 때 수행할 문장
 fi

같다는 == 대신에 = 나 -eq를 사용

if [ 100 = 200 ]
then
echo "100 equal 200"
else
echo "100 not equal 200:
fi

=>case
case "변수" in
값1)
수행할 내용
값2)
수행할 내용
*)
수행할 내용
esac

=>입력 받기
read 변수명

=>여러 개의 값 연결할 때는 | 를 이용
=>&& 와 || 도 제공

=>반복문 
for 임시변수 in 반복 가능한 데이터
do
수행할 내용
done


while 반복 가능한 데이터
do
수행할 내용
done


3)C Programming
=>C 컴파일러 gcc

=>gcc 패키지 설치: sudo apt-get install gcc

=>설치 확인: gcc

=>컴파일 명령
 gcc -o 실행프로그램경로 소스코드경로

=>실행
실행프로그램경로

=>C언어는 종류가 여러 개라서 윈도우즈의 Visual C++ 컴파일러에서 작성한 내용은 실행이 안될 수 있음

=>작성 및 실행
 - nano 파일명.c 로 해도 되고 vi 파일명.c
   #include <stdio.h>
   int main(){
printf("Hello GCC\n");
printf("%d\n", 'Z');
printf("%d\n", 'a')
return 0;
   }

 - 컴파일 및 빌드
   gcc -o 실행프로그램이름 소스코드경로

 - 실행: 파일 경로를 작성할 때 는 현재 디렉토리에 존재하는 경우 ./를 생략할 수 있지만 실행을 할 때는 ./를 생략하면 안됩니다.

  [A-z]: 이렇게 하게 되면 91~96까지의 특수 문자가 포함됨

4)make
=>실제 패키지는 많은 파일로 복작하게 구성되어 있기 때문에 gcc로 일일이 컴파일해서 하나의 실행 파일로 만드는 것은 번거로운 작업인데 이 작업을 편리하게 해주는 도구가 make
=>make는 makefile에 저장된 정보를 읽어서 여러 소스 파일을 컴파일하고 링크를 해서 최종 실행파일을 생성

=>설치: sudo apt-get install make

=>실습
 - 호출될 함수를 가진 보조 파일: two.c
   #include <stdio.h>
   int two(){
printf("In Module Two\n");
printf("End of Module Two\n");
  }

 - 실행 파일: one.c
  #include <stdio.h>

  extern int two();
  int main(){
printf("Go to Module Two\n");
two();
printf("End of Module One\n");
   return 0;
  }

 - makefile
  TARGET=one
  OBJECTS=one.o two.o
  ${TARGET} : ${OBJECTS}
gcc -o ${TARGET} ${OBJECTS}
  one.o : one.c
gcc -c one.c
  two.o : two.c
gcc -c two.c

 - makefile의 내용을 수행
   make

 - 실행: ./one

=>linux 에서 여러 개의 파일을 가지고 C 언어 프로그래밍을 할 때는 순차적으로 일일이 컴파일하기 어렵기 때문에 지금처럼 make를 이용해서 컴파일과 빌드에 대한 내용을 작성하고 수행합니다.

5)Java 설치 및 실행
=>jdk 8 버전 설치: sudo apt-get install openjdk-8-jdk

=>설치 확인
 java -version
 javac -version

=>nano 클래스이름.java
public class 클래스이름{
public static void main(String [] args){
System.out.println("Java Run");
}
}

=>자바 컴파일: javac 파일경로

=>자바 실행: java 클래스이름

6)파이썬
=>파이썬은 이미 설치되어 있음
=>파이썬 업그레이드: sudo apt-get upgrade python3
=>파이썬 실행: python3 파일경로

 

5.서버 설치


1)원격 접속할 수 있는 서버 만들기
=>외부에서 서버에 접속해서 작업을 수행할 수 있도록 만드는 것
=>Telnet 서버라고도 합니다.
=>서버를 만들고 나면 가장 먼저 하는 일 중의 하나입니다.
=>ubuntu 리눅스에서 만들기
 - ssh 를 설치: sudo apt-get install openssh-server
 - 서비스를 실행: sudo systemctl status ssh
 - 기본적으로 모든 포트는 막혀 있습니다.
외부에서 사용하도록 할 때는 방화벽에 이 포트에 외부에서 접속할 수 있도록 설정을 변경해 주어야 합니다.
 - 방화벽 개방: sudo ufw allow ssh 

 - 리눅스에서 현재 컴퓨터의 IP 확인하는 명령: hostname -I

=>다른 컴퓨터에서 ssh 툴이나 명령어로 접속이 가능

 

원격 서버를 만드는 이유)

1.따로 들고 다니지 않아도 됨

2.동시에 써야겠다

3.명령어 내가 직접 입력했으면 좋겠다 

 

Daemon Service:대화형으로 서비스 되지 않고 실행하면 백그라운드에서 사용자의 요청을 받아서 처리하는 서비스

 

포그라운드 서비스: 대화식으로 실행되고 한 번 실행되면 종료될 때 까지 다른 서비스를 이용할 수 없습니다

 

 

=>실습

1)설치

sudo apt-get update

sudo apt-get install ssh

 

2)서비스로 등록

=>sudo systemctl status ssh

 

3)외부 사용 가능하도록 할 때는 프로그램의 포트를 방화벽에 등록을 해서 접속할 수 있도록 해줘야 합니다.

=>Firewall:외부에서 접속할 떄 접속 가능 여부를 판정해주는 프로그램

=>Proxy:내부에서 외부로 나갈 때 가능 여부를 판정해주는 프로그램

웹 클라이언트와 웹 서버를 분리해서 구현한 경우 도메인이 다르기 때문에 웹 클라이언트에서 자바스크립트를 이용해서 웹 서버에 직접 접속하는 것이 안되는데 이 때 서버쪽에서 허용을 해주거나 클라이언트 측에서 프록시를 이용해서 데이터를 가져와야 합니다.

 

=>외부에서 접속하게 해줌

sudo ufw allow ssh

 

 

4) 현재 컴퓨터 아이피 확인

hostname -l(대문자 I)

 

=>ssh 프로그램을 이용하는 경우: ssh 계정@IP

=>Windows 에서는 Open SSH(설정->시스템->선택적 기능에서 설치)을 설치하거나 putty 같은 접속 프로그램을 이용

 

 

'Study > Linux,Ubuntu' 카테고리의 다른 글

Linux(2)  (0) 2024.03.29
Ubuntu,Linux(1)  (0) 2024.03.27