Codesigner

[Linux] 리눅스(Linux) 프로세스 & 환경변수 관리 본문

Linux

[Linux] 리눅스(Linux) 프로세스 & 환경변수 관리

eunsukimme 2019. 6. 17. 17:13

저번 포스팅에서는 파일의 접근 권한을 관리하고 기타 쉘 기능들에 대해서 알아보았다. 이번 포스팅에서는 리눅스에서 프로세스의 두 종류와 이를 관리하는 방법 및 환경 변수에 대해서 알아보도록 하자. 간단하게 프로세스에 대해 설명하자면, 프로세스(process)는 컴퓨터에서 실행되고 있는 컴퓨터 프로그램을 말한다. 즉, 컴퓨터 안에 실행 중인 프로그램을 프로세스라고 하며 실행 중이지 않으면 프로그램이라 보면 된다

 

 

 

프로세스 관리

리눅스에서는 현재 터미널 세션에 관련된 프로세스의 목록을 보여주는 ps 명령을 제공한다. 필자는 VMware Workstation 15 Player의 Ubuntu 환경에서 터미널을 열고 다음 명령을 실행해 보았다

 

<그림 1> ps 명령 결과

 

ps 명령의 결과로 위와 같이 출력된다. PID는 프로세스의 아이디이고, TTY는 터미널의 번호를 나타낸다. TIME 은 사용 시간을 의미하며, CMD 는 명령어이다. ps 명령은 옵션으로 다음 것들이 존재한다

  • -f

    • 자세한 프로세스 상태 보기

  • -a

    • 다른 터미널의 프로세스 상태 보기

  • -u

    • 사용자 이름과 시작 시간 추가하여 보기

  • -e

    • 모든 프로세스의 환경 보기

  • -x

    • 진행중인 프로세스들과 다른 터미널의 프로세스 보기

다음으로 ps aux 명령을 통해 시스템의 모든 프로세스를 확인할 수 있다

 

<그림 2> ps aux 명령 결과

 

위 명령의 결과는 모든 프로세스 목록을 출력한다. PID를 보면 모든 프로세스는 고유한 id를 가진다는 것을 알 수 있다. 여기서 1번 프로세스는 최초의 프로세스이며, /sbin/init 프로그램인 것을 확인할 수 있다. 이렇게 모든 프로세스를 출력하는 상태에서 내가 원하는 프로세스만 확인할 수 있는 방법이 있다. 바로 이전 포스팅에서 배웠던 파이프라이닝과 grep 명령을 조합하는 것이다. 다음과 같이 활용하여 ssh와 관련된 프로세스만 찾을 수도 있다

 

<그림 3> ps aux grep ssh 명령으로 ssh 관련 프로세스를 찾은 모습

 

뿐만 아니라 pgrep 명령으로 프로그램 이름으로 프로세스를 검색할 수도 있다

 

<그림 4> pgrep 명령 결과

 

 

 

포그라운드 & 백그라운드 프로세스(Foreground and Background Processes)

프로세스의 종류는 두 가지가 있는데, 포그라운드(Foreground)와 백그라운드(Background) 프로세스가 존재한다. 포그라운드 프로세스는 사용자가 입력한 명령이 실행되어 결과가 출력될 때 까지 기다려야 하는 프로세스이고, 백그라운드 프로세스는 명령을 실행하면 명령의 처리가 끝나는 것과 관계없이 곧바로 프롬프트가 출력되어 사용자가 다른 작업을 할 수 있는 프로세스를 말한다. 이해를 돕기 위해 다음과 같은 코드를 작성해보자

// Hello.c
// 5초 간격으로 Hello World! 를 출력하는 프로그램
#include<unistd.h>
#include<stdio.h>
int main(){
  int x = 0;
  do {
    printf("Hello World!\n");
    sleep(5);
  }while(x++ < 100);
}

위 코드를 gcc로 컴파일하고, 그대로 실행해보면 이는 자동적으로 포그라운드 프로세스로 실행된다. 즉, 이 프로세스가 종료될 때 까지 사용자는 터미널에서 기다려야 하는 것이다

 

<그림 5> 포그라운드 프로세스로 실행된 Hello 프로그램

 

보시다시피 Hello World!가 계속되어 출력되고, 프롬프트는 출력되지 않는다. 다른 명령을 수행할 수 없는 상태인 것이다. 여기서 Ctrl+Z 키를 누르면 이 프로세스는 중단(Suspend)된다. 종료된 것은 아니다. 그러면 이제 프롬프트가 출력되어 명령을 수행할 수 있는 상태가 된다. 이때 bg 명령을 내리면 중단된 프로세스를 백그라운드 프로세스로 만든다

 

