패키지와 패키지 매니저
리눅스 운영체제의 패키지와 패키지 매니저는, 포장된 상품과 온라인 쇼핑몰 같은 역할
패키지는 여러 파일이 담겨있는 하나의 상자이자 여러 파일을 모아 하나의 파일로 저장하고 있는 압축파일이다.
패키지 매니저는 패키지의 설치, 변경, 삭제 등 관리를 편리하게 해주는 도구이다.
패키지 매니저를 스마트폰으로 비유하면, 앱 스토어와 그 역할과 비슷하다.
프로그램과 프로세스
프로그램은 일반적으로 사용자가 원하는 일을 처리 할 수 있도록 프로그래밍 언어를 사용하여 수행절차를 표현해 놓은 명령어들의 집합입니다. 쉽게 말하자면 컴퓨터에서 어떤 작업을 실행하기 위한 코드로, 정적인 상태의 파일이라고 볼 수 있다.
컴퓨터에서 실행되고 있는 프로그램을 우리는 프로세스라고 부른다.

스레드(Thread)
스레드는 사전적 의미로 한 가닥의 실이라는 뜻이며 한 가지 작업을 실행하기 위해 순차적으로 실행한 코드를 실처럼 이어 놓았다고 해서 유래된 이름이다. 하나의 스레드는 코드가 실행되는 하나의 흐름이기 때문에, 한 프로세스 내에 스레드가 두 개라면 코드가 실행되는 흐름이 두 개 생긴다는 의미입니다.
멀티 스레드(Multi-Thread)
멀티 프로세스가 애플리케이션 단위의 멀티 태스킹이라면, 멀티 스레드는 애플리케이션 내부에서의 멀티 태스킹이라고 할 수 있습니다.
멀티 태스킹은 두 가지 이상의 작업을 동시에 처리하는 것을 의미합니다. 즉, 두가지 이상의 작업을 동시에 처리하는 애플리케이션의 단위를 멀티 프로세스라 합니다. 하나의 프로세스에서도 멀티 태스킹이 가능하도록 만들어진 애플리케이션도 멀티 프로세스라 한다. 멀티 스레드는 대용량 데이터의 처리시간을 줄이기 위해 데이터를 분할하여 병렬로 처리하는 데에 사용할 수도 있고, UI를 가지고 있는 애플리케이션에서 네트워크 통신을 하기 위해 사용할 수도 있습니다. 그리고 여러 클라이언트의 요청을 처리하는 서버를 개발할 때에도 사용한다.

프로세스 관리 - ps, pstree
리눅스의 프로세스는 포그라운드(foreground)와 백그라운드(background)방식으로 동작한다.
포그라운드

일반적으로 사용자가 명령을 입력하면 이를 해석하여 실행하고 결과를 화면에 출력합니다. 그러면 다시 사용자는 화면에 출력된 결과를 확인하고 또다른 명령어를 입력하는 대화식으로 작업을 수행하게 됩니다. 이렇게 사용자가 입력한 명령이 실행되어 결과가 출력될 때까지 기다려야 하는 방식을 포그라운드 방식이라고 하며, 이러한 방식으로 처리되는 프로세스를 포그라운드 프로세스라고 합니다. 포그라운드 방식은 한 번에 하나의 명령을 실행하므로 동시에 여러 프로세스를 실행하기는 어렵다.
백그라운드

