본문 바로가기
Study/Linux,Ubuntu

Linux(2)

by 왕방개 2024. 3. 29.

1.Editor(문서 편집기)

1)종류

=>GUI (Graphic User Interface)환경:gedit

=>CLI(Command Line Interface)환경

-행 단위 편집기: ed, ex,sed

-화면 단위 편집기:vi,emacs

전통적으로 vi 편집기를 개발자들이 선호

 

2)vi 편집기 실행

=>vi 파일 경로

파일 경로에 파일이 존재하면 수정이고 존재하지 않으면 새로 만들기

 

3)vi 편집기 모드
=>입력 모드: 텍스트를 작성하고 편집하는 모드
=>명령 모드: 텍스트 편집은 할 수 없고 명령어를 사용해서 저장하고 종료하는 모드

4)모드 전환
=>입력 모드 -> 명령 모드: esc
=>명령 모드 -> 입력 모드: i, I, a, A, o, O

 

5)종료 - 명령 모드에서 수행
=>wq!: 저장하고 종료
=>q!: 저장하지 않고 종료

 

6)커서 이동

k: 한 행 위로 이동
j: 한 행 아래로
l: 한 글자 오른쪽으로
h: 한 글자 왼쪽으로
^ 또는 O: 행의 처음으로 이동
$: 행의 마지막
-: 커서를 앞 행의 처음으로 이동
+ 또는 Enter: 커서를 다음 행의 처음으로 이동

H: 화면의 맨 윗 행으로
M: 커서를 화면의 중간 행으로
L: 화면의 마지막 행으로

w: 다음 단어의 첫 글자
b: 앞 단어의 첫글자 
e: 다음 단어의 마지막 글자

 

7)화면 이동
=>^u: 반 화면 위로 이동
=>^d: 반 화면 아래로 이동
=>^b: 한 화면 위로 이동
=>^f: 한 화면 아래로 이동
=>^y: 화면을 한 행만 위로 이동
=>^e: 화면을 한 행만 아래로 이동

 

8)원하는 행으로 이동
=>행번호G
=>:행번호(Enter)

9)검색
=>/문자열: 문자열을 아래 방향으로 검색
=>?문자열: 문자열을 위 방향으로 검색
=>n: 현재 찾는 방향으로 다음 문자열 검색
=>N: 현재 찾는 반대 방향으로 다음 문자열 검색

 

10)파일 읽어오기
=>:r 파일경로 -> 파일을 읽어서 현재 커서 위치에 삽입
=>:e 파일경로 -> 지정한 파일로 전환
=>:n -> vi 로 여러 개의 파일을 한꺼번에 연 경우 다음 파일로 작업을 이동

11)셸 명령 수행
=>:! 명령어: vi를 중단하고 명령을 실행 - 돌아올 때는 Enter
=>:sh: vi를 빠져나가서 셸 명령을 실행 - 돌아올 때는 exit

 

2.Shell

1)개요
=>명령어 해석기
=>사용자가 입력한 명령을 해석을 해서 커널로 전달하고 커널의 처리 결과를 사용자에게 전달하는 역할

2)기능
=>명령어 해석기
=>프로그래밍
 - 셸은 자체 내에 프로그래밍 기능이 있어서 프로그램을 만들 수 있음: Windows 의 Command Line 과 Power Shell 의 차이점
=>사용자 환경 설정
 - 셸은 사용자 환경을 설정할 수 있도록 초기화 파일 기능을 제공
 - 사용자가 로그인을 하면 초기화 파일이 실행되어 사용자 별로 특성에 맞게 초기 환경이 설정됨

3)셸의 종류
=>Bourne Shell: 최초의 셸, 유닉스 v7에서 처음 등장, 현재는 배시셸이나 대시셸로 대체
=>C Shell: 유닉스에서 주로 사용하던 셸
=>Korn Shell: 유닉스에서 주로 사용하던 셸
=>Bash Shell
 - Bourne Shell 과 호환
 - Bourne Shell 에 C Shell 과 Korn Shell의 기능을 추가
 - 리눅스의 기본 셸
=>Dash Shell
 - 작은 크기로 만들어진 셸
 - 우분투에서는 Dash Shell 이 기본인 버전도 있음
 
4)지원하는 셸 확인
=>cat /etc/shells

