일요일, 6월 18, 2006

[UNIX]kill 커맨드에 관해서

리눅스에서 프로세스관리는 시그널로 이루어 집니다.
시그널, 우리말 신호로 그냥 이해하셔도 됩니다.
프로세스와 프로세스간에는 시그널을 통해서 여러가지 일을 하게 됩니다.
시그널에는 여러가지 종류가 있습니다.
#kill -l
하시면 시그널의 종류를 알수 있습니다.
보면 번호가 있고 무슨 시그널인지 나옵니다. 각 시그널에는 의미가 다 있습니다.
거기서 프로세스 종료에 관해서 가장 많이 쓰이는 것이 15번과 9번입니다.
15번은 SIGTERM이라고 해서 TERM(텀) 시그널이라고 합니다. 그리고 kill 명령에서 옵션없이 PID만 줬을때 프로세스에 전달되는 시그널이 바로 TERM시그널입니다.
그래서 디폴트 시그널이라고 말하기도 합니다.
TERM 시그널은 받은 프로세스는 자신이 하던 작업을 모두 종료하는 절차를 실행합니다. 메모리상에 있던 데이터를 안전하게 저장하고 각종 환경설정파일도 안전하게 저장합니다. 그런다음에 프로세스는 소멸됩니다.
하지만 9번의 KILL 시그널은 이러한 과정이 없이 리눅스 커널이 바로 프로세스를 강제 종료 시켜버립니다. 'kill -9'가 KILL 시그널을 보내게 됩니다. KILL 시그널을 받은 프로세스는 하던 작업을 저장할 겨를이 없이 바로 소멸되게 되어 메모리상의 데이터도 모두 소멸되게 되어 중요한 데이터를 잃어버리게 됩니다.
프로세스를 터미네이팅(terminating)하는 것과 킬(kill)하는 것은 전혀 다른 겁니다.

2.
프로세는 트리구조를 가집니다. 부모와 자식 관계를 가지고 있죠. 어떤 프로그램을 실행하게 되면 부모프로세스를 바탕으로 자식프로세스를 복제하게 됩니다.
따라서 위의 님의 질문에서 둘과의 관계가 부모와 자식의 관계있다면 부모를 죽였을경우 그 부모와 함께 자식프로세스도 모두 종료가 되고 자식을 죽였을 경우에는 자식 프로세스만 종료가 됩니다.

3.Ctrl+z를 누르면 실행중인 작업이 중지(stop)가 되면서 쉘로 돌아옵니다. 거기서 jobs명령을 이용해서 보면 실행상태를 알수가 있죠. 이것을 백그라운드 모드로 변경할수도 있고 포그라운드로 계속이어서 할수 있습니다.
jobs 출력 내용의 번호를 인자로 사용해서 백그라운드 전환은 bg [번호], 포그라운드는 fg [번호]를 사용하시면 됩니다.
처음부터 백그라운드 작업을 원하신다면 명령어 뒤에 &를 붙여서 실행하시면 됩니다.

0 Comments:

댓글 쓰기

<< Home