<그림 6> 중단된 Hello 프로그램을 백그라운드로 전환

 

백그라운드로 Hello 프로세스를 전환하니 프롬프트가 나온다. 그러면서 여전히 Hello World! 는 5초 간격으로 등장하는 것을 볼 수 있다. 백그라운드 프로세스는 fg 명령으로 다시 포그라운드 프로세스로 전환할 수 있다. 또한 Ctrl+C 키를 누르면 현재 진행 중인 프로세스를 종료할 수 있다

 

<그림 7> Hello 프로그램을 포그라운드로 변경 후 종료한 모습

 

앞에서 Ctrl+Z 키를 누르면 프로세스가 중단된다고 하였는데, 완전히 종료되는 것은 아니라고 하였다. 중단된 프로세스를 종료시키는 방법으로는 포그라운드 프로세스로 변경하여 Ctrl+C 키로 종료하는 방법도 있고, 백그라운드 프로세스로 변경한 다음 kill 명령으로 종료하는 방법도 존재한다

 

<그림 8> 백그라운드 Hello 프로그램을 Kill 명령으로 종료

 

이때 kill 명령은 프로세스에게 TERM 시그널을 보낸다. 하지만 모든 프로세스가 TERM 시그널에 반응하는 것은 아니다. 그 경우에는 kill -9 PID 명령을 사용해야 한다. 이 명령은 커널에게 해당 프로세스를 강제 종료하도록 요청한다

 

 

 

환경 변수

쉘에서는 사용자가 변수를 정의하고 사용할 수 있다. 일반적으로 소문자를 사용한다

$ projdir=/home/marshall/coolstuff
$ ls -la $projdir
$ cd $projdir

정의한 변수는 현재 쉘에서만 사용이 가능하다. 즉, 다른 터미널 창에서 해당 변수에 접근할 수 없다. 정의한 변수를 현재 쉘 뿐만 아니라 현재 쉘의 모든 서브 프로세스에서 사용 가능하게 하려면 export 명령으로 환경변수로 만들어야 한다

export DEBUG=1

그리고 env 명령은 현재 정의되어 있는 모든 환경변수와 그 값을 나열한다. 다음은 필자의 env 명령의 출력 결과의 일부이다

$ env
LESSCLOSE=/usr/bin/lesspipe %s %s
XDG_MENU_PREFIX=gnome-
LANG=en_US.UTF-8
DISPLAY=:0
OLDPWD=/home/eunsu
testdir=/home/eunsu/test
GNOME_SHELL_SESSION_MODE=ubuntu
COLORTERM=truecolor
NVM_CD_FLAGS=
USERNAME=eunsu
XDG_VTNR=2
SSH_AUTH_SOCK=/run/user/1000/keyring/ssh
XDG_SESSION_ID=2
USER=eunsu		// 현재 사용자
DESKTOP_SESSION=ubuntu
QT4_IM_MODULE=xim
TEXTDOMAINDIR=/usr/share/locale/
GNOME_TERMINAL_SCREEN=/org/gnome/Terminal/screen/b4fe94bd_9808_43a6_823b_cd015f6ad1f9
PWD=/home/eunsu/test		// 현재 위치한 디렉터리
HOME=/home/eunsu		// 홈 디렉터리 경로
TEXTDOMAIN=im-config
SSH_AGENT_PID=1737
QT_ACCESSIBILITY=1
XDG_SESSION_TYPE=x11

env 명령은 위와 같이 여러가지 환경 변수와 그 값을 출력한다. 여기에 PATH 또한 존재하는데, 사용자가 실행한 명령어의 위치를 찾아볼 디렉터리들을 순서대로 명시한다

 

<그림 9> PATH 환경변수와 그 값

 

또한 LD_LIBRARY_PATH 란 환경 변수가 존재하는데, 이는 공유 라이브러리(Shared Library)를 검색하는 위치를 나타낸다

 

 

 

Review

이번 포스팅에서는 리눅스에서 프로세스를 확인하고 관리할 수 있는 간단한 방법에 대해서 알아보았다. 또한 환경 변수가 무엇이고 어떻게 확인할 수 있는지도 살펴보았다. 다음 포스팅에서는 리눅스에서 사용자/그룹을 관리하는 방법에 대해서 알아보도록 하자

 

 

Comments