리눅스에서의 프로세스 관리

Violet_Evgadn·2023년 4월 27일
0

Linux

목록 보기
18/34

ps

명령어 ps

ps는 현재 프로세스의 목록 및 상태를 확인하는 명령어이다.

ps는 단독으로 사용하기보다는 옵션, 특히 "-ef"라는 옵션을 붙여 활용하며, 서버 측에서 실행되고 있는 프로세스가 많을 것이기 때문에 grep을 활용하여 프로세스 리스트 중 원하는 프로세스를 찾는 방식으로 많이 활용한다.

ps [Option]

ps 옵션

  • -a : 데몬 프로세스처럼 터미널에 종속되지 않은 모든 프로세스를 출력
  • -u : 특정 사용자의 프로세스 정보를 확인할 때 사용. 사용자를 지정하지 않으면 현재 사용자를 기준으로 정보 출력
  • -x : 로그인 상태에 있는 동안 완료되지 않은 프로세서들을 보여줄 때 사용
    • 유닉스 시스템에선 사용자가 로그아웃을 해도 프로세서가 계속 동작하게 할 수 있는데 이러한 터미널이 없음에도 실행되는 프로세서들을 -x 옵션을 통해 확인할 수 있음
  • -e : 커널 프로세스를 제외한 모든 프로세스를 출력
  • -f : 풀 포맷으로 모든 정보를 보여줌
    • Unix 스타일로 출력해주는 옵션으로 UID, PID, PPID 등이 표시됨

-a, -u, -x와 -e, -f 사이를 띄어놓은 이유가 있는데 ps 명령어는 주로 "ps -aux"나 "ps -ef" 2개 중 1가지 방법으로 활용하기 때문이다. 사실 ps -aux도 거의 안 쓰이고 ps를 사용한다면 대부분 ps -ef로 사용한다.

  • ps aux : 시스템에 동작중인 모든 프로세스를 소유자 정보와 함께 BSD 포맷으로 출력
  • ps -ef : 시스템에 동작중인 모든 프로세스를 Full Format으로 자세히 출력

ps -ef 예시

ps -ef만 입력했을 때 내용이 너무 많아 보기 편하게 하기 위하여 "grep /usr/bin"을 통해 /usr/bin을 포함하고 있는 프로세스들만 출력했다.

ps 테이블 항목

ps -aux 테이블 항목

  • USER : 프로세스 소유자 이름
  • PID : 프로세스 식별번호(Identifier)
  • %CPU : CPU 사용 비율의 추정치
  • %MEM : 메모리 사용 비율의 추정치
  • VSZ : K 혹은 페이지 단위의 가상 메모리 사용량
  • RSS : 실제 메모리 사용량
  • TTY : 프로세스와 연결된 터미널
    • TTY 값으로 ?가 들어간 경우 백그라운드 프로세스임을 의미함
  • STAT : 현재 프로세스 상태 코드
  • START : 프로세스 시작 시간
  • TIME : 총 CPU 사용 시간
  • COMMAND : 프로세스 실행 명령

ps -ef 테이블 항목

  • UID : 프로세스 소유자 이
  • PID : 프로세스 식별 번호
  • PPID : 부모 프로세스의 식별 번호(부모 프로세스 PID)
  • C : 프로세스 우선 순위
  • STIME : 프로세스 시작 시간
  • CMD : 프로세스 실행 명령
  • TTY, TIME : 위에서 설명

kill

명령어 kill

명령어 kill은 프로세스를 강제로 종료하기 위해 사용되는 명령어이다.

"kill -l" 명령어를 통해 프로세스 시그널 종류를 출력할 수 있는데 한 번 확인해 보자.

위 시그널을 이해하기 위해선 kill의 사용법에 대해 먼저 알아야 한다.

kill -[시그널 번호] [PID]

위 사진에서 나타난 1부터 64까지의 시그널 번호는 kill 이후 옵션으로 줄 수 있는 값들을 의미하는 것이다.

조금 더 깊이 들어가 보자면 사실 kill 명령어는 프로세스를 강제로 종료하는 명령어가 아니다.

리눅스에서는 kill 명령어를 통해 프로세스를 지정한 뒤 신호(Signal)를 보내 제어할 수 있다.

이때 지정한 프로세스에 보내는 신호는 시그널 번호를 통해 지정할 수 있으며 시그널 번호에 따라 kill 명령어에 대한 프로세스 처리 방법 또한 달라짐을 유추할 수 있다.

추가적으로 만약 "kill -9" 명령어를 사용하고 싶다면 사실 "kill -SIGKILL"으로 시그널 번호가 아닌 시그널 정보를 직접 입력해 줘도 된다. 단지 이는 매우 불편하므로 시그널 번호를 입력하는 것이 거의 규격화된 것이다.

시그널 번호

