본문으로 바로가기

목차

    1. kill 명령어

    [사용 형식]
    pid: 프로세스 ID(ps 또는 jobs 명령어를 통해 프로세스 ID를 확인할 수 있습니다.)
    
    1. 시그널을 지정하지 않을 경우 기본 값인 정상 종료(15, SIGTERM) 시그널을 보냅니다.
    # kill [pid]
    
    2. 시그널 지정
    # kill -s [signal id] [pid]
    # kill -s [signal text] [pid]
    # kill -[signal id] [pid]
    # kill -[signal text] [pid]

    • 프로세스에 시그널을 보내 원하는 작업을 하게 하는 명령어

    • 일반적으로 프로세스 종료 명령어로 많이 알려져 있는데 -s 옵션으로 시그널을 지정하지 않으면 기본 시그널 값이 정상종료(SIGTERM,15)이기 때문입니다.

    • 프로세스를 안전하게 종료하기 위해서는 "kill -9 pid", "kill -SIGKILL pid" 형태로 프로세스 강제 종료를 권장하지 않습니다. (데이터 유실 위험)

    • 일반적으로 해당 Process에 문제가 있어서 다시 시작하고자 할 때에는 SIGHUPSIGTERMSIGKILL의 순서로 시도해보길 권장됩니다.

    • kill 명령어는 내부적으로  kill()이란 시스템 콜을 사용하여 구현하고,  프로세스 식별자(PID)로 지시한 프로세스와 프로세스 그룹 식별자(PGID)로 지시한 프로세스 그룹에 시그널을 보냅니다.

     


    2. 시그널

    • 시그널이란 인터럽트의 일종으로 어떤 이벤트의 발생을 프로세스에게 알려주는 것입니다.

    • 특정 이벤트가 발생했을 때 프로세스에게 전달하는 신호(메시지)

    • 리눅스에서 프로세스끼리 통신할 때 사용합니다.

    • 시그널 이벤트로는 HW 예외(나누기 0), SW 상태, 사용자 입력, 시스템 콜(kill) 등이 있습니다.

     

    [리눅스 사용자 입력에 의한 시그널(인터럽트 시그널)]

    리눅스 시그널 인터럽트 시그널 단축키

    2.1. 시그널 종류

    kill -l 명령어를 이용해 사용할 수 있는 시그널을 확인할 수 있습니다.

    • OS 마다 지원 시그널이 다를 수도 있습니다.

    • 시그널은 여러 종류가 있고 각각 번호가 붙어있습니다.

    • SIGUSR1과 SIGUSR2 시그널의 용도는 사용자 정의용입니다.

    # 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
    No    Name         Default Action       Description
    1     SIGHUP       terminate process    terminal line hangup
    2     SIGINT       terminate process    interrupt program
    3     SIGQUIT      create core image    quit program
    4     SIGILL       create core image    illegal instruction
    5     SIGTRAP      create core image    trace trap
    6     SIGABRT      create core image    abort program (formerly SIGIOT)
    7     SIGEMT       create core image    emulate instruction executed
    8     SIGFPE       create core image    floating-point exception
    9     SIGKILL      terminate process    kill program
    10    SIGBUS       create core image    bus error
    11    SIGSEGV      create core image    segmentation violation
    12    SIGSYS       create core image    non-existent system call invoked
    13    SIGPIPE      terminate process    write on a pipe with no reader
    14    SIGALRM      terminate process    real-time timer expired
    15    SIGTERM      terminate process    software termination signal
    16    SIGURG       discard signal       urgent condition present on socket
    17    SIGSTOP      stop process         stop (cannot be caught or ignored)
    18    SIGTSTP      stop process         stop signal generated from keyboard
    19    SIGCONT      discard signal       continue after stop
    20    SIGCHLD      discard signal       child status has changed
    21    SIGTTIN      stop process         background read attempted from control terminal
    22    SIGTTOU      stop process         background write attempted to control terminal
    23    SIGIO        discard signal       I/O is possible on a descriptor (see fcntl(2))
    24    SIGXCPU      terminate process    cpu time limit exceeded (see setrlimit(2))
    25    SIGXFSZ      terminate process    file size limit exceeded (see setrlimit(2))
    26    SIGVTALRM    terminate process    virtual time alarm (see setitimer(2))
    27    SIGPROF      terminate process    profiling timer alarm (see setitimer(2))
    28    SIGWINCH     discard signal       Window size change
    29    SIGINFO      discard signal       status request from keyboard
    30    SIGUSR1      terminate process    User defined signal 1
    31    SIGUSR2      terminate process    User defined signal 2​

    주요 시그널

    2.2. 시그널 핸들러

    시그널 핸들러

    • 프로세스가 특정 시그널을 포착했을 때 수행해야 할 별도의 함수(인터럽트 처리 함수)

    • 프로그램을 개발할 때 시그널 신호를 받을 경우 특정 동작을 정의하는 함수

    • 개발자는 프로그램을 개발할 때 특정 시그널을 수신했을 경우에 실행되기를 바라는 함수 또는 동작(시그널 핸들러)을 정의할 수 있습니다.

    • 시그널 핸들러를 특별히 지정하지 않았을 경우 커널에 기본 정의된 액션(TERM, IGN, CORE, STOP, CONT)을 실행합니다.

    • 예외적으로, 프로세스는 SIGKILL(9)과 SIGSTOP(19)에 대한 처리를 할 수 없도록 되어있습니다.

    • 프로세스를 안전하게 종료하기 위해서는 SIGKILL(9)을 권장하지 않습니다. (해당 프로세스가 시그널 처리 불가능)

    2.3.  SIGKILL(9) vs SIGTERM(15)

    SIGKILL vs SIGTERM

     

    SIGKILL(9)은 개발자가 프로그램을 개발할 때 핸들링을 할 수 없습니다.

     SIGKILL(9)을 이용해 종료할 경우 개발자가 구현한 종료 함수가 호출되지 않고 즉시 프로세스가 종료되어 데이터가 유실되거나 리소스가 제대로 닫히지 않는 문제가 발생할 수도 있습니다.

     SIGTERM(15)나 SIGINT(2)와 같이 종료를 의미하는 signal을 권장하며 제대로 된 프로그램은 보통 cleanup 코드를 수행하고 종료하게 됩니다.

     

     


    3. KILL 사용법

    [사용 예시]
    EX)pid 1
    
    // 시그널을 생략할 경우 기본 시그널 값인 SIGTERM(15)로 적용됩니다.
    # kill 1
    # kill -s 15 1
    
    // SIGTERM 
    # kill -s SIGTERM 1
    
    // SIG를 빼고 입력해도 됩니다.
    # kill -s TERM 1
    
    // -s옵션을 빼고 -시그널번호, -시그널 형태로 사용할 수도 있습니다.
    # kill -15 1
    # kill -SIGTERM 1
    # kill -TERM 1

    3.1. 프로세스 종료

    SIGTERM(15, 정상종료), SIGINT(2, 인터럽트 종료)를 이용합니다.

     위의 방법으로 종료가 되지 않을 경우 SIGKILL(9, 강제 종료)를 이용해 종료합니다.

    1. 테스트를 위해 백그라운드 프로세스 생성
    # sleep 50000 &
    
    2. 프로세스 확인
    # ps -ef | grep sleep | grep -v grep
    root      3267 28331  0 20:25 pts/1    00:00:00 sleep 50000
    
    3. 프로세스 종료
    # kill 3267
    [1]+  종료됨               sleep 50000
    
    4. 프로세스 강제종료 (SIGTERM(15) 종료로 안될경우)
    # kill -9 3267 (강제종료)

     

    [프로세스 이름을 이용해 종료]

    1. 테스트를 위해 백그라운드 프로세스 생성
    # sleep 50001 &
    [1] 4807
    # sleep 50002 &
    [2] 4810
    # sleep 50003 &
    [3] 4812
    # sleep 50004 &
    [4] 4814
    
    2. 프로세스 확인
    # ps -ef | grep sleep | grep -v grep
    root      4807 28331  0 20:49 pts/1    00:00:00 sleep 50001
    root      4810 28331  0 20:49 pts/1    00:00:00 sleep 50002
    root      4812 28331  0 20:49 pts/1    00:00:00 sleep 50003
    root      4814 28331  0 20:49 pts/1    00:00:00 sleep 50004
    
    3. 프로세스 이름을 이용해 프로세스 종료
    3.1. 백틱 (`)사용
    # kill `ps -ef | grep "sleep" | grep -v grep | awk '{print $2}'`
    [1]   종료됨               sleep 50001
    [2]   종료됨               sleep 50002
    [3]-  종료됨               sleep 50003
    [4]+  종료됨               sleep 50004
    
    또는
    3.2. -x 옵션 사용
    # ps -ef | grep "sleep" | grep -v grep | awk '{print "kill "$2}' | sh -x

    3.2. 프로세스 정지 & 재시작

     정지할 경우에는 SIGTSTP(20) 또는 SIGSTOP(19)를 사용합니다.

      (SIGSTOP은 해당 프로세스에서 무시할 수 없습니다.)

     재시작할 경우에는 SIGCONT(18)를 사용합니다.

    1. 테스트를 위해 백그라운드 프로세스 생성
    # sleep 50000 &
    [1] 8048
    
    2. 프로세스 확인
    # ps -ef | grep "sleep 50000" | grep -v grep
    root      8048 28331  0 21:41 pts/1    00:00:00 sleep 50000
    
    3. 프로세스 정지
    # kill -20 8048
    [1]+  Stopped                 sleep 50000
    
    4. 정지 상태 확인
    # jobs
    [1]+  Stopped                 sleep 50000
    
    4. 프로세스 재시작
    # kill -18 8048
    
    5. 프로세스 재동작 확인
    # jobs -l
    [1]+  8048 Running                 sleep 50000 &