백그라운드 방식을 사용하면 프로세스가 실행되는 동안 뒤에서 다른 프로세스가 실행될 수 있으므로 한 터미널에서 여러 개의 프로세스를 동시에 실행할 수 있습니다. 이처럼 백그라운드 방식으로 처리되는 프로세스를 백그라운드 프로세스라고 하며, 이러한 백그라운드 작업은 명령의 실행 시간이 많이 걸릴 것으로 예상되거나, 명령을 실행한 후 다른 작업을 해야할 경우 사용한다. 백그라운드 방식은 명령어 뒤에 &를 붙여서 실행하고, 다른 명령어를 추가적으로 입력할 수 있습니다. 하지만 백그라운드 방식으로 실행해도 사용자의 터미널 세션이 종료되면 실행중인 프로세스도 종료된다. 작업시간이 오래 걸리는 작업인 경우 nohup(no hang up) 명령어를 이용하여 백그라운드로 실행하면 사용자의 터미널 세션이 종료되어도 작업이 종료될 때까지 프로세스를 실행한다. 포어그라운드를 백그라운드로 전환하고자 할 때 bg 명령어를 이용하면 된다. 그와 반대로 백그라운드를 포어그라운드로 전환하고자 할 때 fg 명령어를 쓰면 [+]인 프로세스를 실행한다.
$ vim simple.txt - 포그라운드
$ vim simple.txt & - 백그라운드
$ nohup simple.txt & - 백그라운드 nohup
프로세스 목록 확인
ps
ps 명령은 현재 실행 중인 프로세스의 목록을 확인할 수 있습니다. ps 명령의 결과로 PID, TTY, TIME, CMD가 출력됩니다.
- PID : 프로세스 번호
- TTY : 프로세스가 실행된 터미널의 종류와 번호
- TIME : 프로세스 실행 시간
- CMD : 실행되고 있는 프로그램의 이름(명령)

- UNIX 방식
- ps -e : 시스템에서 실행 중인 모든 프로세스의 정보를 출력한다.
- ps -f : 프로세스의 자세한 정보를 출력합니다.
- ps -u uid : uid로 특정한 사용자에 대한 모든 프로세스의 정보를 출력한다.
- ps -p pid : pid로 지정한 특정 프로세스의 정보를 출력한다.
UID(user identifier)는 특정 컴퓨터 사용자에게 부여되는 숫자 또는 이름을 의미
PID(Process ID)는 운영체제에서 프로세스를 식별하기 위해 프로세스에 부여하는 번호를 의미
- BSD 방식
- ps a : 터미널에서 실행한 프로세스의 정보를 출력한다.
- ps u : 프로세스 소유자의 이름, CPU 사용량, 메모리 사용량 등 상세 정보를 출력한다.
- ps x : 시스템에서 실행 중인 모든 프로세스의 정보를 출력한다.
보통 프로세스의 관계를 보기 위해서 UNIX 방식인 ps -ef, 프로세스의 상태를 보는 용도로는 BSD 방식인 ps aux를 가장 많이 사용한다.
- ps -f의 출력 정보
- UID : 프로세스를 실행한 사용자 ID
- PPID : 부모 프로세스 번호
- C : CPU 사용량(%)
- STIME : 프로세스의 시작 날짜나 시간
- TTY : 프로세스가 실행된 터미널의 종류와 번호
- STAT : 프로세스 상태

- ps a, u, x의 출력 정보
- USER : 사용자 계정 이름
- %CPU : CPU 사용량(%)
- %MEM : 물리적 메모리 사용량(%)
- RSS : 사용하고 있는 물리적 메모리의 크기(kb)
- VSZ : 사용하고 있는 가상 메모리의 크기(kb)
- START : 프로세스 시작 시간

pstree
컴퓨터의 전체 프로세스를 구조화하여 확인하는 명령어이며 트리구조로 도식화하여 프로세스를 확인할 수 있고 부모 관계를 한 눈에 파악할 수 있다.

프로세스 관리 - jobs
백그라운드에서 수행 중인 프로세스는 jobs 명령으로 확인가능하다.

[1] 혹은 [2] 라고 되어 있는 기호는 작업 번호를 이야기 합니다. 더불어 + 기호로 표시된 프로세스는 현재 처리되고 있는(처리 예정) 작업을 의미하며, - 기호는 다음에 작업할 프로세스를 의미한다
- Running : 실행 중
- Stopped : 일시 중단(Ctrl + Z 입력)
- Terminated : 강제 종료(kill 명령 종료)
- Done : 정상 종료
다수의 프로세스가 백그라운드에서 작업하는 도중에 필요하다면, fg %작업번호 명령을 사용하여 포그라운드로 전환가능하다.
표준 스트림과 stdin, stdout, stderr