대표적인 시그널은 아래와 같다. 하지만 굳이 외울 필요는 없고, 시그널 번호 9(SIGKILL)에 대해서만 잘 외워두자.

  • 1(SIGHUP) : 실행 중인 프로그램이 사용하는 설정 파일을 변경시킨 뒤 변화된 내용을 적용할 때 사용
  • 2(SIGNINT) : 현재 작동 중인 프로세스 동작을 멈출 때 사용
    • "CTRL + C"와 동일한 역할 수행
  • 9(SIGKILL) : 프로그램을 강제 종료할 때 사용
  • 15(SIGTERM) : 실행 중인 프로세스를 정상적인 방법으로 종료시키는 신호
    • kill 명령에서 신호를 지정하지 않을 경우 시그널 번호가 15로 지정되어 프로그램을 종료함(디폴트 번호)
    • kill -9는 컴퓨터 기기의 전원 버튼을 눌러 강제 종료하는 것이고 kill -15는 시작 > 시스템 종료를 눌러 컴퓨터를 원래 방식대로 종료시키는 것으로 생각하면 된다.
  • 20(SIGTSTP) : 실행 중인 프로세스를 중지하는 데 사용하는 신호
    • "CTRL + Z"와 동일한 역할 수행
    • -2는 "종료"시키는 것이고 -19는 "중지"시키는 것이다. 이는 생각보다 큰 차이인데 for문을 100번 돌리는 명령문에서 50번째에 "kill -2"를 입력하면 해당 프로세스는 종료될 것이지만 "kill -19"를 입력하면 50번째 for문에서 중지되었다가 실행 재개 신호를 주면 51번째 for문부터 계속해서 진행한다.
  • 18(SIGCONT) : 정지된 프로세스를 재실행
    • kill -19나 kill -20을 통해 정지된 프로세스를 다시 실행시킴

만약 특정 프로세스를 종료하고 싶을 경우 아래와 같이 명령어를 입력하면 될 것이다.

kill -9 [프로세스 PID]

프로세스 관련 기타 지식

서비스

서비스란 시스템과는 독자적으로 구동되어 제공하는 프로세스를 말한다.

즉, 처음 Linux를 구동시켰을 때는 없지만 설정이나 프로그램을 통하여 추가적으로 실행될 수 있는 프로세스를 말한다.

서비스는 대표적으로 웹 서버(httpd), DB 서버(mysqld), FTP 서버(vsftpd) 등이 존재한다.

서비스들은 ".service"라는 확장자명을 가졌으며 "/usr/lib/systemd/system" 디렉터리에 위치하고 있다.

가장 유명한 서비스는 아마 "httpd.service"가 아닐까 싶은데, HTTP Protocol을 지원하는 Daemon으로 HTML 파일을 전송할 수 있게 해주는 프로세스이다.

만약 httpd.service가 없다면 HTTP Protocol을 통해 클라이언트에게 HTML 파일을 보내줄 수 없으므로 웹 서버의 역할을 수행하지 못할 것이다. 따라서 리눅스를 웹 서버로 사용하기 위해선 무조건 httpd.service가 존재하고 실행되고 있어야 할 것이다.

서비스를 실행/종료/재시작시키는 방법은 아래와 같다.

# 서비스 시작
systemctl start [서비스이름]

# 서비스 종료
systemctl stop [서비스이름]

# 서비스 재시작
systemctl restart [서비스이름]

소켓

네트워크에 대해 공부했다면 소켓에 대해서도 이미 알고 있을 것이다.

리눅스에는 접속 대기 상태의 소켓이 이미 존재하고 있으며 항상 외부에서 커넥션 생성 요청이 오기를 기다리고 있을 것이다.

이 상태에서 외부에서 소켓에 서비스를 요청할 경우 systemd가 소켓을 구동한다.

네트워크에 빗대어 생각해 보자면 systemd가 접속 대기 상태의 소켓을 복사하여 새로운 소켓을 만든 뒤 커넥션을 생성하는 것이다.

이후 외부에서 요청이 끝나면 소켓도 종료될 텐데, 네트워크에 대해 공부했다면 알 수 있듯 접속 대기 상태의 소켓은 그대로 남아 있고 복사되어 외부 요청을 처리한 소켓이 종료되는 것이다.

소켓은 ".socket" 확장자명을 가지고 있으며 "/usr/lib/systemd/system" 디렉터리에 저장되어 있다.

백그라운드 프로세스 확인

현재 실행되고 있는 백그라운드 프로세스들 출력

jobs

백그라운드 프로세스 중 n번째 프로세스를 포그라운드 프로세스로 상태 변경

fg %n

백그라운드 프로세스를 포그라운드로 가지고 와 프로세스가 끝날 때까지 프로세스 수행 내용을 출력시키는 것이다.

포그라운드 프로세스 중 n번째 프로세스를 백그라운드 프로세스로 상태 변경

bg %n

top

프로세스 목록 중 CPU 사용률이 높은 것부터 차례로 출력하는 명령어로 일정 시간마다 목록이 업데이트된다.

  • PID : 프로세스 식별자
  • User : 프로세스 소유자의 Username
  • PR : 우선순위. 20이 가장 높고 -20이 가장 낮다.
  • NI : 마이너스를 가지는 프로세스는 우선순위가 높음
  • VIRT : 가상 메모리 사용량(kb). SWAP + RES
  • RES : 사용된 물리 메모리 사용량(kb)
  • SHR : 사용된 공유 메모리 사용량(kb)
  • S : 프로세스 상태 값
    • S(Sleeping), R(Running), D(Uniterruptible Sleep), W(Swapped out process), Z(Zombies) 등의 상태가 존재함
      • W의 Swap out은 이전에 프로세스 전이도를 공부하며 배웠다
  • %CPU : 프로세스가 사용하는 CPU 사용율
  • %MEM : 프로세스가 사용하는 메모리 사용율
  • TIME+ : 프로세스가 실행된 시간
  • COMMAND : 실행된 명령어

Table 외에도 위의 Tasks, %CPU, MiB Mem, MiB Swap을 통해 실행 중인 프로세스 개수, CPU 사용 현황, 메모리 현황 및 스왑메모리 현황을 파악할 수 있다.

profile
혹시 틀린 내용이 있다면 언제든 말씀해주세요!

0개의 댓글