'모두의 리눅스'

미야케 히데아키, 오스미 유스케

----------------------------

6장

파일 검색 및 명령어 사용법

1. 디렉터리 트리에서 파일 찾기

find <검색할 디렉터리> <검색 조건> <액션>
ex. find . -name file -print

파일 이름으로 찾기
-name = 이름으로 찾기
-iname = 대소 구별 없이 이름으로 찾기
*, ? 사용 가능(단, 해당 검색어를 '', "" 로 묶을 것)

파일 형식으로 찾기
-type f = 보통 파일
-type d = 디렉터리
-type l = 심볼릭 링크

ex. find . -type f -name '*.txt' -print
= 현재 디렉터리에서 파일형식이고 이름이 .txt로 끝나는 파일들을 출력하라.
+ 검색 조건사이에 -a 가 생략된 것으로 and를 의미함.

2. 데이터베이스에서 파일 찾기

locate [옵션] <검색 패턴>

사용 이전에 locate 설치가 필요
	1. locate --version 을 통해 설치 유무 파악
    2. 우분투의 경우 sudo apt-get install mlocate 로 설치(관리자)
    	CentOS의 경우 yum install mlocate 로 설치
    3. sudo updatedb 를 통한 데이터베이스 구축

locate의 경우 사전에 만든 데이터베이스를 활용하기 때문에 검색속도가 빠르다.
하지만 해당 명령어는 하루에 한번 꼴로 데이터베이스를 구축하기 때문에 방금 전에 만든 파일같이 데이터베이스에 업데이트가 되지 않은 것들은 검색되지 않는다.

-i = 대소문자 구분 안하는 옵션
-b = 파일 이름만으로 검색(경로 중 해당 문자열이 포함된 경우를 제외)

  • 검색 패턴을 여러개 줄 경우 Or 조건이 적용되고 And 조건을 원하다면 -A 옵션을 주어야 한다.

3. 명령어 사용법 확인하기

[명령어] --help

man [명령어]

help의 경우 설치된 리눅스 자체의 설명이고 man은 온라인 리눅스 설명이다.

man이 더 자세하고 정확하게 나와있기 때문에 다른 자료보다 man 명령어를 통해 해당 내용을 습득하는 것이 바람직하다.

man -k <키워드> 와 같이 키워드를 통한 검색을 통해 사용법도 확인 가능하다.

더불어 man의 경우 각 명령어를 크게 9가지의 섹션으로 나누어 두었기 때문에 같은 이름의 명령어라도 의미가 조금 다를 수 있다.

따라서 an -wa [명령어] 를 입력하여 실제 파일이 저장된 섹션을 확인하고 정확한 명령어에 대한 위치를 찾는 것이 바람직하다.

4. 명령어 검색

명령어의 전체 경로 표시
리눅스의 모든 것은 파일이다.

cat 명령어의 경로는 /bin/cat 으로

which [옵션] <명령어> 를 통해 경로를 파악할 수 있고
ls -lF /bin/cat 으로 해당 내용을 살펴볼 수 있다.

을 통해 확인할 수 있다.

하지만 전체 경로를 입력하지 않고 단순 명령어로만 사용가능한 이유는
셸에서 $PATH라는 환경 변수에 저장된 장소에서 명령어를 자동으로 찾도록 되어있기 때문이다.

echo $PATH 를 통해 명령어의 위치를 파악할 수 있다.
더불어 같은 이름의 명령어가 존재할 경우 which에 -a 옵션을 주어 그 전부를 출력할 수 있다.

----------------------------

7장

텍스트 에디터

1. 텍스트 파일 / 바이너리 파일

바이너리 파일 = 이미지, 음성, 리눅스 명령어
텍스트 파일 = 설정 파일, 스크립트

텍스트 에디터 - Vim

2. Vim

리눅스 기본 설치 텍스트 에디터

1. Vim 설치 여부 확인
vim --version

2. vim 설치
	우분투) apt-get install vim
    CentOS) yum install vim

명령어 입력 모드 = 텍스트 입력 모드 + ESC

vim 사용법(명령어 입력 모드)
	시작 = vim
	종료 = :q

