연습 - 잘못 동작하는 프로세스 종료

완료됨

컴퓨터는 완벽하지 않습니다. 때때로 문제가 발생할 수 있습니다. sysadmin으로 작업을 처리하는 이유가 바로 이런 이유 때문입니다. 사용자가 직접 문제를 해결하고 시스템 문제를 수정해야 합니다.

Python 애플리케이션으로 인해 문제가 발생한다고 가정해 보겠습니다. 너무 많은 CPU 시간을 사용하고 있거나 응답을 중지했을 수도 있습니다. 두 경우 모두 애플리케이션을 중지하는 것이 바람직할 수 있습니다. 프로세스나 애플리케이션을 식별하기 위해 psgrep을 사용할 수 있습니다. 그런 다음, kill 명령을 사용하여 중지할 수 있습니다. Linux 가상 머신에서 이 작업을 연습해 보겠습니다.

잘못 동작하는 프로세스 시작

프로세스를 중지하려면 중단할 프로세스가 필요합니다. 하나를 만들어 보겠습니다.

  1. 다음 명령을 입력하여 홈 기반으로 돌아갑니다.

    cd ~
    
  2. Azure Cloud Shell에서 다음 명령을 입력하여 Linux의 vi 편집기를 시작합니다.

    vi bad.py
    

    vi는 Linux가 Unix에서 나온 널리 사용되는 텍스트 편집기입니다. Bash 사용자는 vi의 기본 사항을 잘 이해할 필요가 있습니다.

  3. i 키를 선택하여 vi를 삽입 모드로 전환합니다. 그런 후에 다음 Python 프로그램을 입력합니다.

    i = 0
    while i == 0:
        pass
    

    이 프로그램은 실행 시 무한 루프로 실행되므로 서버에서는 실행하지 않는 것이 좋을 것입니다.

  4. Esc 키를 선택하여 삽입 모드를 종료합니다. 그런 후 다음 명령을 입력하고 Enter 키를 눌러 프로그램을 저장한 후 vi를 종료합니다.

    :wq
    

    명령의 시작 부분에 콜론을 포함해야 합니다. 명령의 나머지 부분에서 w는 “write”를 나타내고 q는 “quit”을 나타냅니다.

  5. 이제 다음 명령을 사용하여 프로그램을 시작하고 백그라운드에서 실행 상태로 둡니다.

    python3 bad.py &
    

    명령 끝에 앰퍼샌드(&)를 포함해야 합니다. 그러지 않으면 Bash 프롬프트로 복귀되지 않습니다. Bash에서 앰퍼샌드는 명령을 실행하며, 명령이 실행을 완료하지 않은 경우에도 명령줄로 돌아갑니다.

분명한 것은 아니지만 bad.py는 현재 백그라운드에서 실행되며 다른 프로세스의 CPU 주기를 도용하고 있습니다. 무슨 일이 발생하는지 자세히 살펴보겠습니다.

프로세스 종료

프로세스를 종료하려면 프로세스 이름이나 프로세스 ID가 필요합니다. ps에 대한 작업입니다.

  1. 메모리를 새로 고치기 위해 ps -ef 명령은 실행 중인 모든 프로세스를 나열하고 각 프로세스와 관련한 많은 정보를 표시합니다. 다음 명령을 사용하여 실행 중인 모든 프로세스를 나열하고 결과를 “python”을 포함하는 줄로 필터링합니다.

    ps -ef | grep python
    

    결과는 다음과 같이 표시되어야 합니다.

    yourname+    342    254 99 23:34 pts/1    00:00:31 python3 bad.py
    yourname+    344    254  0 23:35 pts/1    00:00:00 grep --color=auto python
    
  2. 목록에서 보면 bad.py는 서버 CPU 시간의 99%를 사용하는 것으로 나타납니다. 이 프로그램은 이름에 맞는 결과를 가져옵니다.

    kill 명령은 프로세스 ID를 기준으로 실행 중인 프로세스를 종료합니다. killall이라는 관련 명령은 프로세스 이름을 기준으로 프로세스를 종료합니다. kill을 호출하는 경우 프로세스를 종료하는 데 사용할 “신호” 종류를 결정해야 합니다. 다음 명령을 사용하여 신호 유형 목록을 표시합니다.

    kill -l
    
  3. 백그라운드에서 실행되고 운영 체제에 중요한 서비스를 제공하는 디먼 프로세스를 종료하려면 종료했다가 즉시 다시 시작하는 것이 좋습니다. 이렇게 하려면 SIGHUP 신호를 사용할 수 있습니다.

    이 예제에서는 해당 프로세스를 종료한 후 다시 시작하지 않으려고 합니다. 따라서 숫자 9에 해당하는 SIGKILL 신호를 사용할 수 있습니다. 이렇게 하려면 ps -ef 출력(두 번째 열)에서 bad.py의 프로세스 ID를 가져온 후 다음 명령을 사용하여 프로세스를 종료합니다. PROCESS_ID를 프로세스 ID로 바꿉니다.

    kill -9 PROCESS_ID
    

    동일한 명령을 kill -s SIGKILL PROCESS_ID로 입력할 수도 있습니다. 신호의 이름을 사용할지 또는 숫자를 사용할지는 사용자에게 달려 있습니다.

  4. 마지막으로 ps를 다시 실행하여 bad.py가 이제 실행되지 않는지 확인합니다.

pskill의 또 다른 일반적인 용도는 잘못 작성된 프로그램에 의해 남겨진 자식 프로세스인 “좀비 프로세스”를 식별하고 종료하는 것입니다.