표준 스트림(Standard Stream)
스트림(Stream)이란, 프로그램을 드나드는 데이터를 흐름으로 표현한 단어이며 음성, 영상, 텍스트로 예를 들 수 있다.
표준 스트림이란, 컴퓨터 프로그램과 그 환경(키보드나 모니터와 같은 장치들) 사이에 미리 연결된 입출력 통로이다.
일반적으로 유닉스(또는 유닉스 계열 OS)에서 동작하는 프로그램은 실행 시 세 개의 스트림이 자동으로 열린다. 이를 표준 스트림이라고 부른다. 보통 입출력은 물리적으로 연결된 키보드와 모니터를 통해 일어나는데, 표준 스트림은 이것을 추상화한 것이다. 세 개의 표준 스트림은 아래와 같으며 /dev 폴더에서 찾아볼 수 있다.
- Stdin
표준 입력은 프로그램으로 들어가는 입력값의 데이터(보통은 문자열) 스트림이며, Standard Input을 stdin으로 줄여 표현합니다. 리눅스 쉘에서는 표준 설정이 키보드로 되어 있습니다. 그러나 모든 프로그램이 입력을 요구하지 않으며, 대표적인 예로는 비밀번호를 입력할 때 이러한 표준 입력 스트림을 사용합니다.
- Stdout
표준 출력은 프로그램이 출력 데이터를 기록하는 스트림으로, Standard Output을 stdout으로 줄여 표현합니다. 표준 출력은 텍스트 터미널에서 이루어집니다. 표준 입력과 마찬가지로 모든 프로그램이 출력을 요구하는 것은 아닙니다
- Stderr
표준 오류는 프로그램이 오류 메세지나 진단을 출력하기 위해 일반적으로 쓰이는 또다른 출력 스트림이며, Standard Error를 stderr로 줄여 표현합니다.
리다이렉션(Redirection)
리눅스에서 프로그램은 보통 세 개의 표준 스트림인 표준 입력(stdin), 표준 출력(stdout), 표준 에러(stderr)를 자동으로 열게 됩니다. 리다이렉션은 이러한 표준 스트림의 흐름을 바꿔(우회하여) 파일로 표준 입/출력을 할 수 있도록 합니다. 출력 리다이렉션에는 > 혹은 >> 를 사용하며 입력 리다이렉션에는 < 를 사용한다.
- 명령 > 파일명 ($ ps aux > ps.txt) - ps aux의 출력 스트림을 ps.txt이라는 파일로 전환하여 저장(덮어쓰기)하게 됩니다.
- 실행 < 파일명($ head <ps.txt) - ps.txt 처음 10줄이 head 의 입력 스트림으로 전환하여 보내게 됩니다.
- 명령 >> 파일명 ($ps aux >> ps.txt) - ps aux의 출력 스트림을 ps.txt이라는 파일로 기존 파일 끝에 추가하게됩니다.
$ head <ps.txt > sample.txt
- ps.txt 의 내용을 head 명령의 입력 스트림으로 전환하여 전송합니다.
- head 명령은 입력 받은 ps.txt 의 내용에서 처음 10줄을 출력합니다.
- head 명령의 출력 스트림을 sample.txt 파일에 연결합니다.
- head 명령의 출력 스트림은 결과를 sample.txt 파일에 저장합니다.
파이프(Pipe)
파이프는 하나의 프로세스의 결과를 다른 프로세스의 입력으로 주는 것을 말한다. 어떤 명령의 결과를 다시 어떤 명령의 입력으로 받아야 할 때 사용되며, 프로세스1의 출력 스트림을 프로세스2의 입력 스트림으로 사용할 때 파이프 기호 | 를 사용하여 아래와 같은 형식으로 작성합니다.

