Researcher to Developer

LINUX - binary, foreground Process, background Process, 명령어 ps, bg 본문

코딩/Basic

LINUX - binary, foreground Process, background Process, 명령어 ps, bg

Probe29 2020. 12. 27. 15:50

#프로세스 vs 바이너리(binary)

 

기본개념

실행파일은 저장매체에 대부분 저장되어 있다.

실제 실행이 될 때에는 메모리에 데이터가 복사가 되고

모든 코드가 메모리에 올라간 상태에서

코드를 한 줄 한 줄 읽어가면서 CPU에 넣어서 실행을 한다.

 

binary

코드 이미지 또는 실행파일을 의미한다.

 

Process

실행 중인 프로그램을 의미.

프로세스는 프로그램이지만, 프로그램은 프로세스가 아니다. 그 이유는 프로그램은 여러 프로세스일 수 있기 때문

실행 중이기 때문에 상태 정보도 갖고 있다.

 

Process에 들어있는 정보

a. 실행 중일 때만 생성되는 상태 정보

b. 가상 메모리 및 물리 메모리 정보

c. 시스템 리소스 관련 정보

d. 스케줄링 단위 (스케줄러가 프로그램을 실행시키는 단위가 된다.)

 

리눅스는 기본적으로 다양한 프로세스가 실행 된다.

 

유닉스 철학 : 한 가지 프로그램은 한 가지 기능에만 충실하고 여러 프로그램이 서로 유기적으로 각자의 일을 수행하면서 전체 시스템이 동작하도록 하는 모델

 


 

foreground process

쉘에서 해당 프로세스 실행을 명령한 후, 해당 프로세스 수행 종료까지
사용자가 다른 입력을 하지 못하는 프로세스
터미널에서 치는 명령어라고 보면 됨

 

AWS 환경에서 예제로 확인해보자

 

 

먼저 gcc를 설치하자

sudo apt-get install gcc

apt-get는 서버에 접속해서 패키지를 다운할 때

install은 설치

gcc는 유닉스 환경 c 컴파일러

결과적으로 서버에 접속해서 gcc를 설치하겠다는 말

 

그리고 무한 루프 프로그램을 만들어보겠다. (프로세스가 종료되지 않는 상황을 만들기 위해서)

vi loop.c 를 입력하고

insert 를 누른다음

다음과 같이 c언어를 입력해준다.

#include <stdio.h>

int main()
{
          int i = 1;
          while (i == 1) {

          }

           return 0;
}

이 프로그램은 i가 1이면 아무것도 하지 않는 굉장히 어이없는 프로그램이다.

 

esc 를 누르고

:wq 입력 후

gcc loop.c -o loop 라고 입력하면 아무것도 안나오는데

ls 를 입력하면

loop.c 라는 실행파일이 생성된 것을 알 수 있다.

 

./loop 를 입력해주면 (./디렉토리명 : 현재 디렉토리에서 실행파일을 실행하겠다.)

아무것도 나오지 않는다. 왜냐면 무한 루프를 돌고 있기 때문!

게다가 실행 파일이 돌고 있을 때는 기본적으로 문자를 쓸 수 없다.

 

이 때는 ctrl + c 를 입력하면 된다. (프로세스 실행을 강제로 끝내는 명령어)

 

 

이렇게 실행이 끝낼 때까지 명령을 할 수 없으면 다른 작업을 할 수 없어서  
background process가 등장하게 되었다.

 

 

 

background process

사용자 입력과 상관없이 실행되는 프로세스

쉘에서 해당 프로세스 실행 시 맨 뒤에 &를 붙여준다.

 

쉘에서 해당 프로세스 실행 시 새로운 프롬포트가 나오면서 
다른 명령을 실행할 수 있게끔 해주며, background process로 실행했던 
프로세스는 스케줄러를 통해서 뒤에서 계속해서 실행할 수 있게 해준다.

 

 

다음은 background process 사용 예이다.

