Firefox의 IPython Notebook에서 실행중인 셀을 끊는 CTRL + C와 동일한 기능이 있습니까?


100

저는 IPython 노트북을 사용하기 시작했고 즐기고 있습니다. 때로는 엄청난 메모리가 필요하거나 무한 루프가있는 버그가있는 코드를 작성합니다. "인터럽트 커널"옵션이 느리거나 불안정하다는 것을 알게되었고 때로는 커널을 다시 시작해야해서 메모리의 모든 것이 손실됩니다.

또한 가끔 OS X의 메모리 부족을 유발하는 스크립트를 작성하고 하드 재부팅을해야합니다. 100 % 확실하지는 않지만 이전에 이와 같은 버그를 작성하고 터미널에서 Python을 실행했을 때 일반적으로 CTRL+ C스크립트를 작성할 수 있습니다 .

Mac OS X에서 Firefox와 함께 IPython 노트북의 Anaconda 배포판을 사용하고 있습니다.


1
cntrl + mi 단축키 또는 0.13의 커널> 인터럽트 드롭 다운 (MacOSX의 아나콘다 기본값)을 통해 무한 루프를 중단하는 데 성공한 적이 없습니다. 이 문제는 1.0에서 수정 된 것 같습니다.
KLDavenport 2013 년

답변:


55

내가 틀렸을 수도 있지만, "커널 인터럽트"버튼은 현재 실행중인 코드에 SIGINT 신호를 보내는 것으로 확신합니다 (이 아이디어는 여기 에있는 Fernando의 주석에 의해 지원됨 ). CTRL + C가 가능합니다. 파이썬 내의 일부 프로세스는 다른 프로세스보다 SIGINT를 더 갑작스럽게 처리합니다.

iPython Notebook에서 실행중인 것을 중단해야하고 터미널에서 iPython Notebook을 시작한 경우 해당 터미널에서 CTRL + C를 두 번 눌러 전체 iPython Notebook 서버를 중단 할 수 있습니다. 이렇게하면 iPython Notebook이 모두 중지됩니다. 즉, 작업을 다시 시작하거나 저장할 수 없기 때문에 이는 분명히 훌륭한 솔루션이 아닙니다 (안전 기능이므로 Ctrl + C를 두 번 눌러야합니다. 우연히하십시오). 그러나 긴급 상황의 경우 일반적으로 "커널 인터럽트"버튼보다 프로세스를 더 빨리 종료합니다.


13
또는 문제가되는 커널을 다시 시작하거나 중지 할 수 있습니다. ipython 서버를 종료하는 것보다 덜 강력합니다. Kernel드롭 다운 또는 노트북 서버 페이지 ( Shutdown문제를 일으키는 노트북 이름 오른쪽에있는 버튼) 에서이 작업을 수행 할 수 있습니다 .
drevicko 2013 년

1
불행히도 브라우저가 너무 응답하지 않아 서버 페이지에 도달하기가 어려울 수 있습니다.
K.-Michael Aye

프로세스를 중단하는 방법이 jupyter-console있습니까? II / control-c가 작동하지 않습니다. 그리고 커널을 다시 시작하는 다른 지름길은 없습니다.
alpha_989

75

I두 번 눌러 커널을 중단 할 수 있습니다 .

이것은 명령 모드에있는 경우에만 작동합니다. 아직 활성화되지 않은 경우 활성화 Esc하려면 누릅니다 .


IPython의 특정 버전 범위 또는 특정 OS 용입니까?
그렉

6

다음 은 IPython 노트북의 바로 가기입니다.

Ctrl-m i커널을 중단합니다. (즉, 다음의 유일한 문자 i Ctrl-m)

답변 에 따르면 I두 번도 작동합니다.


5

위에 추가하려면 : 인터럽트가 작동하지 않으면 커널을 다시 시작할 수 있습니다.