파일 열기
	vim <파일명>

파일 저장하기
	:w

이름 지정 저장
	:w <파일명>

저장하지 않고 종료
	:q!

커서 이동
	h,j,k,l = 각각 좌, 하, 상, 우
    
문자 삭제(커서위치)
	x
    
문자 입력
	i(커서 왼쪽)
    a(커서 오른쪽)
    
단어 단위 이동
	w(오른쪽으로)
    b(왼쪽으로)
    W(공백 기준, 오른쪽으로)
    B(공백 기준, 왼쪽으로)
    
행내 이동
	0(행의 시작으로 이동)
    $(행의 끝으로 이동)

행간 이동
	gg(첫행으로 이동)
    <숫자>G(<숫자>번째 행으로 이동)
    G(마지막행으로 이동)
  
자르기(삭제)
	d [option]
    	d$ - 현재 행의 위치에서 마지막까지 삭제
        d0 - 현재 행의 위치에서 시작까지 삭제
        x, dl - 문자 한 개 삭제
        dw - 단어 한 개 삭제
        dgg - 현재 위치에서 문서 시작까지 삭제
        dG - 현재 위치에서 문서 끝까지 삭제
        dd - 현재 커서가 있는 행 삭제
        
붙여넣기
	p

복사
	y [option]
    	y$ - 현재 행의 위치에서 마지막까지 복사
        y0 - 현재 행의 위치에서 시작까지 복사
        yl - 문자 한 개 복사
        yw - 단어 한 개 복사
        ygg - 현재 위치에서 문서 시작까지 복사
        yG - 현재 위치에서 문서 끝까지 복사
    	yy - 현재 커서가 있는 행 복사

다음 행 연결하기
	J

취소
	u

취소한 동작 재실행
	ctrl + r
    
검색
	/<검색어> - 아래 방향으로 <검색어> 검색
    ?<검색어> - 위 방향으로 <검색어> 검색
    
    n - 다음 검색 결과로 이동
    N - 이전 검색 결과로 이동
    
치환
	:%s/<검색할 문자열>/<치환할 문자열>/g
    
튜토리얼
	vimtutor
    
도움말
	:help

----------------------------

8장

배시 설정

1. alias

명령어 별칭

alias <이름>='<명령어>'

ex. alias ls='ls -F'
ls를 입력하면 ls -F 가 입력됨

alias 확인
	type <명령어>

alias 삭제
	unalias <명령어>
    
alias 일시적 무효화
	command <명령어>
    \<명령어>
    명령어 전체경로 입력

2. 배시(bash)의 옵션

set 명령어

set -o <옵션> - 옵션 활성화
set +o <옵션> - 옵션 비활성화

많이 쓰이는 옵션
	ignoreeof - ctrl + d 셀종료 방지
	noclobber - 존재하는 파일 덮어쓰기 방지
	noglob - 경로확장 무효(* 등)

shopt 명령어

shopt -s <옵션> - 옵션 활성화
shopt -u <옵션> - 옵션 비활성화

많이 쓰이는 옵션
	autucd - 디렉터리 바로 이동(cd 입력 없이도)
    dotglob - 경로 확장(*,?)에서 숨겨진 파일(.시작)도 포함
    cdspell - cd 명령어 실행 시 디렉터리 오타 자동교정
    globstar - 경로 확장, ** 입력시 서브 디렉터리까지 매치함
    histappend - 배시 종료시 히스토리 파일에 명령어 이력을 덮어쓰지 않고 추가함

set과 shopt 명령어는 다름

3. 셸 변수

셸 변수에 숫자나 문자열 등의 값을 저장할 수 있음

변수 설정

	<변수명>=<값>
    
    !주의, 여타 프로그래밍 언어와 달리 띄어쓰기를 하면 안됨.
    !변수명에 공백(띄어쓰기)이 들어갈 경우 ''/"" 로 묶어서 사용

프롬프트 설정

	PS1='변경내용'
    	\u - 사용자 이름
        \w - 현재 디렉터리
        \W - 현재 디렉터리 중 마지막 경로만 표시
        \d - 현재 날짜, 요일, 시간
        \h - 서버 호스트 이름
        \H - 서버 도메인 이름
        \n - 개행문자
        \t - 24시간 단위 현재 시각
        \$ - 현재 사용자가 root사용자면 #, 아니면 $표시
        \\ - \ 표시

