[Study38]Linux에서의 프로세스 정보 및 관리 이해 - 프로세스 관리
프로세스 관리 (백그라운드와 포그라운드 관리 - &, bg, fg, jobs)
명령어를 입력하여 프로그램을 실행하면, 해당 프로세스가 실행되는 동안 사용자는 다른 명령어를 입력할 수 없습니다. 이는 셸 프롬프트가 해당 프로세스의 실행을 위해 사용 중이기 때문입니다. 그러나 명령행 끝에 &(앰퍼샌드)를 붙이면, 해당 프로세스는 백그라운드에서 실행되며, 사용자는 여전히 다른 명령을 입력할 수 있습니다. 즉, 쉘 프롬프트는 떨어지지 않습니다. 이렇게 백그라운드에서 실행되는 프로세스는 사용자에게 보이지 않습니다.
백그라운드에서 실행되는 프로세스를 확인하려면 $ jobs 명령어를 사용하여 확인할 수 있습니다. 또한, 포그라운드로 전환하기 위해서는 $ fg 명령어를 사용할 수 있습니다. 반대로, 포그라운드에서 실행되는 프로세스를 백그라운드로 전환하려면, <Ctrl+Z>를 사용하여 프로세스를 멈춘 후, $ bg 명령어를 사용하면 됩니다. 이렇게하면 해당 프로세스가 백그라운드에서 실행됩니다.
실행 중인 프로세스를 종료하려면, <Ctrl+C>를 사용하면 됩니다. 이렇게하면 프로세스가 종료되고, 쉘 프롬프트로 돌아올 수 있습니다. 또한, 백그라운드에서 실행 중인 모든 프로세스를 종료하려면, $ kill % 명령어를 사용할 수 있습니다. 이렇게하면 해당 프로세스가 종료되고, 쉘 프롬프트로 돌아올 수 있습니다.
(프로그램이 실행되는 형태)
(fg) # ls (# gedit )
(bg) # ls & (# gedit &)
프로그램을 실행하는 방법에는 여러 가지가 있습니다. 여기서는 명령어를 입력하여 실행하는 방법에 대해 자세히 알아보겠습니다. 명령어는 터미널 창에서 입력할 수 있습니다. 명령어를 사용하여 프로그램을 실행하면, 운영 체제는 해당 명령어를 해석하고, 프로그램을 실행합니다. 그러나 이러한 명령어를 사용하는 방법을 정확히 이해하는 것이 중요합니다.
우선 fg와 bg 명령어를 사용하여 프로그램을 실행할 수 있습니다. fg 명령어는 foreground에서 실행되는 프로그램을 나타내며, bg 명령어는 background에서 실행되는 프로그램을 나타냅니다. 이러한 차이점을 이해한다면, 프로그램을 실행할 때 어떤 프로그램이 foreground에서 실행되고 있는지, 어떤 프로그램이 background에서 실행되고 있는지 쉽게 파악할 수 있습니다.
예를 들어, ls 명령어는 현재 디렉토리에 있는 모든 파일과 폴더를 출력하며, gedit 명령어는 텍스트 편집기를 실행합니다. 그러나 이러한 명령어를 실행할 때, fg와 bg를 어떻게 사용해야 하는지 모르면, 프로그램이 실행되지 않을 수 있습니다.
따라서, 이제부터는 fg와 bg 명령어를 사용하여 프로그램을 실행할 때, 어떻게 사용해야 하는지 자세히 알아보겠습니다. 이를 통해, 명령어를 더욱 정확하게 입력하고, 프로그램을 더욱 효율적으로 실행할 수 있습니다. 예를 들어, fg와 bg 명령어를 조합하여 프로그램을 실행할 수 있습니다. 이를 통해, 여러 개의 프로그램을 동시에 실행할 수 있으며, 이는 작업을 더욱 효율적으로 수행할 수 있도록 도와줍니다.
(fg 형태로 프로그램이 실행되면)
# ps
PID TTY TIME CMD
8711 pts/1 00:00:00 bash
# sleep 600
-> 명령어 창으로 돌아와서 "# ls" 명령어를 수행해도 명령어가 출력결과가 보이지 않는다.
-> 부모 프로세스(bash)가 종료되면 자식 프로세스가 종료된다.
위 코드는 fg 형태로 프로그램이 실행되는 경우를 보여줍니다. 우선 ps 명령어를 사용하여 현재 실행 중인 프로세스들을 보여줍니다. 그 다음 sleep 600 명령어를 사용하여 현재 프로세스를 600초 동안 중지시킵니다. 그리고 나서 ls 명령어를 실행해도 아무런 출력이 없는 것을 확인할 수 있습니다. 이는 백그라운드에서 실행되는 것이 아니라 fg 형태로 실행되었기 때문입니다. 마지막으로 부모 프로세스(bash)가 종료되면 자식 프로세스가 종료된다는 것을 알려줍니다.
(bg 형태로 프로그램이 실행되면)
# ps
PID TTY TIME CMD
8711 pts/1 00:00:00 bash
# gedit &
-> 명령어 창으로 돌아와서 "# ls" 명령어를 수행하면 정상적으로 수행이 된다.
-> 부모 프로세스(bash)가 종료되었다고 해서 자식 프로세스가 종료되지 않는다.(# exit 명령어 사용)
위 코드는 bg 형태로 프로그램이 실행되는 경우를 보여줍니다. 위 코드에서는 ps 명령어를 사용하여 현재 실행 중인 프로세스들을 보여줍니다. 그 다음 gedit 명령어를 사용하여 gedit 편집기를 백그라운드에서 실행합니다. 그리고 나서 ls 명령어를 실행하면 정상적으로 실행되는 것을 확인할 수 있습니다. 마지막으로 부모 프로세스(bash)가 종료되었다고 해서 자식 프로세스가 종료되지 않는다는 것을 알려줍니다. 이 경우에는 exit 명령어를 사용하여 gedit 프로세스를 종료해야합니다.
tmux는 유용한 기능이 많이 있습니다. 세션, 윈도우, 틀 등으로 구성되어 있으며, 이를 이용하여 터미널 작업을 효율적으로 수행할 수 있습니다. 세션은 여러 개의 윈도우로 구성되어 있고, 윈도우는 터미널 화면입니다. 세션 내에서는 윈도우를 탭처럼 사용할 수 있습니다. 윈도우 내에서는 틀을 여러 개로 분할할 수 있습니다.
tmux 세션을 관리하는 데 필요한 명령어들은 다음과 같습니다:
# 새로운 세션 생성
tmux new -s (session_name)
# 세션 만들면서 윈도우랑 같이 생성
tmux new -s (session_name) -n (window_name)
# 세션 목록
tmux ls
# 세션 다시 시작하기(다시 불러오기)
tmux attach -t session_number
# 세션 중단하기
(ctrl + b) d
# 스크롤하기
ctrl + b + [
# 특정 세션 강제 종료
tmux kill-session -t session_number
- 새로운 tmux 세션을 만들려면 tmux new -s (session_name)을 사용합니다. 이 명령어는 지정한 이름으로 새 세션을 만듭니다.
- 새로운 윈도우가 포함된 세션을 만들려면 tmux new -s (session_name) -n (window_name)을 사용합니다. 이 명령어는 (window_name)이라는 이름의 윈도우가 있는 새 세션을 만듭니다.
- 모든 세션 목록을 확인하려면 tmux ls를 사용합니다. 이 명령어는 모든 활성 tmux 세션 목록을 표시합니다.
- 세션을 다시 연결하려면 tmux attach -t session_number를 사용합니다. 이 명령어는 지정한 세션 번호에 연결합니다.
- 세션에서 분리하려면 (ctrl + b) d를 사용합니다. 이 명령어는 현재 세션에서 분리하고 나중에 다시 연결할 수 있도록 합니다.
- 세션에서 스크롤하려면 ctrl + b + [를 사용합니다. 이 명령어는 세션의 출력 내용을 스크롤할 수 있도록 합니다.
- 특정 세션을 강제 종료하려면 tmux kill-session -t session_number를 사용합니다. 이 명령어는 지정한 세션을 강제로 종료합니다.
이러한 명령어들은 여러 개의 세션을 다룰 때나 세션에서 분리하고 나중에 다시 연결할 때 유용합니다. 이러한 명령어를 사용하여 tmux 세션을 쉽게 관리하고 작업 흐름을 개선할 수 있습니다.
윈도우를 조작하는 명령어는 여러 가지가 있습니다. 이 중 몇 가지를 소개합니다.
# 새 윈도우 생성
(ctrl + b) c
# 새 윈도우 이동
(ctrl + b) b (숫자)
새 윈도우를 생성하기 위해서는 (ctrl + b) c를 입력합니다. 이렇게 하면 현재 윈도우와는 별개로 새로운 윈도우가 생성됩니다. 이 윈도우에서는 다른 작업을 수행할 수 있습니다.
새로운 윈도우로 이동하려면 (ctrl + b) b (숫자)를 입력합니다. 이 명령어는 현재 윈도우에서 다른 윈도우로 이동할 때 사용됩니다. 이렇게 하면 여러 개의 윈도우를 동시에 조작할 수 있습니다.
틀 관련 명령어에는 다양한 기능이 있습니다. 예를 들어, 틀을 나누는 방법은 좌우로 나누는 것과 위아래로 나누는 것이 있습니다. 또한, 틀끼리 이동하는 방법도 있습니다. 방향키를 이용하거나, q나 o키를 눌러 순서대로 이동할 수 있습니다. 틀을 삭제하는 방법도 있으며, 틀의 사이즈를 조절할 수도 있습니다. 이를 위해서는 L,R,U,D 입력하거나, 방향키와 alt키를 함께 이용할 수 있습니다. 또한, 단축키 목록을 확인할 수도 있습니다.
따라서, 다음과 같은 명령어를 사용할 수 있습니다.
# 틀 나누기
(ctrl + b) % #좌우로 나누기
(ctrl + b) " #위아래로 나누기
# 틀끼리 이동하기
(ctrl + b) 방향키
(ctrl + b) q
(ctrl + b) o #순서대로 이동
# 틀 삭제
(ctrl + d)
# 틀 사이즈 조정
(ctrl + b) : resize_pane -L 10 #L,R,U,D 입력하면 상하좌우로 조절됨
(ctrl + b) (alt) 방향키
# 단축키 목록
(ctrl + b) ?
tmux는 터미널 작업을 효율적으로 수행하기 위한 다양한 기능을 제공합니다. 세션을 이용하여 여러 작업을 동시에 수행하고, 윈도우를 탭처럼 사용하여 터미널을 관리할 수 있습니다. 틀을 이용하여 화면을 분할하고, 각각의 틀에서 다른 작업을 수행할 수 있습니다. 또한 틀을 이동하거나 크기를 조절하는 등의 다양한 작업을 수행할 수 있습니다.
또한, 프로세스 관리를 위해 kill 명령어를 사용할 수 있습니다. kill 명령어를 이용하여 특정 프로세스를 종료할 수 있습니다. SIGTERM 시그널을 이용하여 프로세스를 종료하는 것이 일반적입니다. 만약, 프로세스가 종료되지 않을 경우에는 SIGKILL 시그널을 이용하여 강제로 종료할 수 있습니다. 또한, killall 명령어를 이용하여 특정 프로세스를 모두 종료할 수도 있습니다.
screen 명령어
Screen 명령어는 터미널에서 여러 작업을 처리할 때 유용한 도구입니다. 기본적으로 screen 명령어를 사용하여 세션을 생성하고 다른 명령어를 사용하여 세션을 종료하거나 다른 세션에 연결할 수 있습니다. 하지만 이 명령어를 처음 사용하는 사람들은 사용법을 이해하기 어려울 수 있습니다.
따라서 이번에는 Screen 명령어의 기본 사용법을 자세히 알아보겠습니다.
# dnf -y install screen
screen # 기본 세션 생성하기
screen -S name # 생성할 세션의 이름. 이름은 다시 세션에 연결(attach)할때 사용됩니다.
Ctrl-a d # 현재 screen 세션을 끊습니다.
screen -d SCREENID # command 화면이 다른 터미널에서 실행될때, 원격 분리(detach)
screen -ls # 기존의 screen sessions들의 모든 목록을 보여줍니다.
screen -r # 기본 세션에 연결합니다. 이 명령어는 screen session이 하나일때만 작동합니다.
screen -r <SCREENID> # 특정 screen session에 연결
screen -r name # 특정 세션에 연결(screen 세션을 만드는 동안 지정된 고유의 이름)
screen -X -S SCREENID quit
screen -S SCREENID -X quit
Screen 명령어는 여러분이 여러 작업을 처리해야 하는 경우에 유용합니다. 예를 들어, 여러분이 서버에서 작업하고 있다면, 이 명령어를 사용하여 여러 개의 세션을 생성하고 각각의 작업을 처리할 수 있습니다. 이렇게 하면 여러 개의 작업을 동시에 처리할 수 있으며, 작업을 종료하거나 다시 시작할 때마다 세션을 새로 생성할 필요가 없습니다.
또한 Screen 명령어는 터미널에서 작업하다가 인터넷 등의 문제로 터미널 연결이 끊어졌을 경우에도 유용합니다. 이 경우에는 다시 터미널에 접속하여 이전에 진행하던 작업을 이어서 처리할 수 있습니다.
하지만 이 명령어를 처음 사용하는 경우에는 사용법을 이해하기 어려울 수 있습니다. 따라서 이번에는 Screen 명령어의 기본 사용법을 자세히 알아보겠습니다.
프로그램 실행 실습
다음은 프로그램을 실행하는 예제입니다.
# cat & /* 백그라운드 상태로 프로세스를 실행 */
백그라운드에서 프로그램을 실행하면 프로그램이 실행되는 동안 터미널을 계속 사용할 수 있습니다.
# ps -ef | grep cat
root 7827 7601 0 02:46 pts/3 00:00:00 cat
root 27281 1 0 Jan26 ? 00:00:00 /usr/libexec/notification-area-applet --oaf-activate-ii d=OAFIID:GNOME_NotificationAreaApplet_Factory --oaf-ior-fd=21
[1]+ Stopped cat
"ps" 명령어를 사용하여 현재 실행 중인 프로세스들을 보여줄 수 있습니다. "cat" 프로그램이 백그라운드에서 실행되고 있음을 확인할 수 있습니다.
# ls -ld /proc/7827
dr-xr-xr-x 5 root root 0 1월 27 02:46 /proc/7827/
"ls" 명령어를 사용하여 "/proc/7827" 디렉토리가 생성되었음을 확인할 수 있습니다.
프로그램을 포그라운드에서 실행하기
# fg (# fg 1)
포그라운드에서 실행 중인 프로그램은 "CTRL + C"를 입력하여 종료할 수 있습니다.
# ls -ld /proc/7827 /* 지워진 것을 확인 할 수 있다. */
ls: /proc/7827/: 그런 파일이나 디렉토리가 없음
프로그램이 종료되면, "/proc/7827" 디렉토리가 삭제됨을 확인할 수 있습니다.
프로세스 관리 (백그라운드와 포그라운드 관리 - &, bg, fg, jobs)
포그라운드 상태에서 프로그램을 실행하면, 해당 프로세스가 실행되는 동안 셸 프롬프트를 사용할 수 없습니다. 따라서 셸 프롬프트로 돌아가려면 <Ctrl + D>를 사용하여 프로그램을 종료해야 합니다. 그러나 명령행 끝에 &(앰퍼샌드)를 붙이면, 해당 프로세스는 백그라운드에서 실행되며, 쉘 프롬프트는 떨어지지 않습니다. 이렇게 백그라운드에서 실행되는 프로세스는 사용자가 보지 않는 상태로 실행됩니다.
백그라운드에서 실행되는 프로세스를 확인하려면 $ bg 명령어를 사용하면 됩니다. 또한, 포그라운드로 전환하기 위해서는 $ fg 명령어를 사용할 수 있습니다. 반대로, 포그라운드에서 실행되는 프로세스를 백그라운드로 전환하려면, <Ctrl+Z>를 사용하여 프로세스를 멈춘 후, $ bg 명령어를 사용하면 됩니다. 이렇게하면 해당 프로세스가 백그라운드에서 실행됩니다.
예제 코드를 통해 프로세스 관리에 대해 살펴보겠습니다.
# sleep 500 /* 포그라운드 상태로 프로세스를 실행 */
[1]+ Stopped sleep 500
<CTRL + Z>
# sleep 600
[2]+ Stopped sleep 600
<CTRL + Z>
# sleep 700
[3]+ Stopped sleep 700
<CTRL + Z>
# jobs
[1] Stopped sleep 500
[2]- Stopped sleep 600
[3]+ Stopped sleep 700
먼저, sleep 명령어를 사용하여 포그라운드 상태로 프로세스를 실행합니다. 이때, <Ctrl + Z>를 사용하여 프로세스를 멈추고, jobs 명령어를 사용하여 현재 실행 중인 프로세스를 확인할 수 있습니다.
# bg 1/* 일시중지된 포그라운드 작업을 백그라운드에서 실행 */
[1] sleep 500 &
# bg 2
[2]- sleep 600 &
# bg 3
[3]+ sleep 700 &
# jobs
[1] Running sleep 500 &
[2]- Running sleep 600 &
[3]+ Running sleep 700 &
이제, 백그라운드에서 실행되도록 작업을 전환합니다. 일시중지된 포그라운드 작업을 백그라운드에서 실행하기 위해서는 bg 명령어를 사용합니다. 이때, 작업 번호를 지정하면 해당 작업을 백그라운드에서 실행할 수 있습니다.
# fg 1
sleep 500
<CTRL + C>
# fg 2
sleep 600
<CTRL + C>
# fg 3
sleep 700
<CTRL + C>
# jobs
#
이제, 다시 포그라운드에서 실행하도록 작업을 전환합니다. 포그라운드로 전환하기 위해서는 fg 명령어를 사용합니다. 이때, 작업 번호를 지정하면 해당 작업을 포그라운드에서 실행할 수 있습니다. 실행이 완료되면, <Ctrl + C>를 사용하여 프로세스를 종료합니다. 실행 중인 작업이 없을 경우, jobs 명령어는 아무런 출력을 하지 않습니다.
프로세스 정보 확인
프로세스 정보 확인은 다양한 방법으로 수행될 수 있습니다. 예를 들어, 작업 관리자를 사용하여 현재 실행 중인 프로세스를 확인할 수 있습니다. 또는 명령 프롬프트를 열고 "tasklist" 명령을 실행하여 프로세스 목록을 볼 수도 있습니다. 또는 성능 모니터를 사용하여 프로세스 활동을 모니터링하고 문제를 해결할 수도 있습니다. 이러한 방법을 사용하여 프로세스 정보를 확인하고 문제를 신속하게 식별하고 해결하는 것이 중요합니다.
프로세스 관리를 위해서는 많은 명령어들이 존재합니다. 이 중에서도 가장 기본적인 명령어는 'ps' 명령어입니다.
현재 실행되고 있는 프로세스의 정보를 확인하는 명령어
# ps
# ps -l
# ps -a
- 'ps' 명령어는 현재 실행되고 있는 프로세스의 간략한 정보를 확인할 수 있도록 도와줍니다.
- 'ps -l' 명령어는 현재 실행되고 있는 프로세스의 자세한 정보를 확인할 수 있도록 도와줍니다.
- 'ps -a' 명령어는 사용자 프로세스에 대한 간략한 정보를 확인할 수 있도록 도와줍니다.
특정 사용자가 실행시킨 프로세스의 정보를 확인하는 명령어
# ps -U <사용자명>
- 'ps -U' 명령어를 이용하여, 특정한 사용자가 실행시킨 프로세스의 간략한 정보를 확인할 수 있습니다.
특정한 터미널에서 실행시킨 프로세스의 정보를 확인하는 명령어
# ps -t <터미널명>
- 'ps -t' 명령어를 이용하여, 특정한 터미널에서 실행시킨 프로세스의 간략한 정보를 확인할 수 있습니다.
xinetd와 관련된 프로세스 정보를 확인하는 명령어
# ps aux | grep xinetd
# ps -ef | grep xinetd
# ps -aux | grep xinetd
- 'ps' 명령어와 함께 'grep' 명령어를 이용하여, xinetd와 관련된 프로세스 정보를 확인할 수 있습니다.
이렇게, 사용자는 명령어를 이용하여 다양한 정보를 확인할 수 있습니다.
[명령어 옵션]
옵션 내용
-e | 모든 프로세스 리스트를 출력한다. |
-f | 프로세스 시작시간, 프로세스의 부모 ID, 그 프로세스에 관련된 사용자 ID, 명령 이름과 가능한 매개변수등 모든 정보를 출력한다. (full format) |
-l | 자세한 정보 보기 |
-p (pid) | 지정된 프로세스에 대한 정보를 출력한다. |
-t (tty) | 지정된 터미널에 연관된 프로세스에 대한 정보를 출력한다. |
-u (uid) | 지정된 사용자에 연관된 프로세스에 대한 정보를 출력한다. |
a | 다른 사용자의 프로세스 상태도 표시된다. |
x | 화면에 보이지 않는 프로세스까지 모두 표시 |
ps 명령어는 현재 실행 중인 프로세스의 상태를 확인하는 명령어입니다. 여러분은 이 명령어를 사용하여 프로세스의 상태를 알고, 필요한 경우 해당 프로세스를 제어할 수 있습니다. 이번에는 ps 명령어의 다양한 옵션을 사용하여 프로세스 상태를 확인하는 방법을 자세히 알아보겠습니다.
STEP 1: 자신이 실행한 프로세스 확인
가장 먼저, ps 명령어를 사용하여 자신이 실행한 프로세스의 상태를 확인할 수 있습니다. 이를 위해서는 아래와 같은 명령어를 입력하면 됩니다.
# ps /* 자신이 실행한 프로세스를 확인 */
PID TTY TIME CMD
6165 pts/1 00:00:00 bash
위의 명령어를 입력하면 자신이 실행한 프로세스의 정보가 표시됩니다.
STEP 2: 특정 사용자가 사용하는 프로세스 정보 확인
특정 사용자가 사용하는 프로세스 정보를 확인하고자 할 때는 -U 옵션을 사용합니다. 아래의 명령어는 root 사용자가 사용하는 프로세스 정보를 보여줍니다.
# ps -U root /* root 사용자가 사용하는 프로세스 정보를 보여줌 */
PID TTY TIME CMD
1 ? 00:00:00 init
2 ? 00:00:00 migration/0
3 ? 00:00:00 ksoftirqd/0
4 ? 00:00:00 watchdog/0
5 ? 00:00:00 events/0
..... (중략) .....
STEP 3: 현재 터미널에서 실행된 프로세스의 간략한 정보 확인
현재 터미널에서 실행된 프로세스의 간략한 정보를 확인하고자 할 때는 -t 옵션을 사용합니다. 아래의 명령어는 현재 터미널에서 실행된 프로세스의 정보를 확인합니다.
# ps /* 현재 터미널에서 실행된 프로세스의 간략한 정보 확인 */
PID TTY TIME CMD
7601 pts/3 00:00:00 bash
7714 pts/3 00:00:00 ps
STEP 4: 터미널창 번호를 확인 후에 해당 터미널의 프로세스 정보를 확인
터미널창 번호를 확인한 후에 해당 터미널의 프로세스 정보를 확인하고자 할 때는 -t 옵션을 사용합니다. 아래의 명령어는 터미널창 번호를 확인한 후에 해당 터미널의 프로세스 정보를 확인합니다.
# ps -t pts/3 /* 터미널창 번호를 확인 후에 해당 터미널의 프로세스 정보를 확인 */
PID TTY TIME CMD
7601 pts/3 00:00:00 bash
7717 pts/3 00:00:00 ps
STEP 5: 모든 프로세스 리스트를 출력하면서 모든 정보를 함께 출력함
모든 프로세스 리스트를 출력하면서 모든 정보를 함께 출력하고자 할 때는 -ef 옵션을 사용합니다. 아래의 명령어는 모든 프로세스 리스트를 출력하면서 모든 정보를 함께 출력합니다.
# ps -ef | less /* 모든 프로세스 리스트를 출력하면서 모든 정보를 함께 출력 함 */
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 Jan26 ? 00:00:00 init [5]
root 2 1 0 Jan26 ? 00:00:00 [migration/0]
root 3 1 0 Jan26 ? 00:00:00 [ksoftirqd/0]
root 4 1 0 Jan26 ? 00:00:00 [watchdog/0]
root 5 1 0 Jan26 ? 00:00:00 [events/0]
..... (중략) .....
STEP 6: 다른 사용자의 프로세스 상태도 표시
ps 명령어를 사용하여 다른 사용자의 프로세스 상태도 표시하고자 할 때는 -aux 옵션을 사용합니다. 아래의 명령어는 다른 사용자의 프로세스 상태도 표시하면서 화면에 보이지 않는 프로세스까지 모두 표시하고, 프로세스를 사용한 사용자와 실행 시간까지 표시합니다.
# ps aux | less /* a : 다른 사용자의 프로세스 상태도 표시
x : 화면에 보이지 않는 프로세스까지 모두 표시
u : 프로세스를 사용한 사용자와 실행 시간까지 표시 */
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 2068 576 ? Ss Jan26 0:00 init [5]
root 2 0.0 0.0 0 0 ? S< Jan26 0:00 [migration/0]
root 3 0.0 0.0 0 0 ? SN Jan26 0:00 [ksoftirqd/0]
root 4 0.0 0.0 0 0 ? S< Jan26 0:00 [watchdog/0]
root 5 0.0 0.0 0 0 ? S< Jan26 0:00 [events/0]
..... (중략) .....
위의 명령어들은 ps 명령어를 사용하여 프로세스 상태를 확인하는 방법의 일부입니다.
프로세스 종료 명령어(# kill )
킬(Kill) 명령어는 리눅스와 유닉스 기반 운영체제에서 실행 중인 프로세스를 강제로 종료시키는 명령어입니다. 단, 백그라운드에서 실행 중인 프로세스는 종료시키지 못합니다. 따라서, 이때에는 kill 명령어를 사용하여 프로세스를 종료시킵니다. kill 명령어는 사용자가 프로세스에 일정한 신호를 보내서 프로세스를 종료시키는 명령어입니다. 또한, kill -l 명령을 사용하여 신호의 종류를 확인할 수 있습니다.
[명령어 형식]
# kill PID (# kill -15 PID, # kill -TERM PID)
# kill PID PID PID
# kill -9 PID (# kill -KILL PID)
# kill -2 PID (# kill –INT PID)
자세한 설명은 다음과 같습니다.
킬 명령어는 리눅스와 유닉스 기반 운영체제에서 실행 중인 프로세스를 종료시키는 명령어입니다. 이 명령어는 프로세스를 강제로 종료시킬 수 있는 강력한 도구로, 백그라운드에서 실행 중인 프로세스를도 중지할 수 있습니다.
킬 명령어를 사용하여 프로세스를 종료할 때는 다양한 종류의 시그널(signal)을 사용할 수 있습니다. 이 시그널은 프로세스를 정상적으로 종료시키거나 즉시 종료시키거나, 그 밖의 기능도 수행할 수 있습니다. 대표적인 시그널로는 SIGTERM, SIGKILL, SIGINT 등이 있습니다.
SIGTERM 시그널은 프로세스가 정상적으로 종료되도록 요청하는 시그널입니다. 프로세스가 이 시그널을 받으면 종료하기 전에 필요한 정리 작업을 수행할 수 있는 시간이 주어집니다.
SIGKILL 시그널은 프로세스를 즉시 종료시키는 시그널입니다. 이 시그널을 받은 프로세스는 어떠한 정리 작업도 수행하지 못하고 즉시 종료됩니다.
SIGINT 시그널은 프로세스를 중단시키는 시그널입니다. 이 시그널은 사용자가 Ctrl+C 키 조합을 입력하면 전송됩니다. 프로세스는 이 시그널을 받으면 중단되지만, 즉시 종료되지는 않습니다. 이렇게 하면 프로세스가 종료되기 전에 필요한 정리 작업을 수행할 수 있습니다.
정리하면, 킬 명령어는 실행 중인 프로세스를 종료시키는 강력한 도구입니다. 프로세스를 종료시키는 시그널을 올바르게 사용하는 것이 중요합니다. 이렇게하면 프로세스가 원하는 방식으로 종료됩니다.
■ 시그널(Signal)? 프로세스가 다른 프로세스에게 보내는 비동기적 알림 메세지
시그널(Signal)은 다른 프로세스에게 보내는 비동기적인 알림 메시지입니다. 시그널은 프로세스의 행동을 제어하고, 프로세스 간의 통신을 제공합니다.
일반적으로 많이 쓰이는 시그널(Signal)
시그널 번호 시그널 이름 설 명
1 SIGHUP 프로세스 재시작(HangUp) (EX: # kill -1 450)
2 SIGINT 인터럽트(Interrupt, <Ctrl + C>) (EX: # kill –2 450)
9 SIGKILL 강제 종료(force exit signal) (EX: # kill -9 450)
15 SIGTERM 정상 종료(exit), 기본 시그널 (EX: # kill -15 450)
kill 명령에 아무 신호도 입력하지 않으면 15번 신호인 SIGTERM을 보낸다. (기본값)
# man 7 signal
..... (중략) .....
Signal Value Action Comment
-------------------------------------------------------------------------
SIGHUP 1 Term Hangup detected on controlling terminal
or death of controlling process
SIGINT 2 Term Interrupt from keyboard
SIGQUIT 3 Core Quit from keyboard
SIGILL 4 Core Illegal Instruction
SIGABRT 6 Core Abort signal from abort(3)
SIGFPE 8 Core Floating point exception
SIGKILL 9 Term Kill signal
SIGSEGV 11 Core Invalid memory reference
SIGPIPE 13 Term Broken pipe: write to pipe with no readers
SIGALRM 14 Term Timer signal from alarm(2)
SIGTERM 15 Term Termination signal
SIGUSR1 30,10,16 Term User-defined signal 1
SIGUSR2 31,12,17 Term User-defined signal 2
SIGCHLD 20,17,18 Ign Child stopped or terminated
SIGCONT 19,18,25 Cont Continue if stopped
SIGSTOP 17,19,23 Stop Stop process
SIGTSTP 18,20,24 Stop Stop typed at tty
SIGTTIN 21,21,26 Stop tty input for background process
..... (중략) .....
# kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL
5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE
9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2
13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT
17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU
25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH
29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN
35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4
39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12
47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14
51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10
55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6
59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
시그널은 여러 종류가 있습니다. 일반적으로 많이 쓰이는 시그널은 다음과 같습니다.
- SIGHUP: 프로세스 재시작(HangUp) (예: # kill -1 450)
- SIGINT: 인터럽트(Interrupt, <Ctrl + C>) (예: # kill –2 450)
- SIGKILL: 강제 종료(force exit signal) (예: # kill -9 450)
- SIGTERM: 정상 종료(exit), 기본 시그널 (예: # kill -15 450)
kill 명령에 아무 신호도 입력하지 않으면 15번 신호인 SIGTERM을 보냅니다. (기본값)
시스템에서 사용하는 모든 시그널은 다음과 같이 정의됩니다.
- SIGHUP: 제어 터미널이 끊긴 경우
- SIGINT: 키보드 인터럽트
- SIGQUIT: 키보드에서 Quit 키를 누를 때
- SIGILL: 부적절한 명령어
- SIGABRT: 프로그램에서 abort() 호출한 경우
- SIGFPE: 부동 소수점 연산 오류
- SIGKILL: 프로세스 즉시 종료
- SIGSEGV: 잘못된 메모리 참조
- SIGPIPE: 파이프 쓰기에 대한 읽기 프로세스가 없는 경우
- SIGALRM: alarm()에 의해 설정된 타이머가 만료된 경우
- SIGTERM: 프로세스에게 종료 신호 보내기
- SIGUSR1: 사용자 정의 시그널 1
- SIGUSR2: 사용자 정의 시그널 2
- SIGCHLD: 자식 프로세스가 중지되거나 종료된 경우
- SIGCONT: 중지된 프로세스 계속 실행
- SIGSTOP: 프로세스 일시 중지
- SIGTSTP: tty에서 입력한 정지 문자(Control-Z)
- SIGTTIN: 백그라운드 프로세스에 대한 tty 입력
- SIGWINCH: 창 크기 변경
- SIGSYS: 잘못된 시스템 호출
- SIGURG: Out-of-band 데이터 도착
- SIGPOLL: System V에서 사용
- SIGSTOP: 프로세스 일시 중지
- SIGVTALRM: Virtual alarm clock
- SIGPROF: Profiling timer expired
- SIGXCPU: CPU time limit exceeded
- SIGXFSZ: File size limit exceeded
- SIGIO: I/O now possible
- SIGPWR: Power failure
- SIGSYS: Bad system call
시그널은 다양한 용도로 사용됩니다. 프로세스 간 통신을 제공하거나, 프로그램의 실행을 제어하는 등 다양한 기능을 수행합니다. 따라서, 시그널은 프로그래머가 잘 이해하고 사용해야 합니다.
kill 명령어 실습
위 명령어 실습은 리눅스 서버에서 프로세스를 종료하는 방법을 학습하는 것입니다.
위 명령어 실습에서는 kill 명령어와 systemctl restart 명령어를 사용합니다. kill 명령어는 프로세스를 종료하는데 사용되며, systemctl restart 명령어는 서비스를 재시작하는데 사용됩니다.
kill 명령어는 다음과 같은 형식으로 사용됩니다.
kill [signal] [PID]
여기서, signal은 종료하고자 하는 프로세스를 식별하는 신호입니다. PID는 프로세스 식별 번호입니다.
kill 명령어에 사용할 수 있는 몇 가지 신호(signal)는 다음과 같습니다.
- SIGTERM : 정상적으로 프로세스를 종료합니다.
- SIGKILL : 강제로 프로세스를 종료합니다.
systemctl restart 명령어는 다음과 같이 사용됩니다.
systemctl restart [service]
여기서, service는 재시작하고자 하는 서비스의 이름입니다.
이외에도 killall 명령어도 유용합니다. killall 명령어는 특정 프로세스 이름으로 프로세스를 종료합니다.
killall [process name]
위 명령어 실습에서는 kill 명령어와 systemctl restart 명령어를 사용하여 프로세스와 서비스를 종료하고 재시작하는 방법을 학습합니다. 이를 통해 리눅스 서버에서 프로세스와 서비스를 관리하는 방법을 익힐 수 있습니다.
- postfix 프로세스 확인하기현재 실행중인 postfix 프로세스를 확인할 수 있습니다.
- # ps -ef | grep postfix
- postfix 프로세스 종료하기 2-1. postfix 프로세스 종료하기postfix의 PID를 이용하여 프로세스를 종료할 수 있습니다.
postfix 서비스를 정상적으로 종료하고 다시 실행할 수 있습니다.# systemctl restart postfix
- 2-2. postfix 프로세스 정상 종료하기
- # kill 23476
- postfix 서비스 상태 확인하기postfix 서비스가 현재 실행중인지 확인할 수 있습니다.
- # systemctl status postfix | grep -i active
- postfix 프로세스 다시 확인하기postfix 프로세스가 다시 실행되었는지 확인할 수 있습니다.
- # ps -ef | grep postfix
- postfix 프로세스 강제 종료하기postfix 프로세스를 강제로 종료할 수 있습니다.
- # kill -9 73191
- postfix 프로세스 다시 확인하기postfix 프로세스가 종료되었는지 확인할 수 있습니다.
- # ps -ef | grep postfix
- postfix 서비스 다시 시작하기postfix 서비스를 다시 시작할 수 있습니다.
- # systemctl restart postfix
- postfix 프로세스 다시 확인하기postfix 프로세스가 다시 실행되었는지 확인할 수 있습니다.
- # ps -ef | grep postfix
- postfix 프로세스 재시작하기postfix 프로세스를 재시작할 수 있습니다.
- # kill -1 73446
- postfix 프로세스 다시 확인하기postfix 프로세스가 다시 실행되었는지 확인할 수 있습니다.
- # ps -ef | grep postfix
위와 같이, postfix 프로세스를 관리하는 방법은 여러 가지가 있습니다. 이를 단계적으로 수행하여 원하는 작업을 수행할 수 있습니다. 예를 들어, 프로세스를 종료하거나, 서비스 상태를 확인하거나, 프로세스를 다시 시작하거나, 프로세스를 강제로 종료하거나, 프로세스를 재시작할 수 있습니다. 이러한 각 단계를 수행하여 postfix 프로세스 관리를 쉽게 수행할 수 있습니다.