ð§ RSSã«ã¯æ ããªãå§çž®ã¡ã¢ãªç匟ãèªåã§åã
SNSã®èªåæçš¿ã1æ¥ãŸãããšãŒãä»¶ã«ãªã£ããã®æ¥ãããMacã®ã¡ã¢ãªç£èŠã«å¯Ÿããèãæ¹ãæ ¹æ¬ããå€ãããŸããã
ãªããã®ä»çµã¿ãå¹ãã®ã
ãRSSãæ£åžžãªã®ã«æ»ãã§ããããšããççŸ
2026幎8æ9æ¥ã皌å21æéç®ã®Macã§ç°å€ãèµ·ããŸãããClaude CodeãåããèªåSNSæçš¿ãšãŒãžã§ã³ãããã±ãããšæ¢ãŸããŸãããPlaywright ã® launchPersistentContext ã180ç§ã§ã¿ã€ã ã¢ãŠãããå
šã¬ãŒã³ã1ä»¶ãæçš¿ã§ããªããŸãŸ24æéãçµéããŸããã
çã£å
ã«çã£ãã®ã¯ã¡ã¢ãªäžè¶³ã§ããActivity Monitor ãéããã¡ã¢ãªå§åã確èªããŸãããTopã³ãã³ãã§ RSS äžäœã䞊ã¹ãŸãããç°åžžãªããã»ã¹ã¯èŠåœãããŸãããdasdïŒDuet Activity SchedulerãmacOSã®ããã¯ã°ã©ãŠã³ã掻åã¹ã±ãžã¥ãŒã©ïŒã®RSS㯠264MBããéãããããªãã®ããšããæ°Žæºã§ãã
ããã宿
ã¯éããŸãããtop -l 1 -n 20 -o mem -stats pid,command,mem,cmprs ã§ MEMåãšCMPRSåãåæã«è¡šç€ºãããšãå
šå®¹ãèŠããŸããã
PID COMMAND MEM CMPRS
...
1234 dasd 264M 46G
MEMïŒç©çRAMã®å®äœ¿çšéïŒã¯ 264MBãããã CMPRSïŒå§çž®ãããŠã¡ã¢ãªã«æ®ã£ãŠããéïŒã¯ 46GBãåèšã§ã·ã¹ãã ã¯çŽ 47GB ã®ã¡ã¢ãªã dasd ã®ããã«ç¢ºä¿ããŠããŸãããã¹ã¯ããã¯37GBãŸã§èšããã§ããŸããã
RSSïŒResident Set SizeïŒã¯ããã»ã¹ãçŸåšç©çã¡ã¢ãªã«å±éããŠããããŒãžã®åèšã§ããmacOSã¯ã¡ã¢ãªå§è¿«æã«ãããŸã䜿ãããŠããªãããŒãžãå§çž®ããŠåãç©çã¢ãã¬ã¹ã«æŒã蟌ããŸãïŒCompressed MemoryïŒãå§çž®ãããããŒãžã¯RSSã«ã«ãŠã³ããããŸããããã®ãã RSS 264MB ãšãããæ£åžžå€ãã衚瀺ãããŠããã®ã§ãã
Activity Monitor ã®ãã¡ã¢ãªãåãåããã©ããã§ãã衚瀺ãããŠããã®ã¯ RSS ããŒã¹ã®å€ã§ãããå§çž®é åã¯ãã¡ã¢ãªå§åãã®ã°ã©ãã«èãæº¶ã蟌ãã ãã§ãããã»ã¹ããšã®CMPRSå€ã¯åºãŠããŸããã
Chromeãã¿ã€ã ã¢ãŠãããã¡ã«ããºã ãRSSãé ã
Playwright ã Chrome ãèµ·åãããšããã«ãŒãã«ã¯ããŒãã確ä¿ãããããã¡ã€ã«ãã£ã¬ã¯ããªã mmap ããŸãããã®ãšã macOS ã¯ã¹ã¯ããäžã®ããŒãžãã¡ã¢ãªã«æ»ãããšããŸãããšããã dasd ã 46GB ã®å§çž®é åãæ±ããŠãããšãç©çRAMã«ç©ºããäœããŸãããéå§çž®ã»å±éã»ããŒãžã€ã³ã»ã¹ã¯ããã€ã³ããã®äžé£ã®æäœãé£éã㊠Chromeã®åæåãã¹ã¿ãã¯ãã180ç§ã®ãŠã©ãŒã«ã¿ã€ã ãè¶ ããŠã¿ã€ã ã¢ãŠãããŸãã
ãšã©ãŒãã°ã«ã¯ Target closed Navigation timeout ããæ®ããŸãããã¡ã¢ãªã®æåã¯äžè¡ãåºãŠããŸãããããããèª°ãæ°ã¥ããªããçç±ã§ãã
第äºã®æŒãç¯: iiiïŒagentmemoryïŒ
dasd ã ããåå ã§ã¯ãããŸããã§ããããšãŒãžã§ã³ãã®ã¡ã¢ãªæ°žç¶åãæ
ã iii ããã»ã¹ïŒagentmemoryïŒãã宿ž¬ã§ æéçŽ4GB ã®ããŒã¹ã§ã¡ã¢ãªãèšåŒµããã第äºã®æŒãç¯ã§ãããã¹ã¯ãªããã®ã³ã¡ã³ãã«ã¯æ¬¡ã®ããã«èšé²ãããŠããŸãã
# iii(agentmemory) 㯠2026-08-09 宿ž¬ã§æéçŽ4GBå¢ãã second leakerã
LAUNCHD_RESTART_MAP="${MEM_HOG_LAUNCHD_MAP:-iii=com.shun.agentmemory:2048}"
dasd ãšç°ãªããiii 㯠launchd ããŠãŒã¶ãŒã»ãã·ã§ã³ãšããŠç®¡çãããžã§ãã§ããåã« killall iii ããŠããlaunchd ãããã«èŠªããã»ã¹ïŒnodeïŒãåèµ·åããiii èªäœã¯ ppid=1 ã®å€å
ãšããŠçãæ®ããŸããã¡ã¢ãªãæ±ããæ§ããã»ã¹ãæ®ã£ããŸãŸãæ°ããããã»ã¹ãå¢ããã ããšããææªã®ãã¿ãŒã³ã«ãªããŸãããããã¯å®è£
ã®ç¬¬äžçš¿ã§å®éã«ããã£ãèœãšã穎ã§ãããåŸè¿°ã® kickstart æŠç¥ã§è§£æ±ºããŠããŸãã
ã宿çã«ç¢ºèªããã°ãããã§ã¯ãªããèªåã§åãããèŠã
坿¥ã®èªååã¯ãç ã£ãŠããéãåããŠããªããã°æå³ããããŸãããSNSã®æé©æçš¿æéã¯æ7æã»æŒ12æã»å€21æã®ãããªæå»ã«éäžããŸãã皌å21æéã§ dasd ãæŽèµ°ãããªããå€äžã«éãã«èµ·ããççºãç¿æçºèŠããããšã«ãªããŸããæåã§ sudo killall dasd ãæãŠã°ããçŽãã«ããŠãããã®éã®æçš¿ã¯ãŒãã§ãã
ã宿çã«Activity Monitorã確èªããããã¯è§£æ±ºçã§ã¯ãããŸããã確èªãã人éãããªãæéãããæãå±éºã§ããèªåã§æ€ç¥ããå®å šã«åèµ·åããDiscordã«éç¥ããããã®ä»çµã¿ã launchd ã«çµã¿èŸŒãããšã§ã人éãå¯ãŠããŠãç°å¢ãèªå·±ä¿®åŸ©ããŸãã
ãå®å šã«ããæéèŠã®æ¡ä»¶
ãªãã§ã kill ããã°ããããã§ã¯ãããŸãããWindowServer ã kill ããã°ãã¹ã¯ããããèœã¡ãŸããlaunchd ã kill ããããšããŠã OS ãç¡èŠããŸããFinder ã kill ããã°ãã¹ã¯ããããåèµ·åããŸããäœæ¥äžã® Claude Code ã»ãã·ã§ã³ãããŒãã¢ããªãèœãšãã°ãæžãããã®ã³ã³ããã¹ããæ¶ããŸãã
ãã®ããã¹ã¯ãªããã«ã¯ãèªååèµ·åããã®ã¯ãOSãèªååèµ·åããåžžé§ããŒã¢ã³ã ãããšããèšèšååãåã蟌ãã§ããŸãããã以å€ã®ããã»ã¹ãã¡ã¢ãªéŸå€ãè¶ ããŠããDiscordãžã®éç¥ã ãè¡ããããã»ã¹ã«ã¯æãè§ŠããŸããã
# 絶察ã«è§Šããªããã®
NEVER_TOUCH="kernel_task WindowServer launchd loginwindow Finder"
ãã®äžè¡ããèªååã®ãblast radiusïŒè¢«å®³ååŸïŒããæå°åããŠããŸãã
å šäœã®æµã
ã¢ãŒããã¯ãã£å³
[launchd]
â
â StartInterval = 600ç§ïŒ10åããšïŒ
â Nice=10 / LowPriorityIO=trueïŒããã¯ã°ã©ãŠã³ãåªå
床ïŒ
âŒ
[~/.claude/scripts/mem-hog-guard.sh]
â
âââ top -l 1 -n 20 -o mem â MEMåïŒCMPRSåãã¹ãã£ã³
â â
â ââ dasd: MEM=47G/CMPRS=46G â éŸå€3072MBè¶
â â ââ sudo -n killall dasd â launchdãå³åèµ·å
â â
â ââ iii: MEMâ¥4096MBè¶
â â ââ SIGTERM â sleep2 â SIGKILL â kickstart -k
â â ââ å€å
æ®åãã§ãã¯åŸã«ãã°èšé²
â â
â ââ ãã®ä»: MEMâ¥6144MB â éç¥ã®ã¿ïŒè§ŠããªãïŒ
â
âââ¡ ps -Aco pid=,%cpu=,comm= â CPU軞ãå¥ã¹ãã£ã³ïŒCMPRSç匟ã¯åºãªãïŒ
â â
â ââ dasd: CPUâ¥50% ã2åé£ç¶
â ââ sudo -n killall dasd
â
ââ⢠ã¯ãŒã«ããŠã³ç®¡çïŒããã»ã¹ããšã»30åïŒ
â ââ ~/.cache/lily-browser-slots/cooldown/<name>
â
ââ⣠Discordéç¥ (notify.sh)
ââ æ€ç¥å
容 ïŒ sysctl vm.swapusage ã®çŸåšå€
launchd ã10åããã«ã¹ã¯ãªãããèµ·åããŸããã¹ã¯ãªããèªäœã¯ Nice=10 / LowPriorityIO=true ã§åããããéåžžäœæ¥ãžã®åœ±é¿ã¯ã»ãŒãŒãã§ããäºéèµ·å㯠shlock ã§æé€ããŠããŸãã
LOCK_FILE="/tmp/com.lily.mem-hog-guard.lock"
if ! /usr/bin/shlock -f "$LOCK_FILE" -p "$$"; then
exit 0
fi
trap '/bin/rm -f "$LOCK_FILE"' EXIT HUP INT TERM
shlock 㯠BSD ç±æ¥ã®ãã¡ã€ã«ããã¯ãŠãŒãã£ãªãã£ã§ãmacOS ã«ã¯æšæºã§å
¥ã£ãŠããŸããPID ãæ®åãã¡ã€ã«ã«æžãããŠãããããã»ã¹ãèœã¡ãã°èªåã§ããã¯ãè§£é€ãããŸãã
MEM/CMPRSã®ååŸãšåäœå€æ
ã¡ã¢ãªã¹ãã£ã³ã¯ top ã䜿ããŸãã-o mem ã§ MEM åã®éé ãœãŒãã-stats pid,command,mem,cmprs ã§CMPRSåãåæååŸããŸãã
TOP_RAW=$(top -l 1 -n 20 -o mem -stats pid,command,mem,cmprs 2>/dev/null)
top ãè¿ãå€ã¯ 264M 46G 37G ã®ãããªäººéåãã®è¡šèšã§ãããããMBæŽæ°ã«çµ±äžãã to_mb() 颿°ãçšæããŠããŸãã
to_mb() {
awk -v v="$1" 'BEGIN {
u = substr(v, length(v), 1); n = substr(v, 1, length(v) - 1) + 0
if (u == "T") { printf "%.0f", n * 1024 * 1024 }
else if (u == "G") { printf "%.0f", n * 1024 }
else if (u == "M") { printf "%.0f", n }
else if (u == "K") { printf "%.0f", n / 1024 }
else { printf "%.0f", v / 1048576 }
}'
}
46G 㯠46 à 1024 = 47104 MB ã«å€æãããŸããéŸå€ãšæŽæ°æ¯èŒã§ãããããbash ã® [ "$mem_mb" -ge "$AUTO_RESTART_THRESHOLD_MB" ] ã§å€å®ã§ããŸãã
2軞ã¹ãã£ã³ã®èšèšææ³
MEM/CMPRS ã¹ãã£ã³ãš CPU ã¹ãã£ã³ã¯ç¬ç«ãã2軞ã§åããŠããŸããçç±ããããŸãã
CMPRSç匟ïŒdasdã®ä»åã®çç¶ïŒã¯ top -o mem ã§æ€åºã§ããŸããããããå¥ã®æ¥ã« dasd ã CPU 75% ã§æŽèµ°ããã±ãŒã¹ãèµ·ããŠããŸãïŒå§çž®ã¡ã¢ãªã¯æ£åžžãªã®ã«æŒç®ãæ¢ãŸããªãïŒããã®ã±ãŒã¹ã§ã¯ MEM軞ã«ã¯äžåçŸããŸãããps -Aco pid=,%cpu=,comm= ã® CPU軞ã¹ãã£ã³ãå¿
èŠã§ãã
CPU_RAW=$(ps -Aco pid=,%cpu=,comm= 2>/dev/null)
-c ãã©ã°ã¯å®è¡ãã¡ã€ã«åã®ã¿ãè¿ããŸãã-o comm ã䜿ããšåå¹
ã15æåã§åããã/usr/libexec/dasd ã /usr/libexec/da ã«ãªã£ãŠ basename ç
§åãæ°žä¹
ã«å€ããŸãããããå®éã«ããã£ãèœãšã穎ã§ãã
CPUæŽèµ°ã¯ç¬éç㪠spike ãšæ¬ç©ã®æŽèµ°ãåºå¥ããããããNåé£ç¶ã§éŸå€è¶ ãããšãã streak ã«ãŠã³ã¿ãæã£ãŠããŸãã
CPU_THRESHOLD_PCT="${MEM_HOG_CPU_THRESHOLD_PCT:-50}"
CPU_SUSTAIN_CHECKS="${MEM_HOG_CPU_SUSTAIN_CHECKS:-2}"
ããã©ã«ãã¯ãCPU50%è¶ ãã2åé£ç¶ãã10åééã§åãããã20åéæŽèµ°ãç¶ããå Žåã«ã®ã¿åèµ·åããŸãã誀æ€ç¥ãé¿ããããã®ç·©è¡ã§ãã
ç°å¢å€æ°ã§æè»ã«èª¿æŽã§ããèšèš
ã¹ã¯ãªããã®éŸå€ã¯ãã¹ãŠç°å¢å€æ°ã§äžæžãã§ããŸããlaunchd ã® plist ã§ãããžã§ã¯ãåºæã®å€ãæ³šå ¥ããããšã§ãã¹ã¯ãªããæ¬äœã倿Žããã«æåã調æŽã§ããŸãã
plist ã® EnvironmentVariables ã»ã¯ã·ã§ã³ã«èšå®ãããŠããå€ããã¡ãã§ãã
<key>EnvironmentVariables</key>
<dict>
<key>MEM_HOG_LAUNCHD_MAP</key>
<string>iii=com.lily.agentmemory:4096</string>
<key>MEM_HOG_THRESHOLD_MB</key>
<string>3072</string>
</dict>
MEM_HOG_THRESHOLD_MB=3072 㯠dasd ã® MEM éŸå€ã3GB ã«èšå®ããŠããŸããã¹ã¯ãªããã®ããã©ã«ãïŒ5120MBïŒããäœãå€ã§ãããæ©æã«ä»å
¥ããŸãããã㯠dasd ã3GBãè¶
ããæç¹ã§ã¹ã¯ãããæ¥å¢ãããšãã宿ž¬ã«åºã¥ããå€ã§ãã
MEM_HOG_LAUNCHD_MAP ã¯ãŠãŒã¶ãŒã©ã³ãã®launchdãžã§ãã ããã»ã¹å=ã©ãã«:éŸå€MB 圢åŒã§åæããŸããiiiïŒagentmemoryïŒã¯4096MBè¶
ãã§ kickstart -k ã«ããåèµ·å察象ã«ãªããŸãã
ãŸã plist ã«ã¯ StartInterval=600 ãèšå®ãããŠããããã°ã¯ ~/.cache/lily-browser-slots/ ãã£ã¬ã¯ããªã«èšé²ãããŸãããã©ãŠã¶ã¹ããã管çãã£ã¬ã¯ããªãšåå±
ããŠããã®ã¯ãSNSèªåæçš¿ã·ã¹ãã å
šäœã®ãã°ãäžãæã«ãŸãšããããã§ãã
ããã»ã¹ããšã®ã¯ãŒã«ããŠã³
åæå®è£
ã«ã¯é倧ãªãã°ããããŸãããã¯ãŒã«ããŠã³ïŒåèµ·ååŸ30åéã¯åãããã»ã¹ãåèµ·åããªãïŒãå
šäœã§1ã€ã§ããã2026-08-09 ã®å®ã€ã³ã·ãã³ãã§ã16:42 ã« dasd ãååããåŸã®30åéãiii ãéŸå€ã®1.5åïŒ3.1GBïŒãŸã§èšããã§ãäžåååãããŸããã§ããã
çŸåšã®å®è£ ã¯ã¯ãŒã«ããŠã³ãããã»ã¹ããšã«ç¬ç«ãããã¡ã€ã«ã§ç®¡çããŸãã
COOLDOWN_DIR="$STATE_DIR/cooldown"
cooldown_active() {
local key="$1" file last
file="$COOLDOWN_DIR/$(printf '%s' "$key" | tr -c 'A-Za-z0-9._-' '_')"
[ -f "$file" ] || return 1
last=$(cat "$file" 2>/dev/null)
[ $(( $(date +%s) - last )) -lt "$COOLDOWN_SEC" ]
}
cooldown_mark() {
local key="$1"
date +%s >"$COOLDOWN_DIR/$(printf '%s' "$1" | tr -c 'A-Za-z0-9._-' '_')"
}
dasd ãš iii ã®ã¯ãŒã«ããŠã³ãã¡ã€ã«ã¯ç¬ç«ããŠç®¡çãããŸããdasd ãååããçŽåŸã§ããiii ãéŸå€ãè¶
ããŠããã°å³åº§ã«å¯Ÿå¿ã§ããŸãã
iii ã®åèµ·åã3ã¹ãããå¿ èŠãªçç±
dasd 㯠root æš©éã§åã OS ããŒã¢ã³ã§ããsudo -n killall dasd ã§èœãšãã° launchd ãæ°ç§ä»¥å
ã«åèµ·åããŸããã·ã³ãã«ã§ãã
ããã iiiïŒagentmemoryïŒã¯ãŠãŒã¶ãŒã»ãã·ã§ã³ã® launchd ãžã§ãã§ããlaunchctl kickstart -k ã¯èŠªããã»ã¹ïŒnodeïŒã眮ãæããŸãããiii èªäœã¯ãã®äžã§ detach() ããŠç¬ç«ããããã»ã¹ãšã㊠spawn ãããŠãããããppid=1 ã®å€å
ãšããŠçãæ®ããŸãã芪ãå
¥ãæ¿ããŠãåãæ®ãã®ã§ãã
å®éã®åèµ·åã·ãŒã±ã³ã¹ã¯ä»¥äžã®3ã¹ãããã§ãã
# ãŸãæ¬äœãèœãšã
kill -TERM "$pid" 2>/dev/null || true
sleep 2
kill -0 "$pid" 2>/dev/null && kill -KILL "$pid" 2>/dev/null || true
# 芪ïŒlaunchdãžã§ãïŒã眮ãæã
launchctl kickstart -k "gui/$(id -u)/$label" >/dev/null 2>&1 || true
sleep 3
# æ§ããã»ã¹ãæ¬åœã«æ¶ããã確èª
if kill -0 "$pid" 2>/dev/null; then
log "restart-failed $label pid=$pid ãæ®å"
fi
SIGTERM â 2ç§åŸ æ© â SIGKILLïŒãŸã çããŠããã°ïŒâ kickstart -k â 3ç§åŸã«æ®å確èªããã®ã·ãŒã±ã³ã¹ãã¹ããããããšãã¡ã¢ãªãæ±ããæ§ããã»ã¹ãçãæ®ããæ°ããã»ã¹ãå¢ããã ããšããææªã®çµæã«ãªããŸãã
dry-runã¢ãŒãã§å®å šã«æ€èšŒã§ãã
æ¬çªæå
¥åã« --dry-run ã§åäœã確èªã§ããŸãã
~/.claude/scripts/mem-hog-guard.sh --dry-run
å®éã« kill ã kickstart ã¯è¡ããããäœãããã€ãããããæšæºåºåã«è¡šç€ºããŸãã
WOULD RESTART: dasd (pid=1234) ã MEM 47G/å§çž® 46G ãæ±ããŠãã -> åèµ·å
swap: total = 37.00G used = 37.00G free = 0.00G
dry-run çµäº
launchd ã«ç»é²ããåã«æå
ã§ --dry-run ãäžåºŠèµ°ãããããå¿
é ã®æ€èšŒæé ã§ãã
å®è£ ã®è©³çް
launchd ç°å¢ã§ã® PATH åé¡ãšãã«ãã¹æŠç¥
ã¹ã¯ãªããã®2è¡ç®ãš3è¡ç®ã¯å°å³ã§ãããlaunchd éçšã§ã¯æéèŠã®2è¡ã§ãã
set -uo pipefail
PATH="/usr/bin:/bin:/usr/sbin:/sbin"
export PATH
set -uo pipefail 㯠bash ã®å®å
šèšå®3ç¹ã»ããã®ãã¡ -e ãå€ãããã®ã§ããlaunchd ããåŒã°ããã¹ã¯ãªããã§ã¯ -e ãå
¥ãããšãæå³ããªãã³ãã³ããéãŒããè¿ããã ãã§å
šäœãçµäºããŸããkill -0 "$pid" ã§ããã»ã¹ãæ¢ã«æ¶ããŠãããšãã|| true ãæ·»ããŠããªããã° -e ãã¹ã¯ãªãããèœãšããŸãããã®ãã -e ã¯å€ããéèŠãªæäœã ãæç€ºçã«ç¢ºèªããèšèšã«ããŠããŸãã
set -u ã¯æªå®çŸ©å€æ°ãåç
§ãããšãã«ãšã©ãŒã«ããèšå®ã§ãããã ã $1 ã®ãããªäœçœ®åŒæ°ã®åç
§ã§ã倿°ãååšããªããšççºããŸããåŒæ°ã®åãåãã case "${1:-}" in ãšæžããŠããã®ã¯ãã®ããã§ãã${1:-} 㯠$1 ãæªå®çŸ©ãªã空æåãè¿ãå±éã§ãset -u ã«æãããŸããã
PATH ã4ãã¹ã«æç€ºåºå®ããŠããã®ã¯ãlaunchd ããŠãŒã¶ãŒã®ã·ã§ã«èšå®ïŒ.zshrc ã .zprofileïŒãèªã¿èŸŒãŸãªãããã§ããã¿ãŒããã«ãªã nvm ã PATH ãå±éããŠãããŸãããlaunchd ããèµ·åãããã·ã§ã«ã«ã¯ nvm ãååšããŸãããshlock ãåŒã¶ãšã /usr/bin/shlock ã®ããã«ãã«ãã¹ã䜿ã£ãŠããã®ãåãçç±ã§ãsudo -n /usr/bin/killall ãšãã«ãã¹æå®ããŠããã®ããsudo ãåç
§ãã PATH ãå€éšã«äŸåããªãããã§ãã
top åºåã awk ã§åè§£ããããžãã¯
æããèããªéšåããtop ã®çåºåãã pid/name/mem/cmprs ãåãåºã awk ãããã¯ã§ãã
awk '/^PID/ { seen = 1; next }
seen && NF >= 4 {
cmprs = $NF; mem = $(NF - 1); pid = $1
name = ""
for (i = 2; i <= NF - 2; i++) name = name (name == "" ? "" : " ") $i
gsub(/ /, "", name)
print pid, name, mem, cmprs
}' <<<"$TOP_RAW"
/^PID/ ã§ãããè¡ãæ€åºãããã以éã®ããŒã¿è¡ã ãåŠçããŸãããã€ã³ãã¯åã åãã ã§ã¯ãªã åŸããã åã£ãŠããç¹ã§ããMEM ã¯æçµåã®1ã€åïŒ$(NF-1)ïŒãCMPRS ã¯æçµåïŒ$NFïŒãããã»ã¹åã¯2åç®ãã NF-2 åç®ãŸã§ãçµåããŸãã
ãªãåŸãããåãããtop -stats pid,command,mem,cmprs ã§åºåãããšããcommand åãè€æ°ã®åèªãå«ãå ŽåããããŸãïŒmacOS ã®äžéšãµãŒãã¹ã¯ /usr/libexec/something agent ã®ããã«ã¹ããŒã¹å
¥ãã§è¡šç€ºãããŸãïŒãåããåºå®åã§åããšååããã㊠MEM åã agent ã«ãªããŸããåŸãåºå®ãªã MEM/CMPRS ã®äœçœ®ã¯åžžã«å®å®ããŸãã
æåŸã® gsub(/ /, "", name) ã¯ã¹ããŒã¹ãé€å»ããŠããã»ã¹åã1èªã«ããŠããŸããbash ã® in_list() ãã¹ããŒã¹åºåããªã¹ãã§ç
§åãããããååã«ã¹ããŒã¹ãå
¥ããš2ã€ã®èŠçŽ ãšããŠèª€èªèãããã®ãé²ãã§ããŸãã
in_list() ãé
åã§ã¯ãªãåçŽã«ãŒãã«ããçç±
bash ã®é
å㯠declare -a ãå¿
èŠã§ãç°å¢å€æ°çµç±ã§ã¯æž¡ããŸãããlaunchd ã® plist ã§ EnvironmentVariables ã«èšå®ããå€ã¯æååãšããŠå±ããããé
åã«å€æããã¹ããããæãŸããŸããin_list() ã¯ã¹ããŒã¹åºåãæååããã®ãŸãŸåãåã£ãŠ for ã§ã«ãŒãããŸãã
in_list() {
local needle="$1" hay="$2" item
for item in $hay; do [ "$item" = "$needle" ] && return 0; done
return 1
}
$hay ãã¯ã©ãŒãããŠããªãã®ã¯æå³çã§ããã¯ã©ãŒããããš for item in "$hay" ãšãªããæååå
šäœã1èŠçŽ ãšããŠæ±ããŸããã¹ããŒã¹åºåããå±éãããããã«ãããŠã¯ã©ãŒããªãã§ããIFS æäœãäžèŠãªã·ã³ãã«ãªæžãæ¹ãéžãã§ããŸãã
LAUNCHD_RESTART_MAP ã®ããŒã¹
iii ã®ãã㪠launchd ãžã§ãã®å®çŸ©ã¯ ããã»ã¹å=ã©ãã«:éŸå€MB ãšãããã©ãŒãããã䜿ããŸããplist ã§ã¯ iii=com.shun.agentmemory:4096 ãšèšå®ãããŠããŸãã
for m in $LAUNCHD_RESTART_MAP; do
case "$m" in "$command="*) entry="${m#*=}"; break ;; esac
done
case "$m" in "$command="* ã¯ãæååã $command= ã§å§ãŸãããã確èªãããã¿ãŒã³ãããã§ããgrep ã awk ã䜿ãããbash çµã¿èŸŒã¿ã® case ã§å®çµãããŠããŸãããããããã ${m#*=} ã§ = 以éïŒcom.shun.agentmemory:4096ïŒãåãåºãããããã : ã§ã©ãã«ãšéŸå€ã«åå²ããŸãã
label="${entry%:*}" # com.shun.agentmemory
limit="${entry##*:}" # 4096
%:* ã¯æåŸã® : ããåã##*: ã¯æåŸã® : ããåŸãã§ããå€éšã³ãã³ãäžèŠã§ããã¹ã«äŸåããªãæååæäœã§ãã
CPU streak ã®ç¶æ æ©æ¢°
CPUæŽèµ°ã®æ€ç¥ã¯ããã¡ã€ã«ããŒã¹ã® streak ã«ãŠã³ã¿ã§å®è£ ããŠããŸãã
streak=$(cpu_streak_get "$name")
if cpu_at_least_threshold "$cpu" "$CPU_THRESHOLD_PCT"; then
streak=$((streak + 1))
else
streak=0
fi
[ "$DRY_RUN" -eq 1 ] || cpu_streak_set "$name" "$streak"
cpu_at_least_threshold() 㯠awk ã§æµ®åå°æ°ç¹æ¯èŒããŸããbash ã® [ ] ã¯æŽæ°æ¯èŒããã§ããŸãããtop ãè¿ã CPU å€ã¯ 75.3 ã®ãããªå°æ°ãªã®ã§ãawk -v cpu="$1" -v threshold="$2" 'BEGIN { exit !(cpu + 0 >= threshold + 0) }' ã§å€å®ããŠããŸãã
streak ã CPU_SUSTAIN_CHECKSïŒããã©ã«ã 2ïŒã«éãããã€ä»ãã®ç¬éãéŸå€ãè¶
ããŠããŠããã€ã¯ãŒã«ããŠã³äžã§ãªãå Žåã®ã¿åèµ·åããŸãããstreak ãæºãŸã£ãåŸã«åãŸã£ãŠãããã±ãŒã¹ã§èª€çºç«ããªããããåèµ·åçŽåã«ãéŸå€ãå確èªããŠããç¹ãéèŠã§ãã
ç§ãè©°ãŸã£ã話
è©°ãŸãâ : ps -o comm ã15æåã§åããŠç §åãæ°žä¹ ã«å€ãã
CPU 軞ã®ã¹ãã£ã³ãæåã«å®è£
ãããšããããã»ã¹åã®ååŸã« ps -Ao comm ã䜿ã£ãŠããŸãããæ°æ¥çšŒåãããŠã dasd ã® CPU æŽèµ°ã¯äžåºŠãæ€åºãããŸããããã°ã«ã¯äœãæ®ããŸããã
åå ã調ã¹ããšã-o comm 㯠åå¹
ã15æåã«åããŸããdasd ã¯4æåãªã®ã§åé¡ãããŸããããããå®éã« ps -Ao comm ãå®è¡ãããšããã«ãã¹ã§ç»é²ãããŠããããã»ã¹ã¯ /usr/libexec/dasd ãšããŠååŸãããããã /usr/libexec/da ã«åãããŸããbasename ã§ç
§åããããšããŠã da ã«ãªããããin_list "da" "dasd" ã¯æ°žé ã«ãããããŸããã
ã³ãŒãã®ã³ã¡ã³ãã«ãæ®ããŠããŸãã
# ps -Ao comm ã¯åå¹
15æåã§åãã /usr/libexec/dasd ã /usr/libexec/da ã«ãªãã
# ããã ãš basename ç
§åãæ°žä¹
ã«å€ããã®ã§ -c(å®è¡ãã¡ã€ã«åã®ã¿)+ãããææ¢ã䜿ãã
CPU_RAW=$(ps -Aco pid=,%cpu=,comm= 2>/dev/null)
-c ã¯ãå®è¡ãã¡ã€ã«åã®ã¿ããè¿ããã©ã°ã§ããã«ãã¹ãå«ãŸãåãæšãŠãèµ·ããŸãããåããããææ¢ãã = ãµãã£ãã¯ã¹ãšçµã¿åããããšãpid=,%cpu=,comm= ãšããåœ¢ã§æžããŸãã-Aco ã®é çªãå€ãããšãªãã·ã§ã³ã®æå³ãå€ããããããã®ãŸãŸåºå®ããŠããŸãã
è©°ãŸãâ¡: ã¯ãŒã«ããŠã³ãå šäœã§1ãã¡ã€ã«ã ã£ã代å
æåã®å®è£
㯠COOLDOWN_FILE="$STATE_DIR/.mem-hog-last" ãšãã1ãã¡ã€ã«ã§ããããäœããåèµ·åããã30åã¯äœãããªãããšããããžãã¯ã§ãã
2026幎8æ9æ¥ã®ã€ã³ã·ãã³ãã§ã16:42 ã« dasd ãååããŸããããã®çŽåŸãã iii ãæé4GBã®ããŒã¹ã§èšãã¿å§ãã16:55 ã«ã¯éŸå€ã®1.5åïŒ3.1GBïŒãè¶
ããŸããããããã¹ã¯ãªãã㯠dasd ãååããããšã«ããã¯ãŒã«ããŠã³äžã ãšå€æããiii ã«ã¯äžåæãä»ããŸããã§ããã
dasd ã®ã¯ãŒã«ããŠã³äžã« iii ãèšãããããã¯åæå€çºããå¯èœæ§ãååããã·ããªãªã§ããã1ä»¶çŽãããä»ã30åæŸçœ®ãã¯èšèšãšããŠãããããšãäºåŸåæã§æ°ã¥ããŸããã
ä¿®æ£åŸã¯ã¯ãŒã«ããŠã³ãããã»ã¹ããšã«ç¬ç«ãããã¡ã€ã«ãžåããŠããŸããã³ã¡ã³ãã«åœæã®å ·äœçãªçµç·¯ãæ®ã£ãŠããŸãã
# ã¯ãŒã«ããŠã³ã¯ãããã»ã¹ããšãã«æã€ã
# 2026-08-09: å
šäœã§1ã€ã«ããŠããããã16:42ã«dasdãååãã30åéã¯
# iii ãéŸå€ã®1.5å(3.1GB)ãŸã§èšããã§ãäžåååãããªãã£ãã
# 1ä»¶çŽãããä»ã30åæŸçœ®ã«ãªãã®ã¯èª€ãã
COOLDOWN_DIR="$STATE_DIR/cooldown"
ãã¡ã€ã«å㯠printf '%s' "$key" | tr -c 'A-Za-z0-9._-' '_' ã§å®å
šãªãã¡ã€ã«åã«å€æããŸãã: ãå«ãŸããã©ãã«ïŒcom.shun.agentmemoryïŒããCPU çšã® dasd:cpu ãšããããŒã / ã«å±éãããŠãã£ã¬ã¯ããªãäœãããã®ãé²ãããã§ãã
è©°ãŸãâ¢: kickstart ã ãã§ã¯ iii ã®æ§ããã»ã¹ãçãæ®ã£ã
iiiïŒagentmemoryïŒã®æåã®åèµ·åæŠç¥ã¯ launchctl kickstart -k "gui/$(id -u)/com.shun.agentmemory" ã ãã§ãããlaunchd ã管çãããžã§ããªããããã§èŠªããã»ã¹ïŒnodeïŒããšçœ®ãæããã¯ããšããæ³å®ã§ãã
å®éã«ã¯æ§ iii ããã»ã¹ãçãæ®ããŸãããps aux | grep iii ã§ç¢ºèªãããšãppid=1 ã®å€å
ããã»ã¹ãšããŠååšãç¶ãã4GBã®ã¡ã¢ãªãæ±ãããŸãŸã§ãããæ°ãã iii ãèµ·åãããããããã»ã¹ã2æ¬ã«ãªãã¡ã¢ãªäœ¿çšéãåã«ãªããŸããã
åå 㯠iii ã®èµ·åæ¹æ³ã§ããagentmemory 㯠node ãèµ·åããåŸã« detach() ããŠç¬ç«ããåããã»ã¹ãšã㊠spawn ãããŸããlaunchd ã管çããŠããã®ã¯èŠªïŒnodeïŒã§ããkickstart -k ã¯èŠªãå
¥ãæ¿ããŸãããdetach ãããåã® ppid ã¯ãã§ã« 1ïŒlaunchd æ¬äœïŒã«æžãæãã£ãŠããããã芪ã®åèµ·åã«åœ±é¿ãåããŸããã
æ£ããé åºã¯ãå
ã« iii æ¬äœãèœãšã â 芪ã kickstart ãããã§ãã
kill -TERM "$pid" 2>/dev/null || true
sleep 2
kill -0 "$pid" 2>/dev/null && kill -KILL "$pid" 2>/dev/null || true
launchctl kickstart -k "gui/$(id -u)/$label" >/dev/null 2>&1 || true
sleep 3
if kill -0 "$pid" 2>/dev/null; then
log "restart-failed $label pid=$pid ãæ®å"
fi
SIGTERM ãéãã2ç§åŸã«ãŸã çããŠããã° SIGKILLããã®åŸ kickstart ã§èŠªã眮ãæãã3ç§åŸ
ã£ãŠæ§ pid ãæ¬åœã«æ¶ããã確èªããŸããæ®å確èªã kill -0 ã§ãã£ãŠããã®ã¯ãpid ã«èªã¿åãæš©éãããã°çæ»ç¢ºèªãã§ããããã§ããããã»ã¹ãæ¶ããŠããã° kill -0 ã¯éãŒããè¿ããif ã®äžã«ã¯å
¥ããŸããã
è©°ãŸãâ£: sudo -n ã launchd ç°å¢ã§éããªãã£ã
dasd ã®åèµ·å㯠sudo -n /usr/bin/killall dasd ã§è¡ããŸãã-n ã¯ããã¹ã¯ãŒãããã³ãããåºãããæš©éããªããã°å³å€±æããããªãã·ã§ã³ã§ãã
éçºæã«ã¿ãŒããã«ããæåå®è¡ãããšåããŸããlaunchd çµç±ã§åãããš sudo: a password is required ã§ã¹ããããããŸãã
åå ã¯ãµãã€ãããŸãããã²ãšã€ã¯ PATH ã®åé¡ïŒsudoers ã® secure_path ãšç°å¢ã® PATH ãé£ãéãããã/usr/bin/killall ã®ãã«ãã¹æå®ãå¿
èŠïŒãããã²ãšã€ã¯ãNOPASSWD èšå®ãç§ã® Mac ã§ã¯ããã©ã«ãã§å
¥ã£ãŠããªãã£ãç¹ã§ãã
察åŠã¯ sudo -n ã®å€±æããšã©ãŒã§ã¯ãªããéç¥ããŠçµäºããšããŠæ±ãèšèšã«å€ããããšã§ããã
if sudo -n /usr/bin/killall "$command" 2>/dev/null; then
log "restarted $command pid=$pid mem=$mem cmprs=$cmprs"
findings="${findings}â
${msg}"$'\n'
restarted=$((restarted + 1))
else
log "restart-failed(no-sudo) $command pid=$pid mem=$mem"
findings="${findings}â ïž ${msg} â sudoæš©éãç¡ãåèµ·åã§ãããæå: sudo killall ${command}"$'\n'
fi
NOPASSWD ãèšå®ãããŠããªãç°å¢ã§ã¯ãDiscord ã«ãæåã§å®è¡ããŠãã ããããšããéç¥ãé£ã³ãŸããèªååã倱æããããšãé»ã£ãŠæ¡ãã€ã¶ããã人éã«æž¡ãèšèšã§ããNOPASSWD ã®èšå®æ¹æ³ã¯ sudo visudo ã§ %admin ALL=(ALL) NOPASSWD: /usr/bin/killall ã远èšããŸããç§ã® Mac ã§ã¯è¿œèšæžã¿ã§ãã
è©°ãŸãâ€: top ãããè¡ã®æ€åºã§ NF æ¡ä»¶ãçãã£ã
æåã® awk 㯠/^PID/ ã§ seen ãã©ã°ãç«ãŠãåŸãseen && NF > 0 ã§å
šè¡ãæŸã£ãŠããŸãããtop ã®åºåã«ã¯ç©ºè¡ãæãŸãããšããããŸãã空è¡ã¯ NF=0 ãªã®ã§åé¡ãªããšæã£ãŠããŸããããåºåãè¡ïŒ--- ã®ãããªè¡ïŒã NF=1 ã§éãæã㊠$(NF-1) ã $0 ãšåãã«ãªããããŒã¹ãå£ããŸããã
ä¿®æ£ã¯ NF >= 4 ã®æ¡ä»¶ãå ããããšã§ããpid/name/mem/cmprs ã®æäœ4ãã£ãŒã«ããæã£ãŠããªãè¡ã¯ç¡èŠããŸãã
seen && NF >= 4 {
cmprs = $NF; mem = $(NF - 1); ...
}
ãã®å€æŽã§ããããçŽåŸã®ç©ºè¡ã»åºåãè¡ã»ãã©ãŒãããäŸå€ãå
šãŠç¡èŠãããããã«ãªããŸãããtop ã®åºåãã©ãŒããã㯠macOS ããŒãžã§ã³ã«ãã£ãŠåŸ®åŠã«å€ãããŸããåºå®åã€ã³ããã¯ã¹ãžã®äŸåãæå°åããNF æ¡ä»¶ã§ã¬ãŒãããã®ãå®å
šã§ãã
次ã®ç« ã§ã¯ãå®éã«ãã®ã¹ã¯ãªããã launchd ã«ç»é²ããŠäœ¿ãæé ãšã皌ååŸã®ãã°ã®èªã¿æ¹ã解説ããŸãã
ã€ãŸãããã€ã³ã
å®è£ ã»ç»é²ã»éçšã®åãã§ãŒãºã§èžãã èœãšã穎ãäžèЧããŸããåæ®µã§æ·±æããã5ã€ïŒps -cåãæšãŠã»å šäœã¯ãŒã«ããŠã³ã»kickstartå€å ã»sudo -näžéã»NFæ¡ä»¶ïŒã¯ããã§ã¯ç¹°ãè¿ããŸãããç»é²ãã§ãŒãºãšé·æéçšãã§ãŒãºã«çµããŸãã
-
launchctl loadã¯Ventura以éã§éæšå¥šã»ç¡é³ã§å€±æããããšãããlaunchctl load ~/Library/LaunchAgents/com.lily.mem-hog-guard.plistã¯å€ãAPIã§ããmacOS VenturaïŒ13ïŒä»¥éã¯launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.lily.mem-hog-guard.plistã䜿ããŸããloadã§ããšã©ãŒãåºãªããŸãŸç»é²æžã¿ã«èŠããããšããããlaunchctl list | grep mem-hogã§åäœç¢ºèªãããŸã§æ°ã¥ããŸããã -
StandardErrorPath/StandardOutPath ãæããã£ã¬ã¯ããªãå ã«äœã£ãŠãããªããšç¡é³ã§å€±æãã plist ã«ã¯
StandardErrorPathãšããŠ~/.cache/lily-browser-slots/mem-hog-guard.launchd.logãèšå®ããŠããŸãããã®ãã£ã¬ã¯ããªãååšããªãç¶æ ã§bootstrapãããšãlaunchd ã¯ãã°ãã¡ã€ã«ãéããã«ãžã§ããèœãšããŸãããšã©ãŒãã°ãåããªãããã10ååŸ ã£ãŠãäžåºŠãèµ·åããªããã§ããããŸããmkdir -p ~/.cache/lily-browser-slotsãå ã«å®è¡ããŠããç»é²ããŸãã -
RunAtLoad=true ã®ãŸãŸæ¬çªMacã«é 眮ããã
bootstrapããç¬éã« dasd ãèœã¡ã æ€èšŒäžã«RunAtLoad=trueã«ããŠããã®ãæ»ãå¿ããŠPCã«é 眮ãããšãbootstrapããç¬éã¹ã¯ãªãããèµ°ããŸããdasd ãããŸããŸéŸå€ïŒplist ã§ã¯MEM_HOG_THRESHOLD_MB=3072ïŒãè¶ ããŠããã°ãå³åº§ã«sudo killall dasdãå®è¡ãããŸããplist ã«ã¯<key>RunAtLoad</key><false/>ãæèšããæåã®å®è¡ã¯launchctl start com.lily.mem-hog-guardã§æåããªã¬ãŒããŸãã -
StartInterval ã®ã¿ã€ããŒã¯ããŒãæå»ã§ã¯ãªãã«ã¬ã³ããŒåºåãã§åã 600ç§ãèšå®ãããšãããŒããã600ç§åŸãã§ã¯ãªããæ¬¡ã®600ç§ã®å¢çã§èµ·åãããŸããç»é²çŽåŸã«ããªã10ååŸ ã£ãŠãåããªãã®ãããšæ··ä¹±ããŸãã
launchctl start com.lily.mem-hog-guardã§å³åº§ã«æåèµ·åããŠååã®æåã確èªããŠããæŸçœ®ããŸãã -
ProcessType / Nice / LowPriorityIO ã®3ç¹ã»ãããçç¥ãããšããããªãŒèŠåã«åºã çç¥ãããš
topãæ°ç§å®è¡ããéãmacOS ã®ãšãã«ã®ãŒèšºæã«ãCPUãå€ã䜿ã£ãã¢ããªããšããŠèšé²ãããŸããProcessType=Backgroundã»Nice=10ã»LowPriorityIO=trueã®3ã€ã plist ã«æããããšã§ãããã¯ã°ã©ãŠã³ãåŠçãšããŠæ£ããåé¡ãããŸãã -
sudo visudo ã® NOPASSWD ãåºãæžãããããšå¥ã®ãªã¹ã¯ãæã
NOPASSWD: ALLã§éããšã¹ã¯ãªããã䟵害ããããšãã®è¢«å®³ãæå€§ã«ãªããŸããNOPASSWD: /usr/bin/killallãš killall ã®ã¿ã«éå®ããã®ãæå°æš©éã§ããã¹ã¯ãªããå ã§ãsudo -n /usr/bin/killall dasdãšãã«ãã¹æå®ããããšã§ãsudoers ã®å¯Ÿè±¡ã³ãã³ããäžèŽããŸãã -
ãã°ãã¡ã€ã«ãç¡å¶éã«è¥å€§åãã
log()颿°ã¯>>ã§è¿œèšããã ãã§ãããŒããŒã·ã§ã³ã®ä»çµã¿ããããŸããã鱿¬¡ã§truncate -s 0ããå¥ã® launchd ãžã§ããä»èŸŒããããã°ç¢ºèªã®éã¯tail -n 100ã§èªãç¿æ £ãã€ããŠãããªããšãæ°ãæåŸã«æ°çŸMBã«ãªããŸãã -
launchd.logïŒplist ã® StandardErrorPathïŒãšã¹ã¯ãªããå log() ãå¥ãã¡ã€ã«ã«ãªã plist ã®
StandardErrorPathã¯æšæºãšã©ãŒåºåïŒã·ã§ã«ã®>&2ïŒãåãåããŸããã¹ã¯ãªããå ã®log()ã¯mem-hog-guard.logã«çŽæ¥æžããŸãããåããŠããã¯ããªã®ã« log() ã空ããšããç¶æ ã¯ãã¹ã¯ãªãããèµ·ååã« launchd ã¬ãã«ã§ã¯ã©ãã·ã¥ããŠããããšïŒplist syntax errorã»æš©éã»ãã£ã¬ã¯ããªæªäœæïŒãæå³ããŸãããŸãmem-hog-guard.launchd.logã確èªããŸãã -
in_listã®$hayãã¯ã©ãŒããªãã§æžããŠãããå¥ã®ãšã³ãžãã¢ã«ãä¿®æ£ããããfor item in $hayã®ã¯ã©ãŒããªãã¯æå³çã§ããIFSã«ãã word splitting ã§ã¹ããŒã¹åºåããªã¹ããå±éããããã§ãã"$hay"ã«ãä¿®æ£ãããããšæååå šäœã1èŠçŽ ãšããŠæ±ãããç §åãæ°žä¹ ã«å€ããŸããçç±ã³ã¡ã³ãã1è¡æžããŠãããªããšæ£ããã³ãŒããå£ãããŸãã -
kill -0ã§ dasd ã®æ®åã確èªããããšãããæš©éãšã©ãŒã§åœé°æ§ã«ãªã£ã dasd 㯠root ææããã»ã¹ã§ããäžè¬ãŠãŒã¶ãŒããkill -0 "$pid"ãæã€ãš EPERM ãè¿ãéãŒãã«ãªããŸãããããã»ã¹ãæ¶ãããã§ã¯ãªããæš©éããªãããšããæå³ã®éãŒãã§ããã¹ã¯ãªããã§ã¯ dasd ã®æ®å確èªã¹ããããçç¥ããsudo -n killallãæåããæç¹ã§åèµ·åæåãšã¿ãªããŠããŸããkill -0ã«ããæ®å確èªã¯ launchd ãŠãŒã¶ãŒãžã§ãïŒiiiïŒå°çšã«ããŠããŸãã -
vm_stat ã®åºåã OS ããŒãžã§ã³ã§åé ãå€ãã Discord éç¥ã«å«ããã¹ã¯ããæ å ±ã¯
sysctl -n vm.swapusageã䜿ã£ãŠããŸããvm_statã³ãã³ãã¯ãPages freeããPages wired downããªã©ã®ããŒãžåäœã®çå€ãè¿ããèšç®ãå¿ èŠãªããååãããŒãžã§ã³ã§å€ãããŸããäžè¡ã§äººéãèªããã¹ã¯ããçŸåšå€ã欲ãããªãsysctl -n vm.swapusageãæãå ç¢ã§ãã
ãã¹ããã©ã¯ãã£ã¹
1. NEVER_TOUCH ãªã¹ããå ã«å®çŸ©ãã
NEVER_TOUCH="kernel_task WindowServer launchd loginwindow Finder"
ãäœãè§Šã£ãŠãããããããäœã絶察ã«è§Šããªããããå ã«æ±ºããŸãããã®ãªã¹ããããããããéŸå€ãè¶ ãã WindowServer ãèªåkillããŠãã¹ã¯ããããèœãšãããšã¯ãããŸãããblast radius ãæåã«å®£èšããã®ãèªååã®èšèšååã§ãã
2. æ¬çªç»é²ã®åã« --dry-run ãå¿
ã1åèµ°ããã
~/.claude/scripts/mem-hog-guard.sh --dry-run
WOULD RESTART: dasd (pid=1234) ã MEM 47G/å§çž® 46G ãæ±ããŠãã -> åèµ·å ãšããåºåããäœãèµ·ããããäºåã«æããŠãããŸãããã®5ç§ãã€ã³ã·ãã³ããé²ããŸãã
3. launchd ç°å¢ã§ã¯å šã³ãã³ãããã«ãã¹ã§æžã
launchd 㯠.zshrc ã .zprofile ãèªã¿ãŸãããã¹ã¯ãªããåé ã§ PATH="/usr/bin:/bin:/usr/sbin:/sbin" ãš4ãã¹ã«åºå®ããshlock 㯠/usr/bin/shlockãkillall 㯠/usr/bin/killall ãšãã«ãã¹ã§æžããŸãããã¿ãŒããã«ã§åãã®ã« launchd çµç±ã§åããªããã®å€§åã¯ãããåå ã§ãã
4. set -uo pipefail ã䜿ã set -e ã¯å€ã
-e 㯠launchd ç°å¢ã§èª€çããŸããkill -0 "$pid" ã§ããã»ã¹ãæ¢ã«æ¶ããŠããå ŽåïŒæ£åžžãªç¶æ
ïŒãéãŒããè¿ã -e ãã¹ã¯ãªããå
šäœãèœãšããŸããéèŠãªæäœã ã if ãš || true ã§æç€ºçã«ç¢ºèªãã-e ã«ã¯é ŒããŸããã
5. éŸå€ã¯ãã¹ãŠç°å¢å€æ°ã§äžæžãå¯èœã«ãã
AUTO_RESTART_THRESHOLD_MB="${MEM_HOG_THRESHOLD_MB:-5120}"
ã¹ã¯ãªããæ¬äœã¯å€ãããplist ã® EnvironmentVariables ããå€ã泚å
¥ã§ããèšèšã«ããŸããå®éã® plist ã§ã¯ MEM_HOG_THRESHOLD_MB=3072 ãèšå®ããŠããŸãããã㯠dasd ã3GBãè¶
ããæç¹ã§ã¹ã¯ãããæ¥å¢ãããšãã宿ž¬ããæ±ºããå€ã§ããã¹ã¯ãªããã®ããã©ã«ãïŒ5120MBïŒããäœãå€ãå€ããå
¥ããããšã§ãããæ©æã«ä»å
¥ããŸãã
6. ã¯ãŒã«ããŠã³ã¯ããã»ã¹ããšã«ç¬ç«ãã¡ã€ã«ã§æã€
COOLDOWN_DIR="$STATE_DIR/cooldown"
å
šäœã§1ãã¡ã€ã«ã«ãããšãdasd ãååãã30åéãiii ã4GBè¶
ããŠãæŸçœ®ããèµ·ããŸãã2026幎8æ9æ¥ã®ã€ã³ã·ãã³ãã§å®èšŒãããŠããŸãããã¡ã€ã«å㯠printf '%s' "$key" | tr -c 'A-Za-z0-9._-' '_' ã§ãµãã¿ã€ãºããã³ãã³ïŒiii:cpu ãªã©è€åããŒïŒããã£ã¬ã¯ããªãšããŠè§£éãããã®ãé²ããŸãã
7. MEM軞ãšCPU軞ãç¬ç«ãã2ã«ãŒãã§åã
CMPRSç匟㯠top -o mem ã§åºãŸãããCPUã®ã¿ã®æŽèµ°ã¯ MEMæ¬ã«çŸããŸãããdasd ã CPU 75%ã§æŽèµ°ãã奿¥ã®ã€ã³ã·ãã³ãã§ã¯ãMEM軞ã ãã§ã¯äœãæ€åºã§ããŸããã§ãããtop ã«ãŒããš ps -Aco ã«ãŒããå®å
šã«åé¢ããããšã§ãã©ã¡ãã®çç¶ã«ãç¬ç«ããŠå¯Ÿå¿ã§ããŸãã
8. CPU å€å®ã¯ã¹ããªãŒã¯ïŒNåé£ç¶ïŒã®2段æ§ãã«ãã
1åã®ã¹ãã€ã¯ã§åèµ·åãããšäžæçãªåŠçããŒã¯ã§èª€çºç«ããŸãããã¡ã€ã«ããŒã¹ã®ã¹ããªãŒã¯ã«ãŠã³ã¿ã§ã2åé£ç¶ CPU 50%è¶ ãããæ¡ä»¶ã«ãããã€åèµ·åçŽåã«ãéŸå€ãå確èªããŸãããstreak ãæºãŸã£ãåŸã«åãŸã£ãŠãããã±ãŒã¹ã§èª€çºç«ããªãããã®äºéãã§ãã¯ã§ãã
if [ "$streak" -ge "$CPU_SUSTAIN_CHECKS" ] && cpu_at_least_threshold "$cpu" "$CPU_THRESHOLD_PCT" && ! cooldown_active "$name:cpu"; then
9. sudo -n ã®å€±æãgraceful degradationã§åŠçãã
NOPASSWD ãèšå®ãããŠããªãç°å¢ã§ã¯èªåkillã¯éããŸããããã®ãšãé»ã£ãŠçµäºããã®ã§ã¯ãªããDiscord ã«ãæåã§ sudo killall dasd ãå®è¡ããŠãã ããããšããéç¥ãéããŸããèªååã倱æããããšã人éã«æž¡ãèšèšããé·æéçšã®ä¿¡é Œæ§ãäœããŸãã
if sudo -n /usr/bin/killall "$command" 2>/dev/null; then
log "restarted $command ..."
else
log "restart-failed(no-sudo) ..."
findings="${findings}â ïž ${msg} â sudoæš©éãç¡ãåèµ·åã§ãããæå: sudo killall ${command}"$'\n'
fi
10. launchd ãŠãŒã¶ãŒãžã§ãã®åèµ·å㯠SIGTERM â SIGKILL â kickstart ã®3ã¹ããã
detach ãã㊠ppid=1 ã«ãªã£ãåããã»ã¹ã¯ kickstart -k ã ãã§ã¯èœã¡ãŸãããå
ã«æ¬äœã SIGTERMã2ç§åŸã«çããŠããã° SIGKILLããã®åŸ kickstart ã§èŠªã眮ãæããŸããkickstart ã ãã§æžãŸãããšãã¡ã¢ãªãæ±ããæ§ããã»ã¹ãçãæ®ããªããæ°ããã»ã¹ãå¢ãããšããææªã®ç¶æ
ã«ãªããŸãã
11. ps ã«ã¯ -c ãã©ã°ã䜿ã
CPU_RAW=$(ps -Aco pid=,%cpu=,comm= 2>/dev/null)
-o comm ã¯åå¹
15æåã§ããã»ã¹åãåããŸãã/usr/libexec/dasd ã /usr/libexec/da ã«ãªããbasename ç
§åãæ°žé ã«å€ããŸãã-c ã¯å®è¡ãã¡ã€ã«åã®ã¿ãè¿ãåãæšãŠãèµ·ããŸããããããææ¢ã® = ãµãã£ãã¯ã¹ãšã»ããã§äœ¿ããŸãã
12. top ã® awk ããŒã¹ã¯åãåŸãããåã
cmprs = $NF; mem = $(NF - 1)
ããã»ã¹åã«ã¹ããŒã¹ãå«ãŸãããšåããåºå®åã§åããš MEM åããããŸããæçµåïŒCMPRSïŒã»æçµã®1ã€åïŒMEMïŒãåºå®ã«ããŠååã¯æ®ããçµåããŸããNF >= 4 ã§ç©ºè¡ã»åºåãè¡ãã¬ãŒãããŸãã
13. éç¥ã« sysctl vm.swapusage ãå«ãã
swap=$(sysctl -n vm.swapusage | sed 's/vm.swapusage: //')
notify "ð§ mem-hog-guard\n${findings}\nswap: $swap"
ãdasd ãåèµ·åããããšããæ å ±ã ãã§ã¯ãã¹ã¯ããã37GBãŸã§ç©ã¿äžãã£ãŠãããã©ãããããããŸãããã¹ã¯ããã®çŸåšå€ãéç¥ã«å«ããããšã§ãMacèªäœã®åèµ·åãå¿ èŠãã©ãããæå ã§å€æã§ããŸãã
14. åèµ·ååŸã« kill -0 ã§æ§ããã»ã¹ã®æ®åã確èªãã
sleep 3
if kill -0 "$pid" 2>/dev/null; then
log "restart-failed $label pid=$pid ãæ®å"
fi
kickstart åŸã«3ç§åŸ
ã£ãŠæ§ pid ãæ¬åœã«æ¶ããã確èªããŸãããŸã çããŠããã° restart-failed ãšããŠãã°ãéç¥ããŸãããåèµ·åããããšãæ§ããã»ã¹ãæ¶ãããã¯å¥ã®ç¢ºèªã§ãã
15. shlock ã§äºéèµ·åãé²ã
LOCK_FILE="/tmp/com.lily.mem-hog-guard.lock"
if ! /usr/bin/shlock -f "$LOCK_FILE" -p "$$"; then
exit 0
fi
trap '/bin/rm -f "$LOCK_FILE"' EXIT HUP INT TERM
launchd ã® StartInterval ã¯ãåã®å®è¡ãçµãã£ãŠãããã©ãããã確èªããŸãããtop ãš ps ãåæã«èµ°ããšåã pid ã2å kill ãã«ããããšã«ãªããŸããshlock ã¯ããã»ã¹ãèœã¡ãç¬éã«èªåã§ããã¯ãè§£é€ããããããããããã¯ã«ãªããŸããã
ãŸãšã
RSS ã«æ ããªã CMPRS ç匟ã¯ãActivity Monitor ã§ãããã©ã«ãã® top ã§ãæããããŸãããtop -l 1 -n 20 -o mem -stats pid,command,mem,cmprs ãå®è¡ããŠåããŠãdasd ã® RSS 264MB / CMPRS 46GB ãšãã宿
ãèŠããŸãããã®æ°åã«æ°ã¥ããªããã°ãChrome ã® launchPersistentContext ã180ç§ã§ã¿ã€ã ã¢ãŠãã㊠SNS å
šã¬ãŒã³ã1æ¥åãŸãããšãŒãã«ãªã£ãŠããã¡ã¢ãªã®æåã¯ãšã©ãŒãã°ã«äžè¡ãåºãŠããŸããã
æåç£èŠã¯è§£æ±ºçã«ãªããŸãããæ·±å€3æã« dasd ãæŽèµ°ããŠããç¿æã«çºèŠã§ããã®ã¯ãŒãä»¶ã®ãã°ã ãã§ããlaunchd ã10åããã«ã¹ã¯ãªãããèµ·åããã¹ã¯ãªããã MEM/CMPRS 軞㚠CPU 軞ã®2ã«ãŒãã§å§çž®ã¡ã¢ãªçåŒŸãæ€ç¥ããNEVER_TOUCH ãªã¹ãã§å®å šãæ ä¿ããªããèªååèµ·åããDiscord ã«ã¹ã¯ããçŸåšå€ã€ãã§å ±åããããã®ãµã€ã¯ã«ãèªåã®ç¥ããªãéã«åãç¶ããããšã§ãæçš¿ã¬ãŒã³ã¯ç ã£ãŠããéãæ¢ãŸããªããªããŸããã
å®è£ ã«ãã©ãçããŸã§ã®è©°ãŸãã¯ãã¹ãŠãã¹ã¯ãªããæ¬äœã®ã³ã¡ã³ãã«æ¥æã€ãã§æ®ããŠããŸããã³ãŒãã¯ãã¬ããžã§ããæ¬¡ã«å£ãããšããã³ã¡ã³ããäœãèµ·ããããæããŠãããŸãã
ä»çµã¿ã®å šäœåã»æ120äžã®å èš³ã»30æ¥æé ã¯æænoteã«ãŸãšããŠããŸãã ð Claude CodeèªåŸç°å¢ã§ãå®éã©ã皌ãã â ä»çµã¿ã»å®äŸã»å§ãæ¹ã»ãµããŒã
LilyïŒ@bokuwalilyïŒâ å人éçºè ãClaude Code ã§èªåååºç€ãçµã¿ãªãããiOSã¢ããªãWebãµãŒãã¹ãéç£ããŠããŸã
- AIã§ãå¯ãŠãŠãåãä»çµã¿ããäœã£ãŠæ120äžã«ãã話㯠noteã®ææèšäº ã«ð°
- OSS: github.com/bokuwalily ð
- ææ°æ å ±ã»ãåãåãã㯠X @bokuwalily ãžð
- AIå°å ¥ã»èªååã®çžè«ãšå®è£ ãã³ãã¬7æ¬ã®é åžã¯ å ¬åŒLINE ããð¬
çããã® â€ïž ãã·ã§ã¢ãå±ã¿ã«ãªããŸãïŒ