PATH - 명령어를 찾는 경로

PATH 확인
	echo $PATH

PATH 추가
	PATH="$PATH:<경로>"

LANG - 로케일(표시 방식)

로케일 확인
	echo $LANG
    
시스템 지정 로케일 전부 확인
	locale -a
    
로케일 변경
	LANG=<언어>.<형식>
    	ex. LANG=en_US.UTF-8

이 외의 셸 변수

HISTFILE - 커맨드 라인 이력을 저장할 파일 이름
HISTFILESIZE - 파일에 저장할 커맨드 라인 이력의 최대개수
HISTSIZE - 메모리에 저장할 커맨드 라인 이력의 최대개수
HOME - 홈 디렉터리
SHELL - 로그인 셸 경로
PWD - 현재 디렉터리

+ 출력방법 = echo $<변수>

4. 환경변수

외부명령어 / 내장명령어

여부 확인
	type <명령어>
    
외부 명령어의 경우 셸 외부에 다른 파일로 존재하기 때문에 셸변수를 참고할 수 없다.
따라서 참고가능한 환경변수로 만들어주어야 한다.

현재 셸의 환경변수 출력
	printenv
    
환경 변수로 설정
	<변수명>='<저장할 문자열>'
	export <셸 변수 이름>
    
    	ex. LESS='--no-init'
        	export LESS
            
            해당 명령어 입력시 less로 띄운 출력값이 꺼지지 않음.

5. 배시 설정 파일

셸을 재부팅하거나 로그인을 다시 할 경우 자동으로 셸의 기능을 적용되도록 하기 위해서는 배시 설정 파일을 수정해야 한다.

사용자별 설정(배시 기동시)
	~/.bashrc 파일 수정
    
사용자별 설정(로그인할 시)
	~/.profile 파일 수정    
    
시스템 전체 설정
	/etc/profile
    
 !주의, 위의 파일들을 수정할 때에는 원하지 않는 명령어가 실행될 경우를 대비하기 위해서 꼭 백업본을 만들어 놓고 진행하거나 또 다른 셸을 기동한다.
 
설정파일 읽기
	vim ~/.bashrc
    
설정파일 반영
	source ~/.bashrc
    
+ 주석 = #    

----------------------------

9장

퍼미션과 슈퍼사용자

1. 파일의 소유자와 소유 그룹

리눅스의 모든 파일에는 소유자가 있다.
소유자는 해당 파일에 대한 접근 권한을 자유롭게 설정 가능하다.

ls -l <경로, 파일명> 을 통해 파일의 소유자를 확인할 수 있다.

ex. ls -l test
	drwxrwxr-x 2   kdch    kdch    4096 Feb  8 00:45 dir1
				  소유자	  소유그룹
                  
groups 를 통해 로그인한 사용자가 속한 소유그룹 확인가능.

2. 파일의 퍼미션

각 파일에는 누구에게 어떤 권한을 허가할지에 대한 정보가 설정되어 있다.

퍼미션도 마찬가지로 ls -l 로 확인 가능하다.

ex. ls -l test
	drwxrwxr-x 2   kdch    kdch    4096 Feb  8 00:45 dir1
    
    맨 앞자리의 파일 형식에 이어서 나온 9글자 rwxrwxr-x는 파일 모드로 파일의 퍼미션을 의미한다.
    
    소유자 / 소유그룹 / 기타사용자
     rwx	  rwx		r-x
     
     > 여기서 r, w, x 는 각각 읽기, 쓰기, 실행에 대한 권한을 의미한다.(없으면 -)(세개씩 끊어서)

3. 디렉터리의 퍼미션

ls -l -d 로 확인 가능(-d는 디렉터리, ls -ld로도 가능)

!주의, r,w,x의 의미가 파일에서와 다름
r : 읽기, 디렉터리에 포함된 파일 리스트 취득 가능
w : 쓰기, 디렉터리 하위에 파일 및 디렉터리 작성, 삭제 가능
x : 실행, 디렉터리로 이동 가능

