[+] update oom_firefox
1. add l keybinding
to change in realtime cgroup max memory limit;
2. make sure keybindings are not working
when a dialog is opened;
3. make sure the app correctly handles Ctrl+C;
4. improve logging format, include a timestamp
and line locatin;
This commit is contained in:
parent
c0125914d2
commit
0c581d6f5c
@ -5,7 +5,7 @@ project(
|
||||
).stdout().strip('\n'),
|
||||
# 'online.fxreader.uv',
|
||||
# ['c', 'cpp'],
|
||||
version: '0.1.5.44',
|
||||
version: '0.1.5.54',
|
||||
# default_options: [
|
||||
# 'cpp_std=c++23',
|
||||
# # 'prefer_static=true',
|
||||
|
||||
@ -13,8 +13,9 @@ import re
|
||||
import sys
|
||||
|
||||
from prompt_toolkit.application import Application
|
||||
from prompt_toolkit.key_binding import KeyBindings
|
||||
from prompt_toolkit.key_binding import KeyBindings, ConditionalKeyBindings
|
||||
from prompt_toolkit.layout import Layout, HSplit, FloatContainer, Float
|
||||
from prompt_toolkit.filters import Condition
|
||||
from prompt_toolkit.layout.containers import Window
|
||||
from prompt_toolkit.layout.controls import FormattedTextControl
|
||||
from prompt_toolkit.widgets import TextArea, Frame, Dialog, Button, Label
|
||||
@ -23,6 +24,7 @@ from prompt_toolkit.styles import Style
|
||||
from typing import (
|
||||
TypedDict,
|
||||
Any,
|
||||
Optional,
|
||||
)
|
||||
from collections import OrderedDict
|
||||
|
||||
@ -34,7 +36,7 @@ __created__ = '2025-11-21'
|
||||
# — Helper for cgroup / slice matching —
|
||||
|
||||
|
||||
def get_cgroup_path(pid):
|
||||
def get_cgroup_path(pid: int) -> Optional[str]:
|
||||
try:
|
||||
with open(f'/proc/{pid}/cgroup', 'r') as f:
|
||||
for line in f:
|
||||
@ -264,6 +266,12 @@ def main():
|
||||
|
||||
logging.basicConfig(
|
||||
level=logging.INFO,
|
||||
format=(
|
||||
'%(asctime)s '
|
||||
'%(levelname)-8s '
|
||||
'%(filename)s:%(lineno)d '
|
||||
'%(funcName)s – %(message)s'
|
||||
),
|
||||
handlers=[
|
||||
logging.handlers.RotatingFileHandler(
|
||||
pathlib.Path('~/.cache/oom_firefox/log').expanduser(),
|
||||
@ -348,8 +356,8 @@ def main():
|
||||
pass
|
||||
# app.exit()
|
||||
|
||||
# signal.signal(signal.SIGINT, lambda s, f: terminate())
|
||||
# signal.signal(signal.SIGTERM, lambda s, f: terminate())
|
||||
signal.signal(signal.SIGINT, lambda s, f: terminate())
|
||||
signal.signal(signal.SIGTERM, lambda s, f: terminate())
|
||||
|
||||
def refresh_body():
|
||||
nonlocal firefox_proc
|
||||
@ -397,8 +405,12 @@ def main():
|
||||
|
||||
def on_ok():
|
||||
txt = ta.text
|
||||
for m in re.finditer(r'\((\d+)\)', txt):
|
||||
for m in re.finditer(r'\((\d+)[^\)\d]*\)', txt):
|
||||
low_priority_pids.add(int(m.group(1)))
|
||||
for m in re.finditer(r'^\s*(\d+)\s*$', txt):
|
||||
low_priority_pids.add(int(m.group(1)))
|
||||
for m in re.finditer(r'^\s*-(\d+)\s*$', txt):
|
||||
low_priority_pids.remove(int(m.group(1)))
|
||||
close_dialog()
|
||||
refresh_body()
|
||||
|
||||
@ -420,6 +432,63 @@ def main():
|
||||
root_floats.append(f)
|
||||
app.layout.focus(ta)
|
||||
|
||||
def change_max_mb(max_mb: int) -> None:
|
||||
for cmd in (
|
||||
[
|
||||
'systemctl',
|
||||
'--user',
|
||||
'set-property',
|
||||
'%s.scope' % args.unit_name,
|
||||
'MemoryHigh=%dM' % max_mb,
|
||||
],
|
||||
[
|
||||
'systemctl',
|
||||
'--user',
|
||||
'set-property',
|
||||
'%s.scope' % args.unit_name,
|
||||
'MemoryMax=%dM' % (max_mb * 1.1),
|
||||
],
|
||||
):
|
||||
logger.info(dict(cmd=cmd))
|
||||
|
||||
subprocess.check_call(cmd)
|
||||
|
||||
args.max_mb = max_mb
|
||||
|
||||
def open_limit_dialog():
|
||||
ta = TextArea(text='', multiline=True, scrollbar=True)
|
||||
|
||||
def on_ok():
|
||||
txt = ta.text
|
||||
m = re.compile(r'^\s*(\d+)\s*$').match(txt)
|
||||
|
||||
a: str = 234234
|
||||
if m:
|
||||
change_max_mb(int(m[1]))
|
||||
|
||||
close_dialog()
|
||||
refresh_body()
|
||||
else:
|
||||
logger.error('invalid input %s' % txt)
|
||||
|
||||
def on_cancel():
|
||||
close_dialog()
|
||||
|
||||
dialog = Dialog(
|
||||
title='Enter maximum memory threshold in MB',
|
||||
body=ta,
|
||||
buttons=[
|
||||
Button(text='OK', handler=on_ok),
|
||||
Button(text='Cancel', handler=on_cancel),
|
||||
],
|
||||
width=60,
|
||||
modal=True,
|
||||
)
|
||||
f = Float(content=dialog, left=2, top=2)
|
||||
dialog_float[0] = f
|
||||
root_floats.append(f)
|
||||
app.layout.focus(ta)
|
||||
|
||||
def open_message(title, message):
|
||||
def on_close():
|
||||
close_dialog()
|
||||
@ -445,6 +514,11 @@ def main():
|
||||
|
||||
kb = KeyBindings()
|
||||
|
||||
gkb = ConditionalKeyBindings(
|
||||
key_bindings=kb,
|
||||
filter=Condition(lambda: dialog_float[0] is None),
|
||||
)
|
||||
|
||||
@kb.add('q')
|
||||
def _(event):
|
||||
terminate()
|
||||
@ -453,9 +527,18 @@ def main():
|
||||
def _(event):
|
||||
open_pid_dialog()
|
||||
|
||||
@kb.add('l')
|
||||
def _(event):
|
||||
open_limit_dialog()
|
||||
|
||||
HELP_TEXT = 'm=add PIDs, l=change limit, s=settings, a=about, q=quit'
|
||||
|
||||
@kb.add('h')
|
||||
def _(event):
|
||||
open_message('Help', 'Keys: m=add PIDs, s=settings, a=about, q=quit')
|
||||
open_message(
|
||||
'Help',
|
||||
'Keys: %s' % HELP_TEXT,
|
||||
)
|
||||
|
||||
@kb.add('s')
|
||||
def _(event):
|
||||
@ -479,7 +562,7 @@ def main():
|
||||
Window(
|
||||
height=1,
|
||||
content=FormattedTextControl(
|
||||
'q=quit, m=PID, h=help, s=setting, a=about'
|
||||
HELP_TEXT,
|
||||
),
|
||||
),
|
||||
]
|
||||
@ -498,7 +581,7 @@ def main():
|
||||
|
||||
app = Application(
|
||||
layout=Layout(root),
|
||||
key_bindings=kb,
|
||||
key_bindings=gkb,
|
||||
style=style,
|
||||
full_screen=True,
|
||||
refresh_interval=args.interval,
|
||||
@ -531,7 +614,7 @@ def main():
|
||||
|
||||
# refresh_body()
|
||||
app.run(
|
||||
handle_sigint=True
|
||||
# handle_sigint=True
|
||||
) # from prompt‑toolkit API :contentReference[oaicite:0]{index=0}
|
||||
|
||||
t.join()
|
||||
|
||||
@ -144,6 +144,7 @@ include = [
|
||||
#'../../../../../follow_the_leader/logic/payments.py',
|
||||
#'../../../../../follow_the_leader/logic/paypal.py',
|
||||
'online/fxreader/pr34/commands_typed/**/*.py',
|
||||
#'online/fxreader/pr34/oom_firefox.py',
|
||||
]
|
||||
# stubPath = '../mypy-stubs'
|
||||
extraPaths = [
|
||||
|
||||
BIN
releases/whl/online_fxreader_pr34-0.1.5.45-py3-none-any.whl
(Stored with Git LFS)
Normal file
BIN
releases/whl/online_fxreader_pr34-0.1.5.45-py3-none-any.whl
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
releases/whl/online_fxreader_pr34-0.1.5.47-py3-none-any.whl
(Stored with Git LFS)
Normal file
BIN
releases/whl/online_fxreader_pr34-0.1.5.47-py3-none-any.whl
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
releases/whl/online_fxreader_pr34-0.1.5.48-py3-none-any.whl
(Stored with Git LFS)
Normal file
BIN
releases/whl/online_fxreader_pr34-0.1.5.48-py3-none-any.whl
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
releases/whl/online_fxreader_pr34-0.1.5.49-py3-none-any.whl
(Stored with Git LFS)
Normal file
BIN
releases/whl/online_fxreader_pr34-0.1.5.49-py3-none-any.whl
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
releases/whl/online_fxreader_pr34-0.1.5.50-py3-none-any.whl
(Stored with Git LFS)
Normal file
BIN
releases/whl/online_fxreader_pr34-0.1.5.50-py3-none-any.whl
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
releases/whl/online_fxreader_pr34-0.1.5.51-py3-none-any.whl
(Stored with Git LFS)
Normal file
BIN
releases/whl/online_fxreader_pr34-0.1.5.51-py3-none-any.whl
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
releases/whl/online_fxreader_pr34-0.1.5.52-py3-none-any.whl
(Stored with Git LFS)
Normal file
BIN
releases/whl/online_fxreader_pr34-0.1.5.52-py3-none-any.whl
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
releases/whl/online_fxreader_pr34-0.1.5.53-py3-none-any.whl
(Stored with Git LFS)
Normal file
BIN
releases/whl/online_fxreader_pr34-0.1.5.53-py3-none-any.whl
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
releases/whl/online_fxreader_pr34-0.1.5.54-py3-none-any.whl
(Stored with Git LFS)
Normal file
BIN
releases/whl/online_fxreader_pr34-0.1.5.54-py3-none-any.whl
(Stored with Git LFS)
Normal file
Binary file not shown.
Loading…
Reference in New Issue
Block a user