첫 번째 명령어 파이프의 결과를 화면으로 출력하는 대신 다른 명령어 파이프로 흘러가도록 연결한다고 생각하시면 됩니다.
4가지 모양이 흐르는 명령어 파이프가 있다고 가정했을 때, 아래처럼 특정 shape 를 필터링 하는 명령어 파이프에 | 를 통해서 연결하면 화면에 출력되는 최종 결과는 필터링 파이프를 통과한 결과가 된다.

ls -l | grep ssh
ls -l의 결과를 grep ssh의 입력으로 가져와서 ls -l의 결과 중 ssh가 포함된 행을 표시하게 된다.
출력 관련 명령어
wc(world count) : 주어지는 파일 또는 표준 입력의 바이트, 문자, 단어 그리고 줄(라인) 수를 출력해주는 명령어입니다. ls -al과 함께 폴더와 파일의 수를 알고 싶을때 응용이 가능합니다.

cat(concatenate) : 파일의 내용을 간단하게 출력할 때도 사용하지만, 두 개 이상의 파일을 연결(concatenate)해서 출력할 때 사용하는 것이 기본이다.
- cat file1 file2 : 파일의 내용을 연속해서 출력
- cat > file1 : 내용을 입력하고 ctrl + d를 누르면 입력한 내용으로 새로운 파일을 만든다. 기존 파일이 있을 시 덮어쓰게 된다.
- cat >> file1 : 기존 파일 내용 뒤에 연속해서 기록된다.
- cat file1 > file2 : file1의 내용이 file2 에 복사된다.
head / tail : head 명령어는 앞의 10열을 확인하고 tail 명령어는 뒤의 10열을 확인한다. (default = 10)
- head / tail -n [num] : [num]만큼 열을 출력한다
- head / tail -c [num] : [num]만큼의 바이트를 출력한다.
- tail -f : 내용의 변경사항이 생길 때마다 자동으로 출력해준다.
grep : 텍스트 파일에서 원하는 문자열이 들어간 행을 찾아 출력하는 명령어이다.
- grep a [파일명] : [파일명]에서 a가 들어간 행을 출력한다
- grep 'a*' [파일명] : [파일명]에서 a로 시작된 모든 단어를 찾는다.
- grep 'a..z' [파일명] : [파일명]에서 a로 시작하고 z 로 끝나는 단어를 찾는다.
- grep [a-c] [파일명] : [파일명]에서 a, b, c로 시작된 단어를 찾는다.
- grep [aA]pple [ 파일명] : [파일명]에서 apple 과 Apple로 시작되는 단어를 모두 찾는다.
sed : SED는 Stream Editor의 약자로 원본 텍스트 파일을 편집하는 명령어이며 vi와는 다르게 원본을 건드리지 않는다.
- sed 's/1/2/' [파일명] : 파일명에 1을 2로 바꾼다.
- sed 's/1/2/g' [파일명] : 한 줄에 있는 모든 1을 2로 바꾼다.
- sed '3,9 s/1/2/g' [파일명] : 3열과 9열의 1을 2로 바꾼다.
cut : file 이나 표준 입력에서 받은 문자열을 잘라내서 새로운 문자열을 만드는 명령어이다.
| -c | 지정한 행을 출력 |
| -d | 딜리미터를 지정 |
| -f | 딜리미터로 잘라진 행을 출력 |
- cut -c 3 [파일명] : [파일명]의 3열만 잘라낸다.
- cut -d '필드' -f 1 [파일명] : [파일명]의-구획의 1열까지만 잘래낸다?
paste : 커맨드는 파일들의 내용을 나란히 탭으로 구분해 출력하는 명령어다.
- paste file1 file2 > file3 : file1과file2의 내용을 File3에 출력한다
- paste -s file1 file2 : file1과 file2의 내용을 가로로 출력한다
sort : 텍스트의 파일 내용을 문자나 숫자를 오름차순으로 출력한다.
- sort -r [파일명] : 파일명을 역순으로 출력한다.
- sort -n[파일명] : 알파벳순이 아닌 숫자순으로 출력한다