따라서 읽기 권한이 없다면 ls 명령이 실패함.
마찬가지로 쓰기 권한이 없다면 디렉터리 밑에 파일을 만들거나 지울 수 없다.

파일을 지울 수 있는가에 대한 여부는 파일이 아니라 해당 파일이 담긴 디렉터리의 퍼미션에 의해 결정된다.

4. 파일 모드 변경

파일이나 디렉터리의 퍼미션을 설정

chmod - 파일의 소유자 / 슈퍼 사용자만이 가능한 퍼미션 변경 명령어
   
기호모드(선택적으로 퍼미션을 변경)   
chmod [ugoa] [+-=] [rwx] <파일 이름>

	u - 소유자
    g - 소유 그룹
    o - 기타 사용자
    a - 모두
    
    + - 퍼미션 추가
    - - 퍼미션 금지
    = - 지정한 퍼미션과 같게
    
    rwx는 위에서 언급한 내용과 같음
    
수치모드(기존 퍼미션을 새로운 퍼미션으로 덮어씀)
r = 4, w = 2, x = 1 과 같이 숫자를 부여하고 더해서 기존 퍼미션 대신 새로운 권한을 적용

chmod [수 합산] [파일명]

ex. ls -l test
	drwxrwxr-x 2   kdch    kdch    4096 Feb  8 00:45 dir1
    
    rwx/rwx/r-x = 7/7/5
    

5. 슈퍼 사용자

root 사용자, 모든권한이 있어 사용에 주의해야함.

su 명령어

사용자 전환
	su - 일시적으로 다른 사용자로 전환
    
슈퍼 사용자 전환    
    1. 슈퍼 사용자 암호설정
    	sudo passwd root
        
    2. 일반 사용자에서 진입
    	su
        
    3. 비밀번호 입력후 슈퍼 사용자 사용
    	#
    
    4. 일반사용자로 복귀
    	exit
        $
        
+ su를 통해 슈퍼사용자가 되었을 때 환경 변수나 현재 디렉터리는 일반 사용자의 상태가 유지되므로
슈퍼 사용자의 환경으로 초기화하기 위해선 su - 를 입력해야한다.

sudo 명령어

sudo - 다른 사용자의 입장에서 명령 하나 실행 가능(지정하지 않으면 슈퍼사용자로 실행)

+ 현재 로그인한 사용자의 암호 사용

sudo 명령어 사용 허가 설정
	허가 목록 = /etc/sudoers
    
		확인
        su -
        cat /etc/sudoers
        
    sudoers 파일의 각 항목은
    <사용자> <머신 이름>=(<권한>)<명령어> 의 형식을 따름
    <사용자>에는 사용자 이름/%그룹이름 을 지정
    
    따라서 특정 사용자에게 sudo 권한을 부여하려면
    kdch ALL=(ALL) ALL 과 같이 기입.

visudo 명령어

sudoers 파일 편집

/etc/sudoers 파일을 직접 텍스트 에디터로 편집하는 것은 위험하다.

따라서 visudo 명령어를 이용
	sudo visudo

6. 터미널 멀티플렉서

터미널 여러개 운영
tmux

1. tmux 설치
	apt-get install tmux

2. tmux
3. 조작법
	셸 띄우기 ctrl + b c
    셸 전환 ctrl + b n/p/숫자(다음창/이전창/해당번호)

----------------------------

10장

프로세스와 잡

1. 프로세스란

명령어는 디스크에 있는 파일이다. 셸에서 명령어를 입력하면 커널이 디스크에 있는 해당 파일을 읽어서 메모리에 올린 뒤 CPU가 프로그램을 실행함.

이때 메모리 위에 올린 프로그램을 프로세스라 한다.

  • 같은 프로그램을 실행하더라도 각 프로세스는 별도의 메모리를 갖는다.
  • 프로세스 사용자만이 해당 프로세스 조작 권한을 갖는다
  • 새로운 프로세스는 이미 기존에 존재하는 별도의 프로세스를 기반으로 만들어진다.(부모 프로세스, 자식 프로세스)
