GÜNCELLEME : Çözümümü bağımsız bir python betiğine dönüştürdüm.
Bu çözüm beni bir kereden fazla kurtardı. Umarım diğerleri onu yararlı bulur. Bu python betiği, CPU'dan daha fazlasını kullanan herhangi bir jupyter çekirdeğini bulur cpu_threshold
ve kullanıcıdan SIGINT
çekirdeğe (KeyboardInterrupt) bir tane göndermesini ister . SIGINT
Çekirdeğin cpu kullanımı aşağı inene kadar göndermeye devam edecektir cpu_threshold
. Birden fazla hatalı çalışan çekirdek varsa, kullanıcıdan her birini kesmesini isteyecektir (en yüksek CPU kullanımına göre en düşük seviyeye doğru sıralanır). Jupyter api'sini kullanarak bir jupyter çekirdeğinin adını bulmak için kod yazdığı için gcbeltramini'ye çok teşekkür ederiz . Bu betik, MACOS üzerinde python3 ile test edilmiştir ve jupyter not defteri, istek, json ve psutil gerektirir.
Komut dosyasını ana dizininize koyun ve ardından kullanım şöyle görünür:
python ~/interrupt_bad_kernels.py
Interrupt kernel chews cpu.ipynb; PID: 57588; CPU: 2.3%? (y/n) y
Aşağıdaki komut dosyası kodu:
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()