5)C Shell 설치
=>sudo apt-get update: 설치되어 있는 패키지들의 새로운 버전이 있는지 확인할 때 사용
=>sudo apt-get upgrade: 위의 명령으로 확인된 패키지를 업데이트
=>sudo apt-get install csh: csh를 설치

 

6)Shell 변경 -  현재 에러
=>기존의 다른 버전의 Linux 를 사용하던 유저들은 변경된 셸 대신에 익술한 셸 사용을 위해서 사용
=>chsh [옵션] [사용자명]
=>현재 셸 확인
echo $SHELL
=>C Shell 로 변경
chsh -s /bin/sh 사용자이름

7)출력
=>echo 문자열: 문자열을 출력
echo -n 문자열: 문자열을 출력하고 줄 바꿈을 하지 않음

변수 출력: echo $변수명
 echo $SHELL 은 SHELL 이라는 변수에 저장된 내용을 출력

=>printf(C 언어의 출력 함수)
 - 서식 사용도 가능: printf "%010d\n" 200
   200을 10자리로 출력하는데 앞에 0을 추가해서 10자리로 만듬

 

8)wildcard 문자
=>*: 0개 이상의 문자열
ls *: 모든 파일을 전부 출력하는데 서브 디렉토리의 내용도 출력

cp * /tmp: 현재 디렉토리의 모든 내용을 tmp에 복사

ls -l h*d: 현재 디렉토리에서 h로 시작하고 d로 끝나는 모든 파일을 자세히 보기

=>?: 1개의 문자
*은 문자열이 없어도 되지만 ?는 반드시 1개

=>[ ]: 나열한 것 중 하나
ls [stu]ample.txt

=>[ ] 안에서 -는 범위를 의미
여기서 범위는 코드 값 기준
[A-Za-z] 은 영문
[A-z]은 영문 이외의 글자가 포함됨
A는 65 이고 Z는 90 그리고 소문자 a는 97이기 때문에 중간에 6개의 문자가 포함됨

=>~: 사용자의 홈 디렉토리

=>-: 이전 작업 디렉토리