커널 드롭 다운 >> 다시 시작 >> 다시 시작 및 출력 지우기로 이동합니다. 이것은 일반적으로 트릭을 수행합니다. 그래도 작동하지 않으면 터미널 (또는 작업 관리자)에서 커널을 종료 한 다음 다시 시작하십시오.

인터럽트는 모든 프로세스에서 잘 작동하지 않습니다. 특히 R 커널을 사용하면이 문제가 발생합니다.


이 트릭이 나를 위해 해냈습니다. 20 억 항목의 멀티 코어 kmeans 클러스터링으로 인해 완전히 응답하지 않는 Jupyter 노트북 (이전에 알고 있어야 함)
Alex

3

업데이트 : 내 솔루션을 독립 실행 형 파이썬 스크립트로 바꿨습니다.

이 솔루션은 저를 두 번 이상 구했습니다. 다른 사람들이 유용하다고 생각하기를 바랍니다. 이 Python 스크립트는 cpu_thresholdCPU 이상을 사용하는 모든 jupyter 커널을 찾고 사용자에게 SIGINT커널 (KeyboardInterrupt) 을 보내도록 프롬프트합니다 . SIGINT커널의 CPU 사용량이 아래로 떨어질 때까지 계속 전송 합니다 cpu_threshold. 오작동하는 커널이 여러 개있는 경우 각 커널을 중단하라는 메시지가 표시됩니다 (가장 높은 CPU 사용량에서 가장 낮은 것 순으로 정렬 됨). jupyter api를 사용하여 jupyter 커널의 이름을 찾는 코드를 작성 해준 gcbeltramini 에게 큰 감사를드립니다 . 이 스크립트는 python3을 사용하는 MACOS에서 테스트되었으며 jupyter 노트북, 요청, json 및 psutil이 필요합니다.

스크립트를 홈 디렉토리에 넣으면 사용법은 다음과 같습니다.

python ~/interrupt_bad_kernels.py
Interrupt kernel chews cpu.ipynb; PID: 57588; CPU: 2.3%? (y/n) y

아래 스크립트 코드 :

from os import getpid, kill
from time import sleep
import re
import signal

from notebook.notebookapp import list_running_servers
from requests import get
from requests.compat import urljoin
import ipykernel
import json
import psutil


def get_active_kernels(cpu_threshold):
    """Get a list of active jupyter kernels."""
    active_kernels = []
    pids = psutil.pids()
    my_pid = getpid()

    for pid in pids:
        if pid == my_pid:
            continue
        try:
            p = psutil.Process(pid)
            cmd = p.cmdline()
            for arg in cmd:
                if arg.count('ipykernel'):
                    cpu = p.cpu_percent(interval=0.1)
                    if cpu > cpu_threshold:
                        active_kernels.append((cpu, pid, cmd))
        except psutil.AccessDenied:
            continue
    return active_kernels


def interrupt_bad_notebooks(cpu_threshold=0.2):
    """Interrupt active jupyter kernels. Prompts the user for each kernel."""

    active_kernels = sorted(get_active_kernels(cpu_threshold), reverse=True)

    servers = list_running_servers()
    for ss in servers:
        response = get(urljoin(ss['url'].replace('localhost', '127.0.0.1'), 'api/sessions'),
                       params={'token': ss.get('token', '')})
        for nn in json.loads(response.text):
            for kernel in active_kernels:
                for arg in kernel[-1]:
                    if arg.count(nn['kernel']['id']):
                        pid = kernel[1]
                        cpu = kernel[0]
                        interrupt = input(
                            'Interrupt kernel {}; PID: {}; CPU: {}%? (y/n) '.format(nn['notebook']['path'], pid, cpu))
                        if interrupt.lower() == 'y':
                            p = psutil.Process(pid)
                            while p.cpu_percent(interval=0.1) > cpu_threshold:
                                kill(pid, signal.SIGINT)
                                sleep(0.5)

if __name__ == '__main__':
    interrupt_bad_notebooks()
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.