# find / -name '*.py' > list.txt &       - 전체 디렉토리에서 ~.py로 끝나는 파일들을 전부 찾고 list.txt에 넣어라
[1] 57                                         - [1]은 작업 번호(job number), 57은 process ID(pid)를 나타냄

 

 

#background process외 foreground process를 제어하는 방법

 

ctrl + z 

foreground procss를 실행 중지 상태(suspend 모드)로 변경해준다.

Mac 환경에서는 ctrl + option + z 나 ctrl + alt + z 를 사용

 

background process를 관리하는 메커니즘이 존재하는데

그 때 각각의 프로세스를 job 이라고 하고 각각의 job 마다 번호를 매긴다. 
ctrl + z 명령을 내리면 실행 파일이

background process를 관리하는 메커니즘에 들어가고 그 job의 번호를 알려준다.
ctrl + z 는 지금까지의 상태를 중단하는 것이므로 이어서 진행할 수 있는 상태로 만들어 놓을 수 있다.

 

 

jobs 명령어

background로 진행 또는 중지된 상태에 있는 process를 보여준다.

job의 리스트를 보여준다.

 

 

bg

가장 마지막에 ctrl + z 로 중지한 프로세스를 background process로 실행할 수 있다.

 

 

bg + 해당 job 번호

해당 job을 실행할 때 사용

 

 

ctrl + c

프로세스 작업 취소 (해당 프로세스 완전 종료)

jobs 번호가 생성되지 않는다. 그 이유는 background로 실행되는 것이 아니기 때문이다.

 

 

 

기본개념

단축키를 누르면
운영체제 소프트웨어 인터럽트가 운영체제 내에서 발생하고
그 번호에 해당하는 동작을 하게 된다. (시그널을 사용해서)
해당 프로세스에 보내져서 프로세스 제어가 가능하다.

 


 

#ps 명령어

대표적인 몇 가지 프로세스 상태 확인할 수 있는 명령어

 

ps만 입력하면 사용자가 실행한 프로세스만 보여진다.
ps를 실행할 때 ps도 하나의 프로세스이기 때문에
ps 프로세스 자체도 표시가 됨
하나의 쉘인 bash도 하나의 프로세스로 사용자가 로그인한 다음 실행시켰기 때문에
bash 정보도 확인가능하다.

 

 

ps [option(s)] 
option(s)

-a : 시스템을 사용하는 모든 사용자의 프로세스 출력(보통 aux와 처럼 u,x 옵션과 함께 사용)
     ps -aux, ps aux
-u : 프로세스 소유자에 대한 상세 정보 출력
-l : 프로세스 관련 상세 정보 출력
-x : 터미널에 로그인한 후 실행한 프로세스가 아닌 프로세스들도 출력함, 
      주로 데몬 프로세스(daemon process)까지 확인하기 위해 사용
      본래 ps 명령은 현재 쉘에서 실행한 프로세스들만 보여주기 때문에 이 옵션을 사용하는 경우가 많음
-e : 해당 프로세스와 관련된 환경 변수 정보도 함께 출력
-f : 프로세스 간 관계 정보도 출력

 

 

 


#Daemon process 데몬 프로세스 
사용자 모르게 시스템 관리를 위해 실행되는 프로세스로
보통 시스템이 부팅될 때 자동으로 실행되는 프로세스
24시간 돌아간다

 

ps -aux 입력했을 때 각 정보가 의미하는 것

 


USER 
프로세스 소유자, 실행한 사람

PID
프로세스 ID

COMMAND
프로세스 이름

%CPU 
마지막 1분 동안 프로세스가 사용한 CPU시간의 백분율

%MEM 
물리 메모리의 사이즈에서 이 프로세스가 실제 사용하고있는 %

VSZ
프로세스가 사용하는 가상 메모리 크기

RSS
프로세스에서 사용하는 실제 메모리 크기

TTY
이 프로세스가 어떤 터미널(하드웨어 리소스)과 연결되어 있는지 알 수 있는 정보

STAT
프로세스의 상태




#kill 명령어

프로세스 중지시키기 

kill % 작업 번호(job number)
kill pid
kill -9 pid (작업 강제 종료 option -9)