=>`: 백틱은 명령어를 그대로 수행
echo "Today is date": 문자열로 출력
echo "Today is `date`": date라는 명령어의 출력 결과가 같이 출력

=>;
- 명령어를 순서대로 실행
date;ls;pwd -> date 명령 과 ls 명령 그리고 pwd 명령을 순서대로 실행

=>|
- 앞 명령의 출력 결과를 뒤의 명령에 전달
ls -al | more

=>\
 - 그대로 해석
 echo $SHELL: SHELL 이라는 변수에 저장된 내용을 출력
 echo \$SHELL: $SHELL로 출력

=> >, >>, <
 - > 와 >> 은 파일에 출력하는 것인데 >> 은 끝에 추가
 - < 은 파일에서 읽어오기

ls -al > sample.txt: ls -al 명령의 결과를 sample.txt 파일에 덮어씌우는 것
ls -al >> sample.txt: ls -al 명령의 결과를 sample.txt 파일의 끝에 추가
cat < sample.txt: sample.txt 파일의 내용을 화면에 출력

 

9)셸 변수
=>종류
 - Local Variable: 현재 셸에서만 사용 가능한 변수
 - 환경 변수: 현재 셸과 서브 셸에서 모두 사용 가능한 변수

=>변수 확인
 - echo $변수명
 - env: 환경 변수 전부 출력
 - set: 모든 변수 와 함수를 출력

=>변수 수정
 - Local Variable: 변수명 = 값
 - 환경 변수: export 변수명 = 값
 - 환경 변수를 Local Variable로 수정: export -n 변수명

=>변수 삭제
 - unset 변수명

=>특정 환경 변수 확인
echo $PATH -> 현재 위치에 명령이 없을 때 찾는 위치를 설정하는 환경 변수, 자주 사용하는 파일이나 명령이 있는 경우 심볼릭 링크나 PATH에 추가해두면 편리합니다.

echo $USER -> 현재 접속한 유저
echo $LOGNAME

=>실습
set -> 모든 환경 변수와 함수를 출력

env -> 환경 변수만 출력

- 지역 변수 생성
SOME=VALUE

- set을 호출하면 확인은 가능하지만 너무 많은 내용이 출력
set | grep SOME: SOME이라는 변수를 출력

echo SOME: SOME에 저장된 값을 출력

- 지역 변수는 env 로 확인이 불가능
env | grep SOME 은 아무런 내용도 출력되지 않음

export SOME 은 SOME 이라는 변수를 환경 변수로 변경

env | grep SOME 내용을 확인할 수 있음

export -n SOME 은 SOME 이라는 환경 변수를 일반 변수로 변경

unset SOME 은 SOME을 삭제

=>자주 사용하는 값은 환경 변수 나 Local Variable로 만들어서 사용
Java 를 하는 경우 Java가 설치된 경로를 자주 사용해야 합니다.
export JAVA_HOME=자바가설치된경로

자바가 설치된 경로가 필요하면 JAVA_HOME 이라는 환경변수를 확인하면 됩니다.

10)alias
=>명령에 별명을 붙이는 것
=>자주 사용하는 명령과 옵션이 있다면 별명을 붙여서 사용하면 효율적
=>형식
alias 별명=원래명령
 - 원래 명령 사이에 공백이 있으면 작은 따옴표로 묶어 주어야 합니다.

=>제거
unalias 별명

=>실습
ls -al 명령을 자주 사용

alias l.='ls -al' 을 사용하면 ls -al 대신에 l.을 사용하는 것이 가능

unalias l. 을 수행하면 별명이 제거

=>가끔 원래 명령어 이름을 별명으로 사용하는 경우가 있는데 이 경우는 기존의 명령을 사용할 수 없음
alias rm='rm - i' 을 수행하면 rm 명령을 호출하면 rm -i 가 호출
기본의 rm 명령은 사용할 수 가 없습니다.

11)history
=>이전에 사용했던 명령을 다시 불러 내는 기능
=>이전에 실행했던 명령어 재실행
 - !!: 직전에 실행한 명령어 재실행
 - !번호: 번호에 해당하는 명령을 재실행
 - !문자열: 문자열로 시작하는 가장 마지막 명령을 재실행
=>히스토리는 .bash_history 라는 파일에 저장
=>화살표를 이용해서 예전에 수행했던 명령을 확인할 수 있음

 

3.환경 설정

1)시스템 환경 설정 파일

=>시스템을 사용하는 전체 사용자의 공통 환경을 설정하는 파일
=>모든 사용자가 로그인할 때 무조건 실행
=>배시셸의 시스템 환경 설정 파일은 /etc 디렉토리에 존재
=>이 파일들은 일반 사용자의 수정할 수 없으며 시스템 관리자만 수정이 가능
=>/etc/profile 과 /etc/bashrc 파일은 향후 리눅스 업데이트 시 일관성있는 관리를 위해서 수정하지 않는 것을 권고
=>시스템 별로 환경을 다르게 구성할 필요가 있는 경우 /etc/profile.d 에 sh 파일을 추가하도록 권고
=>파일
 - /etc/profile: 본셸이나 호환되는 모든 셀에 공통으로 적용되는 환경 설정 파일
 - /etc/bash.bashrc: 기본 프롬프트를 설정하는 파일
 - /etc/profile.d/이름.sh: 언어나 명령 별로 각각 필요한 환경을 설정, 필요할 때 마다 추가

 

2)사용자 환경 설정 파일
=>각 사용자의 홈 디렉토리에 숨김 파일로 존재하며 사용자가 내용을 수정하고 관리
=>로그인을 하면 시스템 환경 설정 파일을 읽어서 시스템 공통 환경을 만들고 사용자 환경 설정 파일을 읽어서 각각의 사용자의 환경 설정을 수행
=>파일
 ~/.profile: 경로 추가 등 사용자가 정의하는 환경 설정 파일

 



 ~/.bashrc: 히스토리 크기나 앨리어스 또는 함수 등을 설정

 ~/.bash_logout: 로그아웃 될 때 수행할 함수를 작성
로그아웃 될 때 사용 중인 자원을 해제해 주어야 합니다.
개발자가 직접 수정하기 보다는 운영자가 수정

 ~/.bash_aliases: 앨리어스를 저장하는 파일

 

3)환경 설정 파일을 수정한 후 적용하는 방법
=>로그아웃을 하고 다시 로그인
=>source 환경설정파일경로 명령을 수행해서 적용

4)별명 과 관련 환경 설정 파일을 수정하고 적용
=>sudo vi ~/.bash_aliases 명령으로 파일을 편집할 수 있도록 수행

alias c=clear 라고 작성

=>esc를 누르고 :wq! 명령을 수행해서 저장

=>source ./.bash_aliases 명령을 수행해서 변경 내용을 적용

=>c를 입력하고 Enter를 누르면 화면이 클리어

=>셸이 변경된 경우는 chsh -s /bin/bash 명령을 수행하고 재부팅을 하면 이전처럼 bash 셸이 열림

 

4.파일 접근 권환 관리

1)개요
=>리눅스 와 같은 다중 사용자 시스템은 사용자의 파일에 마음대로 접근할 수 없도록 보안 기능을 제공
=>사용자는 자신의 파일 과 디렉토리 중에서 다른 사용자가 접근해도 되는 것 과 그렇지 않은 것을 구분해서 접근 권한을 제한 할 수 있음
=>파일의 접근 권한을 확인하는 명령은 자세히 보기 명령을 이용
ls -l 파일경로
=>ls -l /etc/hosts
-rw-r--r-- 1 root root 230

처음 10개의 문자
  첫번째 문자는 파일은 - 디렉토리는 d
  rwx: 소유자 관련 권한
  rwx: 그룹 사용자 관련 권한
  rwx: 기타 사용자

  r은 읽기 권한이고 w는 쓰기 권한이면 x는 실행 권한
  9개를 3개씩 묶어서 8진수로 표현하기도 합니다.

  -rw-r--r--: 파일이고 소유자는 읽기 와 쓰기가 가능하고 그룹 사용자는 읽기만 가능하고 기타 사용자도 읽기만 가능

다음에 나온 숫자 1은 하드 링크 수

첫번째 root 는 파일 소유자의 로그인 ID
두번째 root 는 파일이 속한 그룹의 이름
230은 파일의 크기
마지막 수정 날짜 및 시간
파일 경로

 - Mac 이나 Linux 에서 작업을 하다 보면 권한이 불충분하다고 나오는 경우가 있는데 이 경우는 파일의 접근 권한을 확인해보아야 합니다.

2)chmod
=>파일의 접근 권한을 수정하는 명령어
=>기호 모드
chmod [옵션] 기호 연산자 권한 파일경로
   옵션은 -R 이 있는데 하위 디렉토리까지 전부 변경
   기호
u: 소유자
g: 파일 소유 그룹
o: 소유자 와 그룹 이외의 기타 사용자
a: 전체 사용자
   연산자
+
-
=
   권한
r: 읽기
w: 쓰기
x:  실행


=>실습
 - 홈 디렉토리에 ex 라는 디렉토리를 생성
   cd ~ : 홈 디렉토리로 프롬프트를 이용
   mkdir ex
 - ex 디렉토리로 프롬프트 이동
   cd ex
 - /etc/hosts 파일을 현재 디렉토리에 test.txt로 복사
  cp /etc/hosts test.txt
 - 확인
  ls -l

  -rw-r--r-- 1 adam adam 230 시간 test.txt
  파일이고 소유자는 읽기 와 쓰기 권한을 가지고 있고 그룹 사용자는 읽기만 그리고 기타 사용자는 읽기만 가능하면 하드 링크는 1개이고 파일의 소유자 와 그룹은 adam 이며 파일의 크기는 230 바이트

 - 소유자의 크기 권한 제거
chmod u-w test.txt
ls -l
-r--r--r-- 1 adam adam 230 시간 test.txt

 - 그룹에 쓰기 와 실행 권한 추가
chmod g+wx test.txt
ls -l
-r--rwxr-- 1 adam adam 230 시간 test.txt

 - 기타 사용자에게 실행 권한을 부여
chmod o+x test.txt
ls -l
-r--rwxr-x 1 adam adam 230 시간 test.txt

 - 그룹 과 기타 사용자에게 실행 권한을 부여
chmod go+x test.txt
ls -l
-r--rwxr-x 1 adam adam 230 시간 test.txt

 - 모든 사용자에게 실행 권한을 부여
chmod a+x test.txt
ls -l
-r-xrwxr-x 1 adam adam 230 시간 test.txt

=>숫자를 이용한 파일 접근 권한 변경
 - 각 그룹 별로 3개씩 이진수로 묶어서 8진수로 변환해서 권한 부여를 할 수 있습니다.
 chmod 8진수3개 파일경로

 rwx: 7
 rw-: 6
 r-x: 5
 r--: 4
 -wx: 3
 -w-:2
 --x:1
 ---:0

 - 모든 사용자에게 읽기 권한을 부여
   chmod 444 test.txt
   ls -l
-r--r--r-- 1 adam adam 230 시간 test.txt

 - 그룹에만 쓰기 와 실행 권한을 부여
   chmod 474 test.txt
   ls -l
-r--rwxr-- 1 adam adam 230 시간 test.txt

=>많이 사용되는 권한
751: 소유자는 모든 권한을 다 가지고 그룹 사용자는 읽기 와 실행 권한을 그리고 기타 사용자는 실행 권한만 갖는 것

3)기본 접근 권한
=>파일이나 디렉토리를 생성했을 때 처음에 부여되는 권한
=>일반 파일의 경우는 소유자 와 그룹에는 읽기 와 쓰기 권한이 설정되고 기타 사용자에게는 읽기 권한만 설정
=>디렉토리의 경우는 소유자 와 그룹에는 읽기, 쓰기, 실행 권한이 부여되고 기타 사용자에게는 읽기 와 실행만 부여됩니다.
=>실습
 - 빈 파일을 생성
   touch adam.txt
 - 빈 디렉토리 생성
   mkdir temp
 - 접근 권한 확인
   ls -l

=>기본 접근 권한 확인
umask  -> 4자리 숫자로 출력되는데 첫 숫자를 제외하면 숫자로 접근 권한 변경하는 것 과 동일한데 0 과 1을 반대로 적용 - 0002 라면 실제 권한으로 777 - 002 하면 775(읽기쓰기실행 읽기쓰기실행 읽기실행) 가 됩니다.
umask -S -> ugo 로 나누어서 권한을 확인

=>기본 접근 권한 변경
umask 변경할권한을반대로작성
기본 권한을 751로 설정하는 경우 umask 026 이라고 하면 됩니다.
파일은 실행 권한이 없습니다

umask 026
touch linux.txt
ls -l

4)특수 접근 권한
=>umask의 맨 앞자리는 특수 접근 권한
0이면 일반 파일이고 1, 2, 4 특수 접근 권한
=>1은 sticky bit 라고 하고 2는 SetGID 그리고 4는 SetUID
=>SetUID는 설정된 파일을 실행하면 해당 파일이 실행되는 동안은 사용자의 권한이 아니라 파일 소유자의 권한이 적용
=>SetGID는 설정된 파일을 실행하면 해당 파일이 실행되는 동안은 사용자의 권한이 아니라 그룹 소유자의 권한이 적용
=> sticky bit는 디렉토리에 설정하는 것으로 스티키비트가 1이면 모든 사용자가 사용할 수 있는 공유 디렉토리
이렇게 만들어진 디렉토리가 /tmp
tmp 디렉토리는 접속한 유저에 상관없이 누구나 사용가능한 디렉토리

 

5.프로세스

1)개요

=>실행 중인 프로그램
=>프로세스는 부모-자식 관계로 실행
 - 필요에 따라 부모 프로세스는 자식 프로세스를 생성하고 자식 프로세스는 다른 자식 프로세스를 생성하는 것이 가능
 - 리눅스 시스템은 부팅할 대 스케줄러가 실행한 프로세스인 systemd 와 kthreadd 프로세스를 제외하면 전부 부모 프로세스를 가지고 있음
 - 자식 프로세스는 부모 프로세스에 의해 만들어지는 프로세스인데 자신의 작업이 끝나면 결과를 부모 프로세스에게 돌려주고 종료하는데 vi를 실행해서 셸이 vi 프로세스를 생성한 경우 셸은 부모 프로세스가 되고 vi는 자식 프로세스가 되며 사용자가 vi를 종료하면 vi는 부모 프로세스인 셸로 돌아갑니다.

2)PID
=>프로세스가 가지는 고유한 번호 - Process Identification Number
윈도우즈도 소유하고 있음
=>PID는 1번부터 시작하고 프로세스가 실행되면서 하나씩 증가하면서 부여됨
1번은 systemd 프로세스이고 2번은 kthreadd 프로세스
유닉스에서는 1번 프로세스가 init 이었는데 리눅스는 systemd 로 변경을 했지만 호환성 문제 때문에 init 이라고 소유하고 있는데 이는 심볼릭 링크
=>심볼릭 링크 인지 확인: ls -l /sbin/init

3)프로세스 종류
=>일반적인 프로세스는 사용자가 실행하면 실행된 후 바로 종료됨
=>Daemon Process
 - 특정 서비스를 계속해서 제공하기 위해 존재하는 프로세스: 데이터베이스가 대표적인 예
 - 리눅스 커널에 의해서 실행
 - 평소에는 대기 상태로 존재하다가 요청이 오면 서비스를 제공

=>Orphan Process(고아 프로세스)
 - 자식 프로세스가 아직 실행 중인데 부모 프로세스가 종료된 경우
 - 이런 경우에는 고아 프로세스의 부모가 init 이 되서 나중에 init이 종료될 때 같이 종료되도록 해줍니다.

=>Zombie Process
 - 자식 프로세스는 종료될 때 부모 프로세스에게 종료 정보를 보내고 부모 프로세스가 이 정보를 받으면 자식 프로세스는 프로세스 테이블에서 삭제되어야 하는데 자식 프로세스가 실행을 종료했는데도 프로세스 테이블에 남아있는 경우
 - 일반적인 프로세스는 kill 명령으로 종료시킬 수 있지만 좀비 프로세스는 SIGCHLD 시그널을 부모 프로세스에게 전송해서 정리하도록 하거나 부모 프로세스 자체를 종료해야 함
부모 프로세스가 종료되면 좀비는 고아가 되고 고아는 init의 자식 프로세스로 등록되는데 init은 주기적으로 자식 프로세스의 종료 정보를 조회해서 정리를 합니다.

4)프로세스 목록 확인
=>ps 명령
 - 현재 실행 중인 프로세스에 대한 정보를 출력
 - 형식
ps [옵션]
 - 옵션
유닉스 옵션
e : 실행 중이 모든 프로세스 정보를 출력
f : 프로세스에 대한 자세한 정보를 출력
u uid : uid에 해당하는 사용자에 대한 모든 프로세스의 정보를 출력
p pid : pid로 지정한 프로세스 정보를 출력
BSD 옵션
a: 터미널에서 실행 시킨 것만 출력
u: 프로세스의 상세 정보
x: 모든 프로세스 정보 출력
GNU 옵션
pid pid목록: pid 목록에 해당하는 정보를 출력

 - 특정 프로세스 수행 중인지 확인
   ps -ef | grep 프로세스이름 (bash 가 실행 중인지 확인: ps -ef | grep bash)

=>프로세스 검색
 - pgrep [옵션] [패턴]
 - 옵션
x: 패턴과 정확히 일치하는 프로세스 정보 출력
n: 패턴을 포함하는 가장 최근 프로세스 정보 출력
u 사용자이름: 사용자에 대한 프로세스를 출력 
l: PID 와 프로세스 이름을 출력
t term: 특정 단말기

 - bash가 실행 중인지 확인
 pgrep -x bash
 pgrep -l bash
 
5)프로세스 종료
=>시그널
 - 리눅스에서는 프로세스에게 무언가 발생했음을 알리는 간단한 메시지를 시그널이라고 합니다.
 - 시그널 확인: kill -l
   1번 시그널: 터미널 과 연결이 끊어진 경우
   2번 시그널: CTRL + C로 강제 종료한 경우 - 인터럽트라서 그냥 종료
   3번 시그널: CTRL + /를 입력하면 발생 - 코어 덤프를 수행하고 종료
   15번 시그널: kill 명령이 보내는 시그널

=>프로세스 종료
 kill [-시그널] PID

=>프로세스 종료 실습
 첫번째 터미널에서 man ps 명령을 수행해서 프로세스를 실행

 다른 터미널을 추가해서 pgrep -x man 명령으로 pid를 확인하고 kill PID를 입력하면 프로세스가 종료

6)프로세스 모니터링
=>top 명령을 수행하면 프로세스 정보를 주기적으로 출력
=>리눅스 운영자는 이 정보를 모니터링

7)포그라운드 작업
=>사용자가 명령을 입력하거나 프로세스를 실행하면 결과를 화면에 출력하거나 작업을 수행하면서 대화형으로 작업을 수행하는 것
=>포그라운드 프로세스는 한 번 실행되면 종료될 때 까지 다른 명령이나 프로세스를 실행할 수 없습니다.
데몬의 형태로 수행되어야 하는 프로세스는 포그라운드로 실행하면 안됨
=>sleep 이라는 명령은 현재 실행 중 인 스레드를 대기시키는 명령
sleep 100

8)백그라운드 작업
=>다른 프로세스를 실행할 수 있도록 비동기적으로 동작하는 프로세스
=>작업이 백그라운드에서 수행됨
계속해서 서비스를 해야하는 작업은 백그라운드로 실행해야 합니다.
=>리눅스에서는 작업 뒤에 & 만 붙이면 백그라운드 프로세스가 됩니다.
=>대화형으로 작업해야 하는 경우는 이런식으로 작업하면 안됩니다.

9)작업 목록 보기
=>jobs 명령
=>백그라운드에서 수행 중인 모든 작업을 출력

10)작업 전환
=>CTRL + z: 포그라운드 작업을 중지
=>CTRL + c: 포그라운드 작업을 종료
=>bg %작업번호: 작업번호가 지시하는 작업을 백그라운드로 전환
=>lg %작업번호: 작업번호가 지시하는 작업을 포그라운드로 전환

11)로그아웃 후에도 백그라운드 작업 계속 실행
=>nohup 명령 &
시간이 오래 걸리는 작업을 수행할 때 사용

12)작업 예약
=>정해진 시간에 한 번만 실행
- 패키지 이름 at: sudo apt-get install at

- 형식: at [옵션] [시각]

- 옵션
   l: 현재 실행 대기 중인 명령의 전체 목록을 출력
   r 작업번호: 현재 실행 대기 중인 명령 중 해당 작업 번호를 삭제
   m: 출력 결과가 없더라도 작업이 완료되면 사용자에게 메일로 알려줌
   f 파일: 표준 입력 대신 실행할 명령을 파일로 저장해서 사용

- 시간 설정
  at 4pm + 3days: 3일 후 오후 4시
  at 10am Jul 31: 7월 31일 오전 10시에 수행
  at 1am tomorrow: 내일 오전 1시
  at 10:00am today: 오늘 오전 10시

- 작업 확인
 ls -l /var/spool/cron/atjobs

- 작업 삭제
 at -d 작업번호

- 실습
 현재 시간 확인: date
 
 부팅 할 때 자동 실행되도록 명령을 작성: sudo systemctl enable --now atd

 5분후 작업이 실행되도록 설정: at now+10 minutes

 작업 설정: /usr/bin/ls > ~adam/at.out

 설정 종료: CTRL + d 

 작업 확인: sudo ls -l /var/spool/cron/atjobs
  at -l

=>정해진 시간에 반복 실행 - crontab
 - 주기를 가지고 수행해야 하는 작업에 사용: Batch Processing
 
 - 형식
   crontab [-u 사용자계정] [옵션] [파일경로]
 
 - 옵션
   e: crontab 파일을 편집
   l: crontab 파일의 목록을 출력
   r: crontab 파일을 삭제
 
 - crontab 명령으로 관리하는 파일은 사용자 별로 별도로 생성됨
 - crontab 파일에는 여러 개의 작업을 저장할 수 있으며 한 행에 하나의 작업을 설정
 - crontab의 시간 설정 및 작업
 0-59 사이의 분 0-23 사이의 시간 1-31 사이의 일 1-12 사이의 월 0-6 사이의 요일 작업내용

 요일은 0이 일요일
 항목의 값이 *이면 해당 항목의 모든 값을 의미
 - 을 이용해서 범위를 설정할 수 있음(요일 자리에 1-5를 설정하면 월요일부터 금요일)
 , 를 이용해서 목록을 만들 수 있습니다.(시간 자리에 1,2,3을 설정하면 1시 2시 3시 입니다.)
 /를 이용하면 간격를 설정할 수 있습니다. 분 필드에 1-10/2(1분 부터 10분까지 2분 마다 - 1,3,5,7,9)
 */20 은 20분 마다

30 23 1 * * /usr/bin/ls -l ~adam > ~adam/cron.out

사용자 계정의 cron.out 이라는 파일에 /usr/bin/ls -l ~adam 명령의 결과를 출력
월 과 요일은 반복
매월 1일 23시 30분에 작업을 반복적으로 수행

/usr/bin/ls -l ~adam > ~adam/cron.out 를 python main.py 로 변경하면 정해진 시간에 python main.py 명령을 반복적으로 수행하고 main.py 내용이 실행

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

Linux(3)  (0) 2024.04.01
Ubuntu,Linux(1)  (0) 2024.03.27