2021. 8. 17. 14:54ㆍLinux
이번 시간에는 프로세스 종료하는 법과 제어하는 법, 그리고 종류에 대해 알아보겠습니다.
1. 프로세스 종료(kill)
kill 명령어와 함께 종료하고자 하는 PID를 입력하면 종료가 됩니다.
sleep 100은 100초가 지나면 자동으로 종료가 되지만 미리 종료 시키보겠습니다. PID가 3229이므로 kill 3229로 종료시킬수 있습니다.
정상적으로 종료된것을 확인 할 수 있습니다. 이번엔 csh 쉘를 종료시켜보겠습니다.
프로세스들의 PID, PPID가 계속 바뀌는 이유는 제가 실습 도중 다시 실행시키는 경우가 있기 때문입니다. 이점 인지해주시길 바랍니다
??? 종료가 안된것을 확인 할 수 있었습니다. 이런 경우가 종종 발생합니다. 이럴때는 시그널 번호를 사용해서 종료하면 됩니다.
시그널(signal)
-l 옵션을 주면 시그널의 숫자와 이름이 출력됩니다. root 계정으로 확인해야 볼 수 있습니다.
여기서는 kill 명령어와 제일 많이 사용되는 세가지만 알아보겠습니다. signal에 대해 자세히 알고 싶으신 분들은 다음 링크를 클릭해 주시길 바랍니다. 리눅스의 개요 - 시그널이란? (tistory.com)
-1 : SIGHUP : HangUP의 약어로 변경된 내용을 적용시키기 위해 재시작할때 이 시그널을 사용합니다.
csh과 같이 종료를 시켰는데 적용이 안된 경우에도 사용하면 정상적으로 종료가 됩니다.
-9 : SIGKILL : 강제 종료, 프로세스를 강제 종료시킬때 이 시그널을 사용합니다.
csh과 같이 종료가 안될때 강제 종료 시그널을 사용해서 종료 시킬 수 있습니다.
-15 : SIGTERM : terminate의 약자로 정상 종료시킬 때 사용하며 기본 값이기 때문에 생략이 가능합니다.
백그라운드로 실행되는 프로세스들은 그룹 번호로도 종료 시킬 수 있습니다.
kill %작업번호를 사용해서 종료를 시킬 수 있습니다. jobs %작업번호를 사용해서 원하는 프로세스만 조회하는 것도 가능합니다. (%에 작업번호가 가려 잘 안보일수 있습니다)
작업번호 없이 %만 사용해서 jobs나 kill 명령어를 사용하면 가장 최근에 실행된 프로세스가 조회되거나 종료됩니다. 가장 최근에 실행된 프로세스는 작업번호 다음에 + 가 붙어 있다고 배웠습니다. 직접 해보겠습니다.
sleep 400이 종료 되었으니 +가 붙어 있는 프로세스는 sleep 300일 것입니다. 그럼 jobs %를 통해 sleep 300을 조회 할 수 있고 kill % 를 통해 sleep 300을 종료시킬 수 있는 것입니다.
2. 프로세스 종류
좀비 프로세스 : 프로세스는 부모 자식 관계를 가지고 있습니다. 프로세스는 종료가 되어도 바로 메모리에서 사라지지 않습니다. 종료가 되면 우선 부모 프로세스에게 자식 프로세스가 종료되었다고 신호를 보냅니다. 그럼 부모 프로세스는 wait() 를 실행시켜 자식 프로세스가 정상적으로 종료되었는지 확인 후 종료되었으면 메모리에서 제거합니다. 하지만 부모 프로세스의 프로그래밍 오류로 인해 wait()를 실행 시키지 못하는 경우가 있습니다. 이런 경우 프로세스는 종료가 되었어도 메모리에서 제거되지 않게 됩니다. 이런 프로세스를 좀비 프로세스라고 합니다.
즉 좀비 프로세스는 부모 프로세스의 오류로 인해 실제로는 종료되어 실행되고 있지 않지만 메모리 상에서 제거되지 않는 프로세스입니다.
좀비 프로세스는 PID를 가지게 됩니다. 하지만 리눅스 시스템은 한정된 PID를 가집니다. 즉 좀비 프로세스가 계속 누적되면 나중에 실행되어야 할 프로그램에 PID를 할당해줄수 없어 문제가 발생하게 됩니다.
그럼 좀비 프로세스를 제거하려면 어떻게 해야 할까요?
두가지 방법이 있습니다
첫번째는 부모 프로세스에 SIGCHLD 시그널을 보내는 것입니다. 이 신호를 부모 프로세스가 받으면 wait()를 실행시켜 좀비 프로세스를 없애줍니다. 하지만 부모 프로세스가 프로그래밍상 오류가 난 상태라면 SIGCHLD 시그널을 무시할 것입니다.
두번째 방법은 부모 프로세스를 제거하는 것입니다. 부모 프로세스를 제거하면 자식 프로세스는 부모가 사라지게됩니다. 이를 고아 프로세스라고 합니다. 부모 프로세스가 사라진 고아 프로세스들은 init 프로세스를 새로운 부모 프로세스로 인식을 합니다. 즉 init 프로세스는 자식 프로세스를 상속받게 되는 것입니다 이는 직접 보여드리겠습니다
sleep 100의 부모 프로세스는 csh쉘입니다. csh쉘를 종료했더니 sleep 100의 부모 프로세스가 PID 1 init 프로세스로 바뀐것을 확인 할 수 있습니다.
init 프로세스가 정상적인 오류가 없는 프로세스라면 좀비 프로세스들을 상속 받은뒤 wait()를 실행하여 좀비 프로세스들을 제거할 것입니다.
3. 프로세스 제어
프로세스는 중지, 전환을 할 수 있습니다.
중지 : 말그대로 프로세스를 중지하겠다는 것입니다. 포그라운드와 백그라운드 어디에서 실행되는 프로세스냐에 따라 중지하는 방법이 다릅니다.
포그라운드는 Ctrl + z 를 하면 중지가 되며 작업번호를 받은 상태로 jobs 명령어를 통해 확인 할 수 있는 상태가 됩니다.
백그라운드에서의 중지를 할려면 전환부터 먼저 배워야합니다.
전환
백그라운드 -> 포그라운드 fg % 작업번호
포그라운드 -> 백그라운드 bg % 작업번호
작업번호 앞에 +가 붙어 있으면 fg, bg 명령어만 사용해도 전환이 됩니다.
백그라운드에서는 중지를 할 수 없기 때문에 포그라운드로 전환후 Ctrl + z를 사용해서 중지를 해야 합니다
위와 같이 백그라운드에서 포그라운드로의 전환은 jobs 명령어로 포그라운드로 변경하고자 하는 프로세스의 작업번호를 얻고 fg %작업번호를 입력하면 됩니다.
포그라운드에서 백그라운드로의 전환은 ctrl + z 로 우선 정지시킨후 bg 명령어를 사용하면 됩니다.
만약 정지된 프로세스가 많은 상황에서 원하는 프로세스만 백그라운드로 전환 시킬려고 한다면 bg 뒤에 %작업번호를 사용해야 하지만 작업중인 프로세스를 바로 백그라운드로 전환 시키는 경우는 위에서 처럼 중지 시킨뒤 bg 명령만으로 바로 백그라운드로 전환 시킬 수 있습니다.
이상으로 프로세스의 종료, 종류, 제어에 대해 알아보았습니다. 다음 시간에는 데몬 프로세스에 대해 알아보도록 하겠습니다
다음 내용
'Linux' 카테고리의 다른 글
Linux - Run Level (0) | 2021.08.19 |
---|---|
Linux - 프로세스 - 3 (데몬 프로세스) (0) | 2021.08.17 |
Linux - 프로세스 - 1 (정의) (0) | 2021.08.16 |
Linux - locate & find (0) | 2021.08.10 |
Linux - grep & 정규 표현식 (1) | 2021.08.08 |