**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 |