ps 명령어

현재 셸을 이용하여 사용되는 프로세스 목록 확인
	ps
    
접속한 셸 뿐만 아니라 현재 실행중인 모든 프로세스 확인
	ps xf

	+ 옵션 형식
		UNIX / BSD : 각각 -을 사용 / 사용하지 않음
    

모든 사용자의 모든 프로세스 확인
	ps ax

+ 사용자가 실행한 프로세스 외에도 시스템을 위해 동작 중인 프로세스들 이있고 이는 대부분 슈퍼 사용자의 권한으로 실행됨.

자주 사용하는 옵션
	x - ps 명령어 실행한 사용자의 프로세스 출력
    ux - x를 상세하게
    ax - 모든 사용자의 프로세스 출력
    aux - ax를 상세하게
    auxww - aux를 화면에 잘리지 않도록 출력

리눅스가 멀티태스킹을 지원하여 다양한 프로세스가 동시에 실행될 수 있음

2. 잡

프로세스 = 리눅스 커널 입장에서 바라본 처리 단위
잡 = 셸 입장에서 바라본 처리 단위

  • 셸의 커맨드 라인에 명령어가 n개여도 입력한 한 행
    = 잡 하나 / 프로세스는 n개
  • 여러개 사용되었을 때 잡 번호은 중복될 수 있으나 프로세스 번호는 중복될 수 없음

ctrl + z , fg 명령어

ex.
	man bash
    ctrl + z
    
    vim ~/.bashrc
    ctrl + z
    
    ctrl + z 를 입력하면 해당 명령어가 종료된 것이 아닌 잠시 멈춘 것!
   
   jobs 명령어를 통해 잡 목록 확인
   		[1]- 멈춤
   		[2]+ 멈춤	(+는 현재 잡을 의미)
        
   (obs -l 은 프로세스 ID까지 표시)
   
   이때 사용자의 입력을 받아들일 수 있는 상태인 포그라운드(foreground)로 전환하는 명령어
   		fg %<잡 번호>
        (fg만 입력시 현재 잡으로 전환)

bg 명령어

ctrl + z 의 경우 백그라운드에서 실행되는 것이 아닌 그대로 멈춘 상태
따라서 작업이 중지된다.

이때 백그라운드에서 해당 잡을 진행할 수 있게 하는 명령어
	bg %<잡 번호>
    
백그라운드에서 작업되는 잡도 상태 확인이 가능(jobs)

처음부터 백그라운드에서 진행하고 싶다면 &를 명령 마지막에 붙여준다.
	ex. cp file1 file2 &

종료

잡 종료
	포그라운드 실행 중 잡 종료 = ctrl + c
    백그라운드 실행 중 잡 종료 = kill %<잡 번호>
    
프로세스 종료
	kill <프로세스 ID>
    
    (무단으로 다른 사용자의 프로세스를 종료할 수는 없지만 슈퍼 사용자는 가능)

kill 명령어

사실 종료 명령어가 아닌 시그널을 전송하는 명령어

시그널이란 프로세스에게 전송되는 신호

시그널의 종류는 kill -<시그널 이름> 과 같이 사용(이름대신 번호도 가능)
다만 지정하지 않을 시 기본값인 TERM(terminate, 종료) 이라는 시그널을 사용

ex. kill 4695 = kill -TERM 4695

사실 ctrl + z, ctrl + c 도 내부적으로 시그널(각각 TSTP, INT)을 보내는 것

시그널의 전체 목록
	kill -l
    SIG라는 문자열이 붙어 표시됨
    
그중 SIGKILL은 프로세스에 전달되지 않고 리눅스 커널이 처리함. TERM 시그널을 받아도 종료하지 못하는 프로세스를 종료하기 위함
 

'Cloud Native > Linux' 카테고리의 다른 글

[Linux] fdisk  (0) 2022.04.08
[Linux] df, du  (0) 2022.04.07
[Linux] /etc/fstab  (0) 2022.04.06
[Linux] 리눅스 파티션 및 마운트  (0) 2022.03.31
'모두의 리눅스 따라하기' 1장 ~ 5장  (0) 2022.02.15