Process & Streams
1. Process
1) 프로그램
: CPU가 실행할 수 있는 명령의 모음
- 컴퓨터 어디에 저장되어 있어야 한다.
- 프로그램이 실행중이지 않을 때 : Storage(HDD/SSD)에 저장되어 있다. (저렴/속도가 느림)
- Shell에 명령을 전달하는 시점에 해당 프로그램 코드를 Memory(RAM)에 전달. (Storage보다 빠름)
2) 프로세스
: CPU에서 Memory상에 올라 실행되고 있는 프로그램의 인스턴스
3) ping
: 인터넷의 컴퓨터 상태를 확인하기 위한 프로그램 (원격의 서버가 정상적으로 동작하는 상태인지 확인을 위해 작은 데이터를 보내고, 응답 하는지를 확인하고 통계를 내어줌)
- Ubuntu에서 실행하는 ping은 멈추지 않는다.
- Ctrl + C : 현재 실행중인 프로세스에 SIGINT(Signal Interrupt. 프로세스를 중단하라는 시그널) 신호를 보낸다.
- Ctrl + Z : 프로세스를 종료시키지 않고, 중지해서 백그라운드로 보낸다. = SIGSTP (Signal Terminal Stop. 현재 프로세스를 중지하고 백그라운드로 보내는 시그널)
> Ctrl+Z로 Vim 중단하는 행위는 지양하기!! (실제로 중단된 것이 아니라 일지정지 후 백그라운드로 보내는 행위이기 때문에)
- jobs 명령으로 중단된 명령들 확인 가능
- fg : 포그라운드로 명령을 가져와 실행
- bg : 백그라운드에서 다시 Job 시작
jobs # 현재 Shell의 프로세스 목록
bg <job ID> # 백그라운드에서 job 실행
fg <job ID> # 포그라운드에서 job 실행
jobs
fg 1
bg 1
- 백그라운드 실행 : &, nohup
- 처음부터 프로세스를 백그라운드에 실행하고 싶다면 명령어 뒤에 & 작성 (단, 해당 명령어가 출력을 일으키면 내용이 계속 터미널에 출력된다)
- 백그라운드에서 실행중인 프로세스를 fg 명령어를 사용하면 포그라운드로 가져올 수 있다.
- 이 경우, 상황에 따라 부모 프로세스(실행중인 Shell)가 종료되면 자식 프로세스들에 SIGHUP 시그널이 전달되며 백그라운드에서 실행중이던 프로세스도 종료될 가능성이 존재함. (SIGHUP : Signal Hangup 프로세스를 실행중이던 부모 프로세스가 종료될 때 발생하는 시그널)
- 이를 방지하기 위해 nohup 명령어 사용 (No Hangup. SIGHUP 시그널을 무시하고 계속 실행하며 발생하는 출력을 nohup.out 파일로 전달하는 명령어)
ping google.com &
nohup ping google.com &
- 프로세스 확인
- jobs : 현재 Shell Session의 프로세스들을 대상으로 동작. 실행된 순서대로 job ID를 부여하여 fg, bg등의 명령어에서 활용할 수 있도록 해주는 명령어
- ps : 현재 사용중인 컴퓨터 전체의 프로세스를 대상으로 더 상세한 정보를 확인하는데 사용. 옵션에 따라 자신이 실행하지 않은 프로세스도 확인 가능.
- 옵션 :
- aux : %CPU, %MEM, VSZ(가상 메모리 크기), RSS(실제 메모리 크기), STAT(프로세스 상태)와 같은 프로세스 상태
- ef : PID, PPID 확인 가능, 프로세스의 식별 정보, 프로세스의 부모-자식 관계 보기 좋음
- 예를 들어 만약 nohup을 이용해 프로세스를 백그라운드에 실행한 상태에서 서버와 접속을 해제한 뒤 다시 접속을 했을 때에는 jobs 명령으로 해당 프로세스를 확인할 수 없다. > ps로 확인!
- + grep : 주어진 파일 또는 STDIN의 내용 중 전달된 인자를 포함한 줄만 출력해주는 명령어
- top : CLI에서 사용하는 작업 관리자와 비슷. 현재 실행중인 프로세스를 나열해 보여준다. (q로 종료)
- htop : top보다 조금 더 발전된 형태. 상호작용하여 프로세스의 정보를 확인하기 용이. (F10으로 종료)
- kill 명령어
- 기본적으로 프로세스에 SIGTERM(15) 시그널을 보낸다.
- SIGTERM을 받은 프로세스는 자신이 사용한 자원을 정리한 뒤 종료된다.
SIGTERM(15) : Signal Terminate 대상 프로세스를 중단하라는 시그널
SIGKILL(9) : Signal Kill 대상 프로세스를 강제로 종료하는 시그널
kill <PID>
kill -9 <PID>
2. Standard Streams
1) 입출력을 위한 통로
- UNIX에서는 프로그램을 실행하면 입출력을 위한 3개의 통로가 생긴다. = 표준 스트림 (Standard Stream) / 표준 입출력
- STDIN(0) 입력통로
- STDOUT(1) 일반 출력 통로
- STDERR(2) 에러 메시지 출력 통
ex) Java의 System.out, System.in은 이 Stream이 추상화된 객체이다.
- 터미널에서 Shell을 이용해 프로그램 실행 -> 프로세스 실행되면 표준 스트림이 Shell과 연결 -> 해당 Shell을 실행하고 있는 터미널과 연결.
- 키보드로 터미널에 입력한 내용은 프로세스로, 프로세스의 출력은 터미널을 통해 화면으로
- Stream은 데이터의 흐름을 나타낸다.
- 자식 프로세스는 부모 프로세스의 표준 스트림을 상속받을 수 있고, 다른 명령의 결과나 파일의 내용물을 Stream으로 전달할 수도 있다.
2) I/O Redirection
: Shell에서 명령어를 사용하면 사용중인 터미널과 연결이 되며 명령어에 연산자를 추가할 경우 파일에 출력 내용을 작성하거나, 파일로부터 입력 내용을 받아올 수 있다.
3) Output Redirection >, >>
- >를 이용해 명령의 STDOUT을 파일로 전달. 명령어 실행 후 >를 작성하고 파일 이름 정하면 해당 명령어의 출력이 파일로 저장됨.
- 2> 를 이용해 STDERR를 파일로 전달. 명령어 작성 후 2>를 작성하고 파일 이름 정하면 해당 명령어의 에러 출력이 파일로 저장됨.
ls -al > file_list.txt
rmdir .ssh 2> rmdir_err.txt
- 하나의 명령에 두 스트림 모두 별도의 파일로 전달 가능
mkdir testdir > out.txt 2> err.txt
- >는 항상 파일의 내용을 덮어쓰게 되기 때문에 본래 파일 내용을 보존하기 위해 >>를 사용
mkdir testdir 2>> err.txt
- nohup 사용한 경우와 합쳐서 nohup으로 실행한 프로그램의 결과를 출력과 에러를 분류해서 출력하도록 할 수 있다.
- STDOUT, STDERR 구분 없이 출력을 한곳으로 모으려면 2>&1 덧붙이기
nohup ping google.com > ping.out 2>&1 &
4) Input Redirection
- <를 이용해 파일의 내용을 STDIN으로 전달 가능.
- sort : 입력을 정렬하여 출력하는 명령. 출력한 뒤 이 결과를 저장하고 싶으면 이후 >를 덧붙임
vi names
sort < names
sort < names > names_sorted
5) Piping
: | 를 이용해 명령의 출력을 STDIN으로 보낼 수 있다.
- grep : 주어진 파일 또는 STDIN의 내용 중 전달된 인자를 포함한 줄만 출력해주는 명령어
- ex) ps -ef의 결과를 grep의 입력으로 전달하고 싶으면 |를 사용해서 ps -ef의 STDOUT을 grep의 STDIN으로 전달 가능
grep alex names
ps -ef | grep ping
'Programming > etc' 카테고리의 다른 글
해도 해도 부족한 명령어 공부 (터미널에서 db 연결하기) (2) | 2024.05.03 |
---|---|
[Github] Pull Request & Fork (0) | 2024.04.11 |
면접 DB, 네트워크 (0) | 2024.03.30 |
면접 자바 질문 (0) | 2024.03.30 |
Linux 개요 (2) | 2024.03.22 |