Chapter 10. 프로세스 제어 및 작업관리
- 프로세스 개념과 종류
- 프로세스는 실행 중인 프로그램이다. 한번에 다양한 프로세스 실행이 가능하다. 예) 유튜브
- 쉘의 시작, 특정 프로그램의 실행은 모두 프로세스를 시작하는 것이다.
- 디스크에 있던 프로그램이 메모리에 올라가면 프로세스가 되고, 이것이 CPU의 처리를 받고 있는 상태가 되면 프로세서가 된다.
- 프로세스는 PID라는 번호가 할당되고 이 번호로 관리된다.
- 자식프로세스 → PPID 할당
- 하나의 프로그램으로도 프로세스가 여러개 실행될 수 있다.
- 프로그램 → 프로세스 → 프로세서
- 프로세스의 생성과 종류
- 부모 프로세스 → 복제 fork() → 실행 exec() → 종료 exit() → 대기 wait() → 부모 프로세스 재개
- 부모 프로세스가 자기 자신을 복제를 해서 자식 프로세스가 생긴다. (트리구조)
- 복제 후 sleep 명령어가 아래쪽에서 실행이 된다. 그 동안 부모 프로세스(윗부분)는 자식 프로세스가 작업을 완료할 때까지 대기를 한다.
- 그 후 출력 결과가 리턴되고(성공은1, 실패는 0??), 부모 프로세스가 재개된다.
- 종류
- 부모프로세스 - 다른 프로세스를 생성할 수 있는 프로세스
- 자식프로세스 - 부모 프로세스로부터 만들어지는 프로세스
- 고아프로세스 - 자식 프로세스의 작업 종료 후 부모 프로세스로 되돌아가기 전에 부모 프로세스가 종료되어 자식 프로세스만 남은 경우
- 좀비프로세스 - 이미 종료된 프로세스지만 리소스 반환을 하지 못한 상태로 남아 있는 프로세스
- ps 명령어
- ps → 현재 터미널에서 실행 중인 프로세스만 보여준다.
- PID, TTY, TIME, CMD
- ps aux → 시스템에서 실행 중인 모든 프로세스를 보여준다.
- 사용자 대부분 root
- CPU 및 메모리 사용률, STATE, COMMAND(명령어)
- ps aux | grep bash → bash라는 단어가 포함된, 해당 쉘의 프로세스만 보여준다.
- ps ef
- 보통의 경우 이러한 명령어를 입력할 일은 많이 없다.
- pstree → 프로세스의 부모자식 관계를 트리형태로 보여주는 명령어.
- 가장 상위에 systemd가 있고, 그 아래로 이어져 있다.
- 2* → 동일한 자식 프로세스가 두개 있다는 의미이다.
- pstree -p → 3*가 아니고 세개가 전부 보인다. PID도 확인할 수 있다.
- pstree -u nobreak → 특정 사용자의 프로세스만 조회할 수 있다.
- pstree -p 1195 → 특정 PID로 프로세스를 중심으로 조회할 수 있다.
- top
- 시스템의 CPU 및 메모리 사용량, 실행 중인 프로세스 상태, 실시간 사용자수 등을 실시간으로 보여준다. PID 별로도 정보를 보여준다.
- m 누를 시 메모리 사용량 순서대로 보여준다. (주로 사용)
- p 누를 시 시간 순서대로 보여준다.
- pgrep → 프로세스의 이름으로 검색할 수 있도록 해주는 명령어
- pgrep
- pgrep bash -l
- pgrep -u nobreak bash
- ps → 현재 터미널에서 실행 중인 프로세스만 보여준다.
- 시그널
- 프로세스를 관리하기 위하여 프로세스에게 보내는 일종의 메시지다.
- 시그널 번호와 시그널 이름을 이용하여 사용이 가능하다.
- kill -l → 어떤 명령어 목록이 있는지 확인
- SIGHUP → Hang up, 1번, 터미널 연결 종료 시 발생
- SIGINT → Interrupt, 2번, 컨트롤 C로 발생, 프로세스에게 중단 요청
- SIGKILL → kill -9 (9번), 강제 종료 시그널, 이것을 받으면 즉시 강제로 종료한다. (주로 사용)
- SIGTERM → 정상적인 종료 요청 (정리 작업 가능)
- kill -9 1234 or kill -SIGKILL 1234 → 해당 프로세스 강제 종료
- sleep 300 & → sleep 명령을 백그라운드에서 실행하세요. 300초 동안 쉘에서 제어권이 없어지므로, 백그라운드로 돌린다.
- pkill → 프로세스 이름으로 명령을 보낸다. kill은 반드시 PID를 확인해야 하는 번거로움이 있다.
- ^Z → 터미널에서 프로세스를 일시 정지시키는 시그널
Chapter 11. 아카이브 생성
- 100개의 작은 파일을 친구에게 이메일로 보낸다고 하자. 파일을 하나하나 첨부하고 다운로드한다면 번거롭고 오래걸린다.
- 파일과 디렉토리들을 안전하게 보관하기 위해 복사하거나, 아카이브 작업을 하여 테이프 백업장치에 보관한다. 원본 파일이 예기치 않게 삭제되거나, 손상이 되었을 때에 보관된 파일을 이용해 복구할 수 있다.
- 아카이브와 압축
- 아카이브(Archive): 여러 개의 파일이나 디렉터리를 용량 감소 없이 하나의 파일로 묶는 작업
- 압축(Compression): 단일 파일의 용량을 줄이는 작업
- 아카이브 파일 생성하거나 해제할 시 tar 명령어를 사용한다.
- 파일 내 중복된 데이터를 알고리즘을 활용해서 크기를 줄인다.
- gzip, bzip2, xz, zip → 동작하는 압축 알고리즘이 다르다. 운영체제와 파일을 주고 받을 때 유용
- xz → 가장 높은 압축률, 압축이나 해제 시 시간이 오래 걸린다.
- tar → 여러 개의 파일로부터 아카이브 파일을 생성하거나 해제할 수 있다.
- c → 새로운 tar 파일 생성
- v → tar 명령어 수행 과정 자세히 출력
- t → tar 파일의 내부 내용들 리스트 출력
- x → tar 파일 해제
- f → 작업할 대상 아카이브 파일(파일 이름이나 장치)을 지정하는 필수 옵션
- .tar과 같은 확장자가 아카이브 파일을 만드는데 꼭 필요한가? 아니다. tar 명령어는 확장자를 신경쓰지 않는다.
- 기존에 있던 아카이브 파일과 동일한 이름으로 아카이빙하면 그대로 오버라이딩 된다. 그래서 -k 옵션을 통해서 덮어 쓰는 것을 방지할 수 있음
- jar는 넘어가기
Chapter 12. 압축 및 압축 해제
- gzip 명령어 : 일반적으로 가장 많이 사용되고 빠르다.
- bzip 명령어 : gzip보다 압축률이 높지만 느린편이다.
- xz 명령어: 압축률이 가장 높지만 속도가 매우 느리다.
- 일반적으로 tar로 아카이브 하고 gzip으로 압축을 진행하게 된다.
- gzip
- 하나의 큰 파일을 압축한다. (여러개를 할 수 있는 것은 아니다.)
- gzip filename
- gzip etc.tar → 기존의 아카이브 파일 etc.tar이 사라지고 etc.tar.gz이 새로 생긴다. 파일 크기가 줄어든다.
- 압축을 해제한 뒤에 etc.tar을 만들고 etc.tar.gz는 삭제된다. 공간 절약이 목적이라 원본 파일은 삭제된다.
- z 옵션 생략 가능
- bzip2도 사용방법이 똑같다.
- 일상적인 파일 관리 및 백업 → tar, gzip (가장 범용적, 속도가 빠르고 압축률도 괜찮다.)
- 대용량, 장기 보관 → tar, bzip2 고려 가능
- tar 와 xz → 공개용/배포용 압축파일, 가장 높은 압축률을 보이지만 속도가 가장 느리다.
- 크로스 플랫폼, OS 사용자와 파일 주고 받기 →tar 와 zip 형식
- xz 백도어 사건 - https://namu.wiki/w/xz-utils 백도어 사건
다음 교재 : 엔지니어를 위한 엔터프라이즈 리눅스 정석
- 관리자용 리눅스 학습
- 레드햇 공인교육과정에 포함된 교재
Chapter 01. 사용자 및 그룹 관리
- 사용자
- 사용자는 리눅스 시스템에 접근하는 계정
- UID → 주민등록번호
- 시스템은 사용자를 식별할 때 UID라는 고유한 사용자 번호로 확인한다.
- 0 → 루트
- 1 ~ 999 → System UID
- 1000 ~ → 일반 사용자 UID
- UID가 중복되는 경우 시스템에서 구별할 수 없어서 기존의 사용자의 파일들이 새로 중복하여 만든 계정으로도 다른 계정의 홈 디렉토리 안의 파일 수정이 가능하여 보안상의 문제가 발생할 수 있다.
- 그룹
- 리눅스는 다중사용자 시스템이기 때문에 많은 문제들이 발생할 수 있다.
- 리눅스는 각각의 사용자의 권한을 명확하게 구분하고, 리소스에 접근할 수 있는 권리를 다르게 함으로써 그러한 문제들을 방지할 수 있다.
- 그룹은 공통의 목적을 가진 사용자들이 모여 파일의 권한을 공유하는 집합이다.
- 파일의 효율적인 관리가 목적이다.
- 각 그룹은 그룹 이름과 고유 번호인 GID를 가지며, 시스템은 GID를 통해 그룹을 식별한다.
- 기본 그룹과 보조 그룹으로 나뉘며, 모든 사용자는 최소한 하나의 기본 그룹에 소속되어야 한다.
- 사용자가 파일을 생성하면, 해당 파일의 사용자 그룹은 사용자의 기본 그룹으로 설정된다.
- 사용자가 여러 보조 그룹에 속할 수 있다.
- 보조 그룹 → /etc/group/
- 리눅스 시스템에서 사용자와 그룹 정보를 아래의 4개 파일에 저장한다.
-
- 시스템에 등록된 모든 사용자의 정보. 관리자가 아니어도 모두 읽을 수 있다. sudo가 아니어도 읽을 수 있다. 그러나 root 권한만 수정이 가능하다.
- 이 파일은 총 7개의 필드로 구성되어 있고, 각 필드는 콜론( : )으로 구분된다.
- x → 과거에는 암호화된 비밀번호가 있었지만, 보안상 지금은 x로만 표시하고 비밀번호는 /etc/shadow 에 저장되어 있다.
- GECOS → 사용자의 정보를 저장하는 일종의 메모
- SHELL → 로그인 시 실행되는 기본 쉘/etc/passwd
- 필드 설명
USER 로그인 계정명, 시스템 내 유일 식별자 x 패스워드 저장 필드로 현재는 사용하지 않고, 실제 패스워드는 /etc/shadow에 해시 형태로 저장된다. UID 사용자 식별 번호 GID 그룹 식별 번호 GECOS 사용자 추가 정보, 주석 필드 (실제 이름, 연락처 등 저장) HOME 홈 디렉터리 경로, 로그인 시 이동 위치 SHELL 로그인 시 실행되는 기본 셸, 보통은 /bin/bash - 주요 사용자
root 0 슈퍼 유저 계정, 모든 시스템 자원에 완전한 접근 권한 보유 nobody 65534 최소 권한 특수 계정. 권한 격리 필요 시 사용. - /etc/shadow
- 시스템에 등록된 사용자의 패스워드를 해시 형태로 안전하게 저장하고 패스워드 관련 속성을 관리하는 시스템 파일이다.
- 패스워드를 강력한 해시 알고리즘을 사용하여 해시 형태로 저장
- root만 읽을 수 있다. → sudo cat /etc/shadow
- 첫 번째 필드는 사용자 이름이 들어오고, 두 번째 필드는 해시 알고리즘으로 생성된 패스워드 해시값이 들어온다.
- 두 번째 필드는 $ 구분자를 기준으로 필드를 나누어 저장한다.
- $해시 알고리즘 유형$솔트(해시에 부여되는 랜덤 문자열로 해싱 시 함께 사용)$최종 패스워드 해시값
- ! → 계정이 비어있고 설정되지 않았다.
- 마지막 부분은 날짜
- 해시는 단방향 암호화 → 원본 패스워드 복원이 어렵다.
- /etc/group
- 그룹에 대한 정보를 저장하는 파일이다.
GROUP 그룹 이름, 시스템 내 유일 x 패스워드 저장 필드 → 현재 /etc/gshadow로 이전, 그래도 사용 안함. GID 그룹 고유 식별 번호 MEMBER 해당 그룹을 보조 그룹으로 사용하는 사용자 목록 - /etc/gshadow
- 그룹의 패스워드를 저장하는 파일
- 루트만 볼 수 있다. 사실상 사용하지 않는다.
-
- 사용자 생성
- useradd 명령어를 사용하여 사용자를 생성할 수 있다.
- 루트 권한이 필요하다.
- 생성 시 디폴트 값이 있다 → /etc/default/useradd or /etc/login.defs
- m 옵션은 디폴트 값이다 → 홈 디렉토리 없을 시 자동 생성
- useradd와 adduser의 차이점이 무엇인가?
- 명령어만 입력 시에 같은 값이 나온다.
- adduser는 useradd와 동일하다. 심볼릭 링크로 연결되어 있다.
- 사용자 정보 수정
- usermod
- a 옵션이 없을 시 오버라이드된다. a와 G는 같이 사용 → 중요
a 기존의 보조그룹을 유지하면서 추가, 해당 옵션을 사용하지 않으면 오버라이드 됨. G 보조 그룹 변경 - 사용자 삭제
- userdel
- userdel만 입력하면 사용자는 삭제되지만, 사용자의 홈 디렉터리와 파일들이 남아있게 된다.
- 그러므로 사용자 삭제 시 r 옵션을 함께 사용해야 한다.
- 강제로 삭제 시 f 옵션을 쓴다.
- 그룹 생성 - groupadd , 보통 옵션은 잘 사용하지 않는다.
- nobreak@rocky-node1:~$ sudo groupadd rocky nobreak@rocky-node1:~$ cat /etc/group | grep rocky rocky:x:1002: # g옵션을 통해서 GID 지정 nobreak@rocky-node1:~$ sudo groupadd -g 2000 infra nobreak@rocky-node1:~$ cat /etc/group | grep infra infra:x:2000:
- 그룹 정보 수정 - groupmod
- nobreak@rocky-node1:~$ sudo groupmod -n infrateam infra nobreak@rocky-node1:~$ sudo groupmod -g 300 infrateam nobreak@rocky-node1:~$ grep infra /etc/group infrateam:x:300:
- 그룹 삭제 - groupdel
- 특정 사용자가 사용 중인 그룹은 삭제할 수 없다.
- /etc/skel
- 사용자 및 그룹 관리 설정 파일
- 사용자 계정 생성 시 기본적인 초기화 파일을 저장하는 뼈대 디렉터리
- 사용자를 생성하면 해당 디렉터리에 있는 모든 파일이 해당 사용자의 홈 디렉터리로 복사된다.
- 새로 생성하는 사용자부터 적용이 된다. 기존에 있는 사용자에게는 적용이 안됨.
- 사용자 전환 : su / su - / sudo → 중요!
- su
- switch user의 약자로 다른 사용자로 전환, 이름 지정하지 않을 시 root로 간다.
- 현재 사용자가 작업하던 환경변수(PATH, HOME 등)와 현재 작업 디렉터리를 그대로 유지한 채 사용자 ID만 바꾼다. (현재 계정을 로그아웃하지 않고 다른 계정으로 전환)
- 다른 사용자의 권한을 가져온다.
- 로그인 하고자 하는 사용자의 비밀번호가 필요하다. 단 root는 비밀번호 없이도 어떤 사용자든지 다른 사용자로 전환할 수 있다.
- su - (login shell)
- 환경을 전부 지우고 다른 사용자의 로그인 환경으로 새로 구성
- 대상 사용자가 실제로 로그인한 것과 같은 환경을 불러옵니다.
- 대상 사용자의 고유 환경변수(PATH, HOME 등)로 완전히 갱신합니다.
- 이동한 사용자(root 등)의 홈 디렉터리(예: /root)로 작업 디렉터리가 이동한다.
- su와 su -의 차이점 → su로 할 경우 잘못된 $PATH, pwd로 갈 수 있다. su -로 할 시 깔끔한 자신의 경로로 이동한다.
- sudo(superuser do, substitute user do) :
- 다른 사용자의 권한을 빌려와 실행한다. 보통은 루트로 한다.(디폴트가 루트다.)
- apt update, yum update 등 루트권한이 필요할 때 사용한다.
- 자기 자신의 비밀번호를 입력합니다. root 비밀번호를 알 필요가 없음.
- 이를 통해 보안적으로 더 뛰어남 : 여러 사용자들이 root권한을 알고 있으면 보안적 리스크가 있음.
- /etc/sudoers에 등록된 사용자만 사용할 수 있고, 어떤 명령을 허용할지 세밀하게 제한가능
- 기본적으로 명령 단위로 권한을 올리므로, 필요한 순간에만 권한을 사용
- su, sudo의 실행 기록이 로그(/var/log/secure 등)에 남아 누가 무엇을 했는지 추적하기 좋음
- 비유하자면 루트 모자를 다른 사용자가 빌려 쓰는 것이다. 권한은 한명인데, 여러명이 해당 권한이 필요할 때 사용한다. 모자도 만들고, 모자를 빌릴 수 있는 명단도 만들어 놓아야한다.
- 한번 실행 후 패스워드를 5분 동안 물어보지 않으며, 모든 세션 이용 기록이 남는다.
- i 옵션
- su - 와 로그인의 차이가 있을까?
- 세션의 차이가 있다. 로그인 명령은 새로운 로그인 세션을 시작한다. 새롭게 시작되므로 그 이전 세션의 환경변수와 작업하던 것이 유지가 안된다.
- su -는 현재 세션 내에서 변경된다.
- su와 sudo의 차이점
- su는 대상 사용자의 비밀번호, sudo는 자신의 비밀번호
- sudo는 세밀한 권한 제어 가능. su는 사용자 전체의 권한을 가져온다.
- 로깅 능력도 sudo가 더 뛰어나다.
- 보안적으로도 sudo가 더 뛰어나다. 루트의 패스워드를 몰라도 되기 때문이다.
필요한 비밀번호 대상 사용자 대상 사용자 본인 환경 현재 환경 유지 대상 사용자 환경으로 초기화 기본적으로 유지(설정에 따라 일부 초기화) 작업 디렉터리 유지 대상 홈으로 이동 유지 권한 범위 셸 전체 셸 전체 명령 하나 접근 제어 비밀번호만 알면 가능 동일 sudoers로 세밀한 제어 - su
- /etc/sudoers
- sudo를 사용하기 위해 /etc/sudoer 파일 또는 /etc/sudoers.d/ 디렉터리 내 설정 파일에 해당 사용자에게 부여할 권한이 사전에 설정되어 있어야 한다.
- 하나의 설정 파일로 메인 파일이 있다. 이것을 직접 건드리는 것은 위험하므로, 메인 파일은 수정하지 않는다.
- main → a, b, c… → 사용자 추가 시에 하나씩 늘린다.
- sudoers 파일의 설정 형식
- sudo visudo → 수정한 걸 다시 물어보는 안전장치이다. 문법 등 검사해준다.
- root와 wheel은 % 차이 → 그룹이 있냐 없냐의 차이다.
- root ALL=(ALL) ALL
- root: 권한을 받을 사용자, 앞에 % 가 붙으면 그룹
- ALL: 명령을 실행할 수 있는 접속 호스트, ALL은 모든 호스트
- =(ALL): 명령을 실행할 수 있는 사용자, ALL은 모든 사용자
- ALL: 실행 가능한 명령어, ALL은 모든 명령어
- %wheel ALL=(ALL) ALL
- 모든 호스트에서 모든 사용자로 모든 명령을 실행할 수 있다.
- %wheel ALL=(ALL) NOPASSWD:ALL
- 모든 명령어에 대해 패스워드 없이 실행할 수 있다.
- NOPASSWD: /bin/mount, /bin/unmount → 이 경우라면 이 두개의 명령어만 패스워드 없이 사용이 가능하다.
- 패스워드 입력 없이 sudo를 사용할 수 있게 하려면 NOPASSWD 옵션을 추가해야 한다.
- tee
- 표준 입력으로 받은 것을 출력하면서 저장도 한다.
- echo “hello” | tee hello.txt
- sudo echo “qwer ALL=(ALL) ALL” > /etc/sudoers.d/qwer
- > 이전까지는 괜찮지만 그 이후에는 sudo가 적용이 안된다.
- echo “qwer ALL ALL” | sudo tee -a /etc/sudoers.d/qwer
- > 하나만 쓰면 오버라이딩 → a 옵션을 써서 내용을 이어쓰자. 아니면 >>으로 사용하자.
- a 옵션 없이 tee를 쓰는 경우 기존 내용 덮어쓰기, a 옵션을 쓰는 경우 기존 내용 뒤에 추가된다.
- /var/log/secure → 대부분 인증 관련 로그는 이곳에 저장된다.
- /var/log/auth.log → 우분투에서 사용하는 로그가 저장된다.
- 표준 입력으로 받은 것을 출력하면서 저장도 한다.
'리눅스' 카테고리의 다른 글
| [리눅스 기초] 로그 관리, 리눅스 부트 프로세스, 소프트웨어 패키지 (0) | 2026.10.06 |
|---|---|
| [리눅스 기초] 논리 볼륨 관리, systemd, 로그 관리 (0) | 2026.10.06 |
| [리눅스 기초] 고급 권한 관리, 작업 스케줄링, 디스크 관리, 파일시스템 및 스왑 (0) | 2026.09.29 |
| [리눅스 기초] 파일 및 디렉토리 검색, vi 편집기, 퍼미션, 쉘 명령어와 프로그래밍 (0) | 2026.09.22 |
| [리눅스 기초] 리눅스의 기본 환경과 CLI, 링크 (1) | 2026.09.21 |