æ10äžã®å€§åŠçããå§ãŸã£ãŠãæãæã¡ã§æ60äžãŸã§äŒžã°ããäŒç€Ÿéœåã§è§£éãããŠãŒãã«æ»ããå幎ãããŠClaude Codeã®èªåŸç°å¢ã建ãŠçŽããçµæãä»ã¯æå120äžã§åã£ãŠããŸãããã®ç°å¢ã1æ¥ãŸãããšæ¢ãŸã£ãæ¥ã®è©±ãããŸãã
ãªããã®ä»çµã¿ãå¹ãã®ã
ãRSSãå°ããããã»ã¹ã¯å®å šããšãã誀ã£ãåæ
macOSã®ã¡ã¢ãªç£èŠã¯é·å¹Ž top -o mem ã§äºè¶³ããŠããŸãããRSSã®å€§ããé ã«äžŠã¹ãŠãäžããç®èŠã§ç¢ºèªããã500MBè¶
ããŠãããã®ãããã°èª¿ã¹ãããããå€ãã®äººã®éçšã§ãç§ãããæã£ãŠããŸããã
2026幎8æ9æ¥ã«ããã®åæãå®å šã«åŽ©ããŸããã
SNSèªåæçš¿ã®å
šã¬ãŒã³ã1æ¥åãŸãããš0ä»¶ã«ãªã£ãŠããã®ã§ããClaude Codeã管çããPlaywrightã¯åããŠããããã«èŠããããã°ãé¡ããš launchPersistentContext ã180ç§ã§ã¿ã€ã ã¢ãŠããç¶ããŠããŸãããåå ãæ¢ããŠãŸã top -o mem ãå®è¡ããŸãããäžäœ20ããã»ã¹ã«ããã«ãæªãããã®ã¯èŠåœãããŸãããRSSã®äžçªå€§ããããã»ã¹ã§ãæ°GBå°ãdasd ã¯ãªã¹ãã®ã©ãã«ãç»å Žããªãã
top ã®å¥ç»é¢ã§Swap䜿çšéã確èªããæã«æ°ã¥ããŸããã37GB ã§ããç©çRAMã®åè¿ãæ°åã§ããã¹ã¯ããããããŸã§èšããã§ããã°ãæ°ããã¡ã¢ãªèŠæ±ã¯ã»ãŒãã£ã¹ã¯I/Oã«ãªããŸããPlaywrightããã©ãŠã¶ã³ã³ããã¹ããçæããããšããç¬éãOSã¯ã¹ã¯ãããèªã¿æžãããªããããŒãžã確ä¿ããããšããããã180ç§ãè¶
ããŠèœã¡ãã
ã§ã¯ã¹ã¯ããã37GBãŸã§æŒãäžããç¯äººã¯ã©ãã«ããã®ããvm.swapusage ã®æ°åã¯æããã«ç°åžžãªã®ã«ãRSSé ã® top ã«ã¯æ ããªãã
CMPRSåãèŠããšç¯äººããã
macOSã® top ã«ã¯ã-stats ãªãã·ã§ã³ã§ååŸã§ãã cmprsïŒcompressed memoryïŒãšããåããããŸããã¢ã¯ãã£ãã«äœ¿ãããŠããªãã¡ã¢ãªãOSåŽãzlibå§çž®ããŠRAMã«æŒã蟌ã¿ãå®éã®ããŒãžãšã®ãããã³ã°ã ãä¿æããä»çµã¿ã§ããã®å§çž®é åã¯RSSã«ã¯èšäžãããŸãããç©çRAMã䜿ã£ãŠããã®ã«ãRSSç£èŠã«ã¯æ ããªãã
top -l 1 -n 20 -o mem -stats pid,command,mem,cmprs ãå®è¡ãããšãåºåã®äžã« dasd ããããŸããã
PID COMMAND MEM CMPRS
...
1842 dasd 264M 46G
RSSçžåœã® MEM ã¯264MBããããRSSéé ãªã¹ãã«çµ¶å¯Ÿã«äžäœ20ã«å
¥ããªãçç±ã§ãããããã CMPRS 㯠46GBãã¹ã¯ãã37GBã®åå ã¯ããã§ããdasdïŒDuet Activity SchedulerãmacOSã®ããã¯ã°ã©ãŠã³ãã¿ã¹ã¯èª¿åããŒã¢ã³ïŒããèµ·åãã21æéã§å§çž®ã¡ã¢ãªã46GBæ±ã蟌ã¿ãOSã¯ã¹ã¯ããã§éããããéžæè¢ããªããªã£ãŠããŸããã
ãäœæ¥ãã§ã¯ãªããç°å¢ããçŽãçç±
æå120äžã®å®æ ã¯ãèªååã¹ã¯ãªãããšClaude Codeã䞊è¡ããŠåãç¶ããããšã§æç«ããŠããŸããç§ãå¯ãŠããéãSNSãžã®æçš¿ãèµ°ãããã¡ãã«ãåããç¿æã«ã¯çµæããŸãšãŸã£ãŠããããã®ä»çµã¿ã1æ¥æ¢ãŸããšå£²äžã«ãã®ãŸãŸãã¡ãŒãžãå ¥ããŸãã
dasd ãæã§åèµ·åããã ããªã5åã§çµãããŸãããããåé¡ã¯ 次ãŸãæ¢ãŸã ããšã§ããå®éãã®çç¶ã¯ã皌å21æéã§çºçããšã³ã¡ã³ãã«æžãæ®ããŸãããç¿æ¥ãç¿ã
æ¥ãåãããšãèµ·ãããªããæ¯æ top ã確èªã㊠sudo killall dasd ãå©ãäœæ¥ãçºçããŸããããã¯ãäœæ¥ãã§ãããç°å¢ãã§ã¯ãããŸããã
èªåŸç°å¢ã®éåã¯ãèªåãæ°ã¥ããªããŠãçŽã£ãŠãããã§ãã10åããã«ç£èŠã¹ã¯ãªãããèµ°ããéŸå€ãè¶ ãããåèµ·åããDiscordã«éç¥ãæ¥ããç§ãç¿æãã°ãèŠããšããæ·±å€2æ32åã«ååæžã¿ããšããã°ããããç°å¢ã®æ£ããåãæ¹ã§ãã
ããã«ãdasd ã¯åäœã®åé¡ã§ããããŸããã§ãããiiiïŒagentmemoryããšãŒãžã§ã³ãã®ã»ãã·ã§ã³èšæ¶ã管çããNode.jsããã»ã¹ïŒãæéçŽ4GBã§å¢ãç¶ãã second leaker ãšããŠååšããŠããŸããã2ã€ã®æŒããåæã«èµ·ããŠããç¶æ
ã§ãæå察å¿ãåæã«ããä»çµã¿ã§ã¯éçããããŸãã
RSSã§ã¯ãªãCMPRSãéŸå€ã«ããæå³
éŸå€ã®èšèšã倧äºã§ããdasd ã®RSSã¯264MBãéŸå€ãRSSåºæºã«ãããšæ°žé ã«åŒã£ããããŸãããCMPRSãšMEMïŒâRSSïŒãåç®ãã mem åã®å€ã䜿ããŸãã
ã¹ã¯ãªããã® 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 }
}'
}
top ãè¿ã "47G" ã "264M" ãæ°å€MBã«å€æããéŸå€ãšæ¯èŒããŸããdasd 㯠MEM åãã47GãïŒCMPRSãå«ãä»®æ³çãªåèšïŒãšããŠè¡šç€ºãããããã5120MBïŒ5GBïŒã®éŸå€ã§æ£ããæ€ç¥ã§ããŸããRSSã®264MBã§ã¯æ°žé ã«çŽ éãããŸãã
å šäœã®æµã
ã·ã¹ãã æ§æå³
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â launchd (com.lily.mem-hog-guard) â
â æ¯æ :02 :12 :22 :32 :42 :52 ã«èµ·åïŒ10åééïŒ â
ââââââââââââââââââââââââ¬ââââââââââââââââââââââââââââââââââââââ
â
âŒ
top -l 1 -n 20 -o mem \
-stats pid,command,mem,cmprs
â
⌠awk ã§ PIDè¡ä»¥éãæœåº
ââââââââââââââââââââââââââââââ
â pid command mem cmprs â â MEMå = CMPRS蟌ã¿
ââââââââââââââ¬ââââââââââââââââ
â ããã»ã¹ããšã«ã«ãŒã
âŒ
âââââââââââââââââââââââââââââââââââââââââââââââ
â NEVER_TOUCH ã«å«ãŸããïŒ â
â kernel_task / WindowServer / launchd / Finder â
â YES â ã¹ããã â
ââââââââââââââââââââââââ¬âââââââââââââââââââââââ
â NO
âŒ
ââââââââââââââââââââââââââââââââââââââââââââââââ
â AUTO_RESTART_NAMES ã«å«ãŸããïŒïŒdasdïŒ â
â ã〠MEM ⥠5120MB â
â ã〠ã¯ãŒã«ããŠã³æªæºïŒ30åïŒã§ãªã â
â YES â sudo killall / launchd ãèªå埩掻 â
ââââââââââââââââââââââââ¬ââââââââââââââââââââââââ
â NO
âŒ
ââââââââââââââââââââââââââââââââââââââââââââââââ
â LAUNCHD_RESTART_MAP ã«å«ãŸããïŒïŒiiiïŒ â
â ã〠MEM ⥠2048MB â
â YES â TERM â 2ç§åŸ
ã¡ â KILL â
â â kickstart -k â
ââââââââââââââââââââââââ¬ââââââââââââââââââââââââ
â NO
âŒ
ââââââââââââââââââââââââââââââââââââââââââââââââ
â MEM ⥠6144MB â
â YES â Discordéç¥ã®ã¿ïŒè§ŠããªãïŒ â
ââââââââââââââââââââââââââââââââââââââââââââââââ
â å
šããã»ã¹åŠçåŸ
âŒ
findings ãããã° Discordéç¥
swap䜿çšéãæ·»ä»
plistïŒ10åããã«èµ·åããä»çµã¿
<key>StartCalendarInterval</key>
<array>
<dict><key>Minute</key><integer>2</integer></dict>
<dict><key>Minute</key><integer>12</integer></dict>
<dict><key>Minute</key><integer>22</integer></dict>
<dict><key>Minute</key><integer>32</integer></dict>
<dict><key>Minute</key><integer>42</integer></dict>
<dict><key>Minute</key><integer>52</integer></dict>
</array>
StartIntervalïŒç§æ°æå®ã®ããŒãªã³ã°ïŒã§ã600ç§ééã«ããã°åãé »åºŠã«ãªããŸãããStartCalendarInterval ã®ååäœæå®ãéžã³ãŸãããçç±ã¯ã·ã³ãã«ã§ããã°ã®æå»ãã:02ãã:12ããšäžå®ã«ãªããããåŸãããäœæã«ååããããããç®èŠã§ç¢ºèªããããããã§ããRunAtLoad 㯠false ã«ããŠãããŸããããŒãçŽåŸã®ã·ã¹ãã èµ·åçŽåŸã«èµ°ã£ãŠãswapãå®å®ããŠããªããããæåã®10åã¯æ§åèŠã§ãã
Nice 㯠10ïŒäœåªå
床ïŒãLowPriorityIO 㯠true ã«èšå®ããŠãããŸããç£èŠã¹ã¯ãªããèªäœãCPUãI/Oãé£ãã€ã¶ãããæ¬æ«è»¢åã§ããtop -l 1 ã¯è»œãã§ããã念ã®ããã«OSåŽã®ã¹ã±ãžã¥ãŒã©ã«ãããã¯ã°ã©ãŠã³ãåªå
床ã§ããããšæç€ºããŠããŸãã
topã®åºåãawkã§ããŒã¹ããæ žå¿éšå
ã¹ã¯ãªããã®æ žå¿ã¯ãtop -l 1 -n 20 -o mem -stats pid,command,mem,cmprs ã®åºåãããPIDè¡ä»¥éã ããæŸãawkåŠçã§ãã
TOP_RAW=$(top -l 1 -n 20 -o mem -stats pid,command,mem,cmprs 2>/dev/null)
while read -r pid command mem cmprs; do
[ -n "$pid" ] || continue
case "$pid" in ''|*[!0-9]*) continue ;; esac
mem_mb=$(to_mb "$mem")
cmprs_mb=$(to_mb "$cmprs")
...
done <<<"$(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")"
awk ã® /^PID/ ã§ãããè¡ãæ€ç¥ãããã以éã®è¡ã ããåŠçããŸããããã»ã¹åããGoogle Chrome Helperãã®ããã«ã¹ããŒã¹ãå«ãå ŽåããããããNF-2 åç®ãš NF-1 åç®ã mem ãš cmprsã1åç®ã pidã2åç®ãã NF-2 åç®ãŸã§ããã¹ãŠçµåããŠããã»ã¹åãšããŠããŸããæåŸã« gsub(/ /, "", name) ã§ã¹ããŒã¹ãé€å»ããããšã§ãåŸç¶ã®ã·ã§ã«ã® in_list() 颿°ã§åçŽãªæå忝èŒãã§ããããã«ããŠããŸãã
äºéèµ·å鲿¢ã®ããã¯ãå
¥ã£ãŠããŸãã10åããã«èµ·åãããããååã®å®è¡ãäœããã®çç±ã§é·åŒããŠããå ŽåïŒsudo killall ãã¿ã€ã ã¢ãŠãããã±ãŒã¹ãªã©ïŒã«åãPIDã2åkillãã«è¡ããªã¹ã¯ããããŸãã
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 ã¯macOSæšæºã®ã¢ãããã¯ãªããã¯ãã¡ã€ã«äœæã³ãã³ãã§ã-f ã§ããã¯ãã¡ã€ã«ãã¹ã-p ã§PIDãæå®ããŸãããã§ã«æå¹ãªPIDãããã¯ãæã£ãŠããã°å€±æããŠå³åº§ã« exit 0 ããŸããtrap ã§EXIT/HUP/INT/TERMãæãŸããŠããã¯ãè§£æŸããŸãã
ããã»ã¹ã®çš®å¥ã«ãã£ãŠåèµ·åæ¹æ³ãç°ãªãçç±
æ€ç¥ããããã»ã¹ãã©ãåŠçãããã¯ããã®ããã»ã¹ãOSã管çããŠãããã©ãã ã§åå²ããŸãã
dasd ã®ã±ãŒã¹ïŒAUTO_RESTARTïŒ
dasd ã¯macOSã®rootææããŒã¢ã³ã§ãlaunchdãåžžæç®¡çããŠããŸããsudo killall dasd ãå®è¡ãããšãlaunchdãå³åº§ã«æ°ããããã»ã¹ãç«ã¡äžããŸãããŠãŒã¶ãŒåŽã¯äœãèšå®äžèŠã§ããã killããã ãã§ãåèµ·åããå®äºããŸãã
if sudo -n /usr/bin/killall "$command" 2>/dev/null; then
log "restarted $command pid=$pid mem=$mem cmprs=$cmprs"
sudo -n ã¯å¯Ÿè©±çãã¹ã¯ãŒãå
¥åãèŠæ±ããªãé察話ã¢ãŒãã§ããsudoers ã« NOPASSWD ã«ãŒã«ããªãç°å¢ã§ã¯å€±æããŸããããã®å Žåã¯Discordéç¥ã«èœãšããæå察å¿ãä¿ããŸããèªååã匷暩çã«å€±æãããããéç¥ããŠãªãã¬ãŒã¿ã«å€æãå§ããã»ããå®å
šã§ãã
iiiïŒagentmemoryïŒã®ã±ãŒã¹ïŒLAUNCHD_MAPïŒ
iii ã¯ãŠãŒã¶ãŒã®launchdãžã§ããšããŠåãNode.jsããã»ã¹ã§ããããã§æåã«è©Šãã kickstart -k ã ãã®ã¢ãããŒãã倱æããŸããã
宿ž¬ïŒ2026-08-09ïŒã§å€æããã®ã¯ãiii ã¯èµ·åæã«èªåèªèº«ãdetachããŠãã©ãŒã¯ãããããlaunchdã芪ããã»ã¹ïŒnodeïŒãå
¥ãæ¿ããŠããæ§ããã»ã¹ãPPID=1ã®å€å
ãšããŠçãæ®ããšããæåã§ããã¡ã¢ãªãæ±ãããŸãŸæ§ããã»ã¹ãåãç¶ããæ°ããããã»ã¹ãå¢ããã ãã§ãåèšã¡ã¢ãªäœ¿çšéã¯ãããå¢å ããŸããã
æ£ããé åºã¯æ¬¡ã®ãšããã§ãã
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 ãæ®å"
TERM â 2ç§åŸ
ã¡ â KILL â kickstart ã®é ã§ããå
ã«TERMã§ã°ã¬ãŒã¹ãã«ãªçµäºã詊ã¿ã2ç§åŸã« kill -0 ã§çå確èªãããŸã ããã° KILLã§åŒ·å¶çµäºããŸãããã®åŸ kickstart -k ã§launchdã«æ°ããã»ã¹ãèµ·åãããŸããæåŸã«3ç§åŸ
ã£ãŠæ§PIDãæ®åããŠããªããã確èªããæ®ã£ãŠããã°ãã°ã« restart-failed ãèšé²ããŸãã
ã¯ãŒã«ããŠã³ã®èšèšïŒå šäœ1ãã¡ã€ã«ãããããã»ã¹ããšããžã®ä¿®æ£
æåã®å®è£ ã§ã¯ãã¯ãŒã«ããŠã³ã1ã€ã®ãã¡ã€ã«ã§å šäœç®¡çããŠããŸããã
# æ§å®è£
ïŒãã°ããïŒ
COOLDOWN_FILE="$STATE_DIR/.mem-hog-last"
ããã2026-08-09ã«åé¡ãèµ·ãããŸããã16æ42åã« dasd ãååããŠã¯ãŒã«ããŠã³ãèšé²ããçŽåŸãiii ãéŸå€ã®1.5åïŒ3.1GBïŒãŸã§èšããã§ããã«ãããããããã°ããŒãã«ã¯ãŒã«ããŠã³ãæå¹ãªãã30åéäžåååãããŸããã§ããã1ä»¶çŽãããä»ã30åæŸçœ®ã«ãªãèšèšã¯èª€ãã§ãã
ä¿®æ£åŸã¯ ããã»ã¹ããšã«ã¯ãŒã«ããŠã³ãã¡ã€ã«ãæã€ æ§é ã«å€ããŠããŸãã
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)
case "$last" in ''|*[!0-9]*) return 1 ;; esac
[ $(( $(date +%s) - last )) -lt "$COOLDOWN_SEC" ]
}
cooldown_mark() {
local key="$1"
date +%s >"$COOLDOWN_DIR/$(printf '%s' "$1" | tr -c 'A-Za-z0-9._-' '_')"
}
ããã»ã¹åïŒãŸãã¯launchdã©ãã«ïŒããã¡ã€ã«åã«äœ¿ããŸããtr -c 'A-Za-z0-9._-' '_' ã§ãã¡ã€ã«åãšããŠå®å
šãªæåã®ã¿ã«å€æããŸããdasd ã®ååãèµ°ã£ãŠãã30åéã§ããiii ã®ã¯ãŒã«ããŠã³ãã¡ã€ã«ã¯ç¬ç«ããŠãããããiii ãéŸå€ãè¶
ããæ¬¡ã®10åãµã€ã¯ã«ã§ååãèµ°ããŸãã
NEVER_TOUCHãªã¹ããæç€ºçã«å®çŸ©ãããŠããŸãã
NEVER_TOUCH="kernel_task WindowServer launchd loginwindow Finder"
kernel_task ã¯macOSãCPUãµãŒãã«ã¹ããããªã³ã°ã«äœ¿ãç¹æ®ããã»ã¹ã§ãkillããã°ã·ã¹ãã ãããªãŒãºããŸããWindowServer ã¯GUIå
šäœã管çããŠããããããèœãšããšç»é¢ãæ¶ããŸãããããã¯éŸå€ä»¥äžã«èšããã§ããŠã絶察ã«è§ŠããŸãããNOTIFY_ONLYïŒ6144MBè¶
ãïŒã®ã«ããŽãªã§éç¥ã ãããŠã倿ã¯äººéã«å§ããŸãã
å®è£ ã®è©³çް
launchdã³ã³ããã¹ãã§ã¯PATHãæç€ºãã
ã¹ã¯ãªããã®åé ã¯ãããªã£ãŠããŸãã
set -uo pipefail
PATH="/usr/bin:/bin:/usr/sbin:/sbin"
export PATH
PATH ã4ãã£ã¬ã¯ããªã«éå®ããŠããã®ã¯ãlaunchdããèµ·åããããã»ã¹ãç¶æ¿ããPATHã /usr/bin:/bin ã ãã ããã§ãã~/.zshrc ã«äœãæžããŠããŠããHomebrewã /opt/homebrew/bin ã«çœ®ããããŒã«ããnvmã管çããNode.jsããlaunchdããã¯äžåèŠããŸããã
ãã®ã¹ã¯ãªãããåŒã¶ã³ãã³ã㯠topã»awkã»sysctlã»killallã»launchctlã»shlock ã®ã¿ã§ãããã¹ãŠ /usr/bin ã /usr/sbin ã«ååšããŸãããæ¬²ãããã®ãå
šéšæã€ãã®ã§ã¯ãªãã䜿ããã®ã ãã確å®ã«æã€ãèšèšã§ãã4ãã£ã¬ã¯ããªä»¥å€ãå«ããªããã€ãŸã ~/.nvm é
äžã®ã©ã³ã¿ã€ã ãPATHã«ä¹ããªãããšãä¿èšŒããŠããããšããèŠæ¹ãã§ããŸãã
set -uo pipefail ã䜿ã set -e ãé¿ããçç±
set -e ã䜿ããšããŒã以å€ã®çµäºã³ãŒããè¿ããã³ãã³ãã§ã¹ã¯ãªããã峿»ããŸãããããæ£ãããªãå Žé¢ããããŸãã
kill -TERM "$pid" 2>/dev/null || true
sleep 2
kill -0 "$pid" 2>/dev/null && kill -KILL "$pid" 2>/dev/null || true
kill -0 ã¯ããã»ã¹ã®çå確èªã§ããTERMãå¹ããŠ2ç§åŸã«å¯Ÿè±¡ããã»ã¹ãæ¶ããŠããã®ã¯æ£åžžç³»ã§ããããã®å Žå kill -0 ã¯çµäºã³ãŒã1ãè¿ããŸããset -e ç°å¢ã§ã¯ || true ãæžããŠããŠããæ¡ä»¶åŒããµãã·ã§ã«å±éã®æèã«ãã£ãŠããšã©ãŒãåžåã§ããŠããããã®æåã埮åŠã«å€ããããããããã¯å€±æããŠãããã確å®ã«è¡šçŸãã«ãããªããŸãã
set -uïŒæªå®çŸ©å€æ°ã®åç
§ã§ãšã©ãŒïŒãš pipefailïŒãã€ãã®éäžã³ãã³ãã倱æãããå
šäœãå€±ææ±ãïŒã¯å¿
èŠã§ããã ãã set -uo pipefail ã ããéžã³ã蚱容ããã倱æç®æã¯ || true ã§æç€ºçã«ããŒã¯ããæ¹éãåã£ãŠããŸããcase "$pid" in ''|*[!0-9]*) continue ;; esac ãšããæ°å€ãã§ãã¯ããset -u ããã以äžã¯ç©ºæåååç
§ã§èœã¡ããªã¹ã¯ãžã®ã¬ãŒãã§ãã
LAUNCHD_RESTART_MAPã®ããŒã¹
è€æ°ã®ãžã§ããç°å¢å€æ°ã²ãšã€ã§èšå®ã§ããããã"ããã»ã¹å=launchdã©ãã«:éŸå€MB" ã®åœ¢åŒãæ¡çšããŠããŸãã
LAUNCHD_RESTART_MAP="${MEM_HOG_LAUNCHD_MAP:-iii=com.lily.agentmemory:2048}"
ããŒã¹éšåã¯ãããªã£ãŠããŸãã
for m in $LAUNCHD_RESTART_MAP; do
case "$m" in "$command="*) entry="${m#*=}"; break ;; esac
done
label="${entry%:*}"
limit="${entry##*:}"
${m#*=} ã¯POSIXæºæ ã®ãã©ã¡ãŒã¿å±éã§ã= ããåãæçãããã§åé€ããŸããiii=com.lily.agentmemory:2048 ãã com.lily.agentmemory:2048 ãåãåºããŸããç¶ã㊠${entry%:*} ã§ : ããåŸããæçãããåé€ã㊠com.lily.agentmemoryã${entry##*:} ã§ : ããåãæé·ãããåé€ã㊠2048 ãåŸãŸãã
**% ããåŸãããã»çãåŽãã## ããåããã»é·ãåŽã**ã§ããlaunchdã©ãã«ã¯ com.foo.bar.baz ã®ããã«ãããåºåãã§ãã³ãã³ãå«ãŸãªãåœåèŠåãªã®ã§ããã®å±éã¯ç¢ºå®ã«æ©èœããŸããã¹ããŒã¹ã§åºåãã°è€æ°ãšã³ããªã䞊ã¹ãããŸãããçŸç¶ã®ç®¡ç察象㯠iii ã ããªã®ã§1ãšã³ããªã§ãã
DRY_RUNã¢ãŒãã§éŸå€ãå®ããŒã¿ã§ç¢ºèªãã
case "${1:-}" in
'') ;;
--dry-run) DRY_RUN=1 ;;
*) printf 'Usage: %s [--dry-run]\n' "$0" >&2; exit 2 ;;
esac
launchdã«ããŒãããåã« bash ~/.claude/scripts/mem-hog-guard.sh --dry-run ãå®è¡ããŸããçŸåšã®ã¡ã¢ãªç¶æ
ã«å¯ŸããŠäœãããªã¬ãŒããããããå®éã®killãªãã«ç¢ºèªã§ããŸãã
WOULD RESTART: dasd (pid=1842) ã MEM 47G/å§çž® 46G ãæ±ããŠãã -> åèµ·å
swap: total = 40.00G used = 37.12G free = 2.88G (encrypted)
dry-run çµäº
éŸå€ãåã£ãŠããããNEVER_TOUCHãå¹ããŠããããæ³å®å€ã®ããã»ã¹ã察象ã«ãªã£ãŠããªãããæ¬çªãããã€åã«å®ããŒã¿ã§ç¢ºèªã§ããŸãããã®ç¢ºèªãªãã«launchdãžããŒããããšã次ã®10åãµã€ã¯ã«ã§äœããæå³ããkillãããå¯èœæ§ããããŸããéŸå€ãèšå®ããåã«å¿
ã --dry-run ã§çŸåšã®ç¶æ
ãèŠããããã®çš®ã®ã¹ã¯ãªããã®åºæ¬æé ã§ãã
éç¥ã®éç©ãšæçµ1åéä¿¡
findings=""
# ã«ãŒãå
:
findings="${findings}â
${msg}"$'\n'
# ã«ãŒãåŸ:
if [ -n "$findings" ]; then
swap=$(sysctl -n vm.swapusage | sed 's/vm.swapusage: //')
notify "ð§ mem-hog-guard
$findings
swap: $swap"
fi
findings ãã«ãŒãå
ã§æååçµåããŠç©ã¿äžããå
šããã»ã¹ã®èµ°æ»ãçµãã£ãåŸã«1åã ãDiscordãžæããŸãã10åãµã€ã¯ã«ã§è€æ°ããã»ã¹ãåæã«éŸå€è¶
ãããŠããŠããAPIã³ãŒã«ã¯1åã§æžã¿ãŸãã$'\n' ã¯bashã® $'...' èšæ³ã§ãªãã©ã«æ¹è¡ãçæããŸããåçŽãªããã«ã¯ã©ãŒãæååã«æ¹è¡ãæ··ãããšãå±éæèã«ãã£ãŠãšã¹ã±ãŒãã厩ããããšãããããããã®èšæ³ã䜿ã£ãŠããŸãã
ã¹ã¯ãã䜿çšéã¯å
šèµ°æ»ãçµãã£ãåŸã« sysctl -n vm.swapusage ã§ååŸããŸãïŒ-n ã§å€ã®ã¿ïŒãsed 's/vm.swapusage: //' ã§ããŒéšåãé€å»ããæ°å€æååã ããéç¥æ¬æã«å«ããŸãã
ç§ãè©°ãŸã£ã話
kickstart -k ã ãã§è©Šãããã¡ã¢ãªãå¢ãã
æåã«iiiãžã®å¯ŸåŠãšã㊠launchctl kickstart -k "gui/$(id -u)/com.lily.agentmemory" ã ããå®è¡ããŸãããå®è¡çŽåŸã« ps aux | grep iii ã§ç¢ºèªãããšã2ã€ã®PIDã䞊ãã§ããŸããæ§ããã»ã¹ãæ®åãããŸãŸæ°ããã»ã¹ãç«ã¡äžãã£ãŠãããåèšã¡ã¢ãªäœ¿çšéã¯åååããå¢ããŠããŸããã
åå ã¯iiiã®èµ·åãã¿ãŒã³ã§ããiiiã¯Node.jsããã»ã¹ãšããŠèµ·åããŸãããåæååŸã«èªåèªèº«ãdetachããŠãã©ãŒã¯ããŸããlaunchdãææ¡ããŠããã芪ããã»ã¹ãã¯ãã©ãŒã¯åã®çåœãªnodeããã»ã¹ã§ãããkickstartã§çœ®ãæããã®ã¯ãã®èŠªã ãã§ãããã©ãŒã¯åŸã«åžžé§ããå®äœããã»ã¹ã¯ PPID=1ïŒlaunchdçŽèœã®å€å
ïŒã«ãªã£ãŠãããlaunchdã®ãžã§ã管çã®å€ã«åºãŠããŸã£ãŠããŸãã
ã³ãŒãã«ããã®çµç·¯ãã³ã¡ã³ãã§æ®ã£ãŠããŸãã
# kickstart ã ãã§ã¯è¶³ããªãã宿ž¬(2026-08-09): launchd ã¯èŠª(node)ãå
¥ãæ¿ããã
# iii 㯠detach ã㊠spawn ããããã ppid=1 ã®å€å
ãšããŠçãæ®ãã
# ã¡ã¢ãªãæ±ãããŸãŸæ°ããã»ã¹ãå¢ããã ãã ã£ããå
ã«æ¬äœãèœãšãã
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 ãæ®å"
æ£ããé åºã¯ããŸãæ¬äœãTERMã§èœãšãã2ç§åŸ
ã£ãŠ kill -0 ã§çå確èªãããŸã ããã°KILLã§åŒ·å¶çµäºãããããkickstartã§æ°ããã»ã¹ãèµ·åããããã§ããkickstartãå
ã«å®è¡ããŠããŸããšããlaunchd芳ç¹ã§ã¯æ°ããã»ã¹ãèµ°ã£ãŠãããã®ã«ãPPID=1ã®æ§ããã»ã¹ãèµ°ã£ãŠããããšããäºéèµ·åç¶æ
ã«ãªããŸããæåŸã® sleep 3 ãš kill -0 ã§æ§PIDã®æ®åã確èªããæ®ã£ãŠããã° restart-failed ããã°ã«èšé²ããŸãããã®ç¢ºèªã¹ããããå
¥ããã®ãããååããã€ãããå®ã¯å¢ããŠããããšããæåã®å€±æãèžãã ããã§ãã
16:42ã«ååããã16:52ã®iiiã30åæŸçœ®ããã
åæå®è£ ã®ã¯ãŒã«ããŠã³ã¯1ãã¡ã€ã«ã§å šããã»ã¹å ±éã§ããã
# æ§å®è£
COOLDOWN_FILE="$STATE_DIR/.mem-hog-last"
2026幎8æ9æ¥16æ42åã« dasd ã®ååãèµ°ããã¯ãŒã«ããŠã³ãã¡ã€ã«ã«ã¿ã€ã ã¹ã¿ã³ããèšé²ãããŸããããã®çŽåŸãiii ã¯éŸå€2048MBã«å¯ŸããŠ3.1GBïŒçŽ1.5åïŒãŸã§èšããã§ããŸãããããã16æ52åã®ãµã€ã¯ã«ã§ã°ããŒãã«ã¯ãŒã«ããŠã³ãæå¹ãšå€å®ãããiii ã®ååãã¹ããããããŸããåãããšã17æ02åã»17æ12åãšç¶ãã30åé iii ãæŸçœ®ãããŸããã
ãçŽããã°ããã ããå°ãæ§åãèŠãããšããæå³ã§ã¯ãŒã«ããŠã³ãå®è£
ããã®ã«ããdasd ãååããããã§ iii ã®ååãæ¢ãŸãããšããé广ã«ãªã£ãŠããŸããããã°ãèŠè¿ããŠãã®äºå®ã«æ°ã¥ããã®ã¯ç¿æã§ããã³ãŒãã®ã³ã¡ã³ãã« 16:42ã«dasdãååãã30åé㯠iii ãéŸå€ã®1.5å(3.1GB)ãŸã§èšããã§ãäžåååãããªãã£ã ãšæžãæ®ããã®ã¯ã次ã«ã³ãŒããèªãã ãšãã«åãèšèšã«æ»ããªãããã§ãã
ä¿®æ£åŸã¯ããã»ã¹åïŒãŸãã¯launchdã©ãã«ïŒããã¡ã€ã«åã«ããŠç¬ç«ããã¯ãŒã«ããŠã³ãæãããŠããŸãã
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)
case "$last" in ''|*[!0-9]*) return 1 ;; esac
[ $(( $(date +%s) - last )) -lt "$COOLDOWN_SEC" ]
}
tr -c 'A-Za-z0-9._-' '_' ã§launchdã©ãã«ïŒcom.lily.agentmemoryïŒããã®ãŸãŸãã¡ã€ã«åã«å€æããŸããdasd ã®ã¯ãŒã«ããŠã³ãã¡ã€ã«ã¯ dasdãiiiã®ãã㯠com.lily.agentmemory ãšããŠå®å
šã«ç¬ç«ããŠååšããŸãã2ä»¶ãåæã«éŸå€è¶
ãããŠããããããã®ã¿ã€ããŒã§ç¬ç«å¶åŸ¡ãããŸãã
launchdããèµ·åãããšã¹ã¯ãªããã峿»ãã
åæçã§ã¯PATHãæç€ºããŠããŸããã§ãããã¿ãŒããã«ããã®æåå®è¡ã¯åé¡ãªãåãã®ã«ãlaunchdã«ããå®æèµ·åãæ¯å倱æããäºæ
ã«ãªããŸãããlog show --predicate 'process == "mem-hog-guard"' ã§ç¢ºèªãããšãã¹ã¯ãªãããçµäºã³ãŒã127ã§å³æ»ããŠããŸããã127ã¯ã·ã§ã«ããã³ãã³ããèŠã€ãããªãããšè¿ãçµäºã³ãŒãã§ãã
launchdãèµ·åããããã»ã¹ãæã€PATH㯠/usr/bin:/bin ã ãã§ãã~/.zshrc ã®èšå®ã¯å®å
šã«ç¡èŠãããŸããHomebrewã /opt/homebrew/bin ã«çœ®ããããŒã«ããnvmã管çããNode.jsããlaunchdããã¯èŠããŸããã
åé¡ã¯ã¿ãŒããã«ã§è©ŠããŠãããšãã«ã¯çµ¶å¯Ÿã«åçŸããªãç¹ã§ããzsh ãèµ·åãããš .zshrc ãèªã¿èŸŒãŸããŠPATHãéããããæåå®è¡ã¯æåããŸããlaunchdã®ã³ã³ããã¹ãã«å
¥ã£ãŠåããŠå€±æããŸããlaunchdã¹ã¯ãªãããæžããšãã«ãã¿ãŒããã«ã§åããïŒlaunchdã§ãåãããšããåæã¯æãç«ã¡ãŸããã
çŸåšã®ã¹ã¯ãªããã PATH="/usr/bin:/bin:/usr/sbin:/sbin" ã2è¡ç®ã«çœ®ããŠããã®ã¯ã䜿ãã³ãã³ãïŒtopã»awkã»sysctlã»killallã»launchctlã»shlockïŒã /usr/bin ãš /usr/sbin ã«ããååšããªãããšã確èªããããã§ããã®4ãã£ã¬ã¯ããªãæç€ºããŠããããã§ãããã®2è¡ãå
¥ããŠãããlaunchdã«ããå®æèµ·åã§PATHèµ·å ã®å€±æã¯1床ãçºçããŠããŸãããlaunchdã¹ã¯ãªãããæžããšãæåã«ç¢ºèªãã¹ãäºé
ãšããŠãä»ã§ã¯åå°çã«æžãããã«ãªã£ãŠããŸãã
ã€ãŸãããã€ã³ã
åæ®µã§è©³è¿°ãã3ã€ã®å€±æïŒkickstartåç¬ã§å€å ãæ®ã£ãã»ã°ããŒãã«ã¯ãŒã«ããŠã³ã§30åæŸçœ®ã»launchdããPATH127æ»ïŒä»¥å€ã«ããå®è£ äžã«åŒã£ããã£ããã€ã³ããç¶²çŸ ããŸãã
plistèšèšãŸãã
-
RunAtLoad trueã«ãããšOSèµ·åçŽåŸã«èµ°ãã èµ·åçŽåŸã¯swapçµ±èšãå®å®ããŠããªããããæ£åžžå€ããé«è² è·ããšèª€å€å®ããŠããŒã¢ã³ãåèµ·åããããšãããã<false/>ãæç€ºããã -
StandardOutPath/StandardErrorPathãçžå¯Ÿãã¹ã§æžããšlaunchdãæžããªãã launchdã®ã«ã¬ã³ããã£ã¬ã¯ããªã¯ã«ãŒãïŒ/ïŒã~/.cache/...ã®ãã«ãå±éãå¹ããªãããããã«ãã¹ãçŽæžãããããã°ãäžåæ®ããªãã®ã«plistããŒãã¯æåããã®ã§ããåããŠããã®ã«äœãèšé²ãããªãããšããç¶æ ã«æ°ã¥ãã«ããã -
StartInterval 600ïŒç§æ°ããŒãªã³ã°ïŒã«ãããšOSåèµ·ååŸã«æå€§10åã®ç©ºçœãçãŸãããStartCalendarIntervalã®ååäœæå®ïŒ:02/:12/:22/:32/:42/:52ïŒãªããåèµ·ååŸã次ã®ã:XXåããæ¥ãã°ç¢ºå®ã«çºç«ãããããã«ãã°ã®æå»ããæ¯æ:02ããšåºå®ã«ãªãããããäœæã«ååããããããç¿æãã°ã§è¿œããšãã«ç®èŠããããã -
NiceãšLowPriorityIOãçç¥ãããšOSåŽã®ã¹ã±ãžã¥ãŒã©ã«ãšã£ãŠãã©ã¢ã°ã©ãŠã³ãæ±ãã«ãªãã æ¯10åèµ·åããç£èŠã¹ã¯ãªããèªäœãI/Oãã¥ãŒã«å²ã蟌ãã®ã¯æ¬æ«è»¢åãNice 10ãšLowPriorityIO trueã¯æäœéå ¥ããã
ã·ã§ã«ã¹ã¯ãªãããŸãã
-
awkã§gsub(/ /, "", name)ãå¿ãããšãã¹ããŒã¹å ¥ãããã»ã¹åã®æ¯èŒãæ°žé ã«å€±æãããGoogle Chrome Helper (Renderer)ã¯while read -r pid command mem cmprsã®æç¹ã§ãã£ãŒã«ãåè§£ãããcommandãGoogleã ãã«ãªããawkå ã§ã¹ããŒã¹ãé€å»ããŠ1æååã«çµåããŠããin_list()ã«æž¡ãã -
case "$pid" in ''|*[!0-9]*) continue ;; esacã®ã¬ãŒããå€ããšããããæ®æ»ã空è¡ãkillã®åŒæ°ã«æž¡ãã-n 20ã®åºåãç°å¢ãtopã®ããŒãžã§ã³å·®ã§ä¹±ããã±ãŒã¹ããããçŽç²æ°å€ãã§ãã¯ã¯å€ããªãã -
trap '/bin/rm -f "$LOCK_FILE"' EXIT HUP INT TERMãæžããªããšãéäžæ»äº¡ã§ããã¯ãã¡ã€ã«ãæ®åããã æ¬¡ã®ãµã€ã¯ã«ã§ã¯shlockããåã®ããã»ã¹ãçããŠããããšå€å®ãå šã¹ããããç¶ãããäœãèµ·ããªããéç¥ãæ¥ãªãã®ã§ãæ°ã¥ãã®ãããã«é ããã -
kill -TERMçŽåŸã«kickstartãå®è¡ãããšæ°æ§2ããã»ã¹ã䞊走ããã TERMâ2ç§åŸ ã¡âkill -0çå確èªâKILLâkickstart ã®é åºãå®ããªããšãååããã€ããããå€ãããã»ã¹ïŒæ°ããããã»ã¹ãã®äºéèµ·åã«ãªãã¡ã¢ãªãå¢ããã
éŸå€ã»æ€ç¥ãŸãã
-
-n 20ã¯äžäœ20ä»¶ããååŸããªãã MEMéé ã§äžŠã¶ãããRSSãå°ããCMPRSã巚倧ãªããã»ã¹ã¯äžäœã«åããããç£èŠå¯Ÿè±¡ããã»ã¹ãæ¢ç¥ã§ããã°-n 50ã«å¢ããããåŸå·¥çšã§ps -eo pid,comm,rssãè£å®ããã -
NEVER_TOUCHã空ã«ãããškernel_taskãkillã®åè£ã«ãªããkernel_taskã¯CPUãµãŒãã«ã¹ããããªã³ã°ã®ããã«OSã䜿ãç¹æ®ããã»ã¹ã§ãkillãããšã·ã¹ãã ãããªãŒãºãããkernel_task WindowServer launchd loginwindow Finderã®5ã€ã¯æå°ã»ãããšããŠå¿ ãå®çŸ©ãããèªåã®ç°å¢ã§ã絶察ã«èœãšããŠã¯ãããªããããã»ã¹ã¯äºåã«DRY_RUNã§æŽãåºããŠè¿œå ããã -
sudo -n killall dasdã¯sudoersã«NOPASSWDã«ãŒã«ããªãç°å¢ã§ãµã€ã¬ã³ã倱æããã ã¹ã¯ãªããã¯ãã®ãšãrestart-failed(no-sudo)ããã°ã«æžããDiscordéç¥ã«ãæå:sudo killall dasdããæ·»ããŠãã©ãŒã«ããã¯ããããããã€åã«sudo visudoã§/usr/bin/killallã ãã«éå®ããŠNOPASSWDãä»äžããŠãããALL=(ALL) NOPASSWD: ALLã®ããã«åºãããšå¥ã®ãªã¹ã¯ãçãŸããã -
DRY_RUNãªãã«æ¬çªlaunchdãžããŒãããªããbash ~/.claude/scripts/mem-hog-guard.sh --dry-runãå®è¡ãããšçŸåšã®ç¶æ ã«å¯ŸããŠãWOULD RESTARTããWOULD NOTIFYããåºåããããæå³ããªãããã»ã¹ãåŒã£ããã£ãŠããªãããéŸå€ã宿°å€ã«å¯ŸããŠåŠ¥åœãã確èªããŠããlaunchctl loadããã -
éç¥ã¹ã¯ãªããïŒ
~/.discord/notify.shïŒã®å®è¡æš©éïŒxãããïŒããªããšéç¥ãªãã§ãµã€ã¬ã³ãåäœãããnotify()颿°ã¯[ -x "$NOTIFY_SCRIPT" ]ã§æš©é確èªãããªããã°éãã«return 1ããããšã©ãŒã¯åºãªããéç¥ãæ¥ãªããls -la ~/.discord/notify.shã§xãããã確èªããã
ãã¹ããã©ã¯ãã£ã¹
1. CMPRSãå«ã mem åã§éŸå€ãèšå®ãã
top -stats pid,command,mem,cmprs ã® mem åã¯CMPRS蟌ã¿ã®åèšå€ã§ããRSSã ãã§ç£èŠããŠãããšãRSS 264MBã»CMPRS 46GBã®ããã»ã¹ã¯æ°žé ã«æ€ç¥ã§ããŸãããto_mb() 颿°ã§T/G/M/Kã®å
šåäœã倿ããæ°å€MBã§éŸå€æ¯èŒããã®ãæå°ç¢ºå®ãªèšèšã§ãã
2. launchdã¹ã¯ãªããã®2è¡ç®ã§PATHãåºå®ãã
PATH="/usr/bin:/bin:/usr/sbin:/sbin"
export PATH
ãã®2è¡ãå
¥ããåŸãlaunchdã«ããå®æèµ·åã§ã®PATHèµ·å 倱æã¯1床ãçºçããŠããŸããã䜿ãã³ãã³ãïŒtopã»awkã»sysctlã»killallã»launchctlã»shlockïŒãå
šãŠ /usr/bin ã /usr/sbin ã«ããããšãå
ã«ç¢ºèªãããã®4ãã£ã¬ã¯ããªã ãã宣èšããŸãããã¿ãŒããã«ã§åããïŒlaunchdã§åããã¯æãç«ã¡ãŸããã
3. set -uo pipefail ã ã䜿ãã倱æèš±å®¹ç®æã || true ã§æç€ºãã
set -e 㯠kill -0ïŒããã»ã¹çå確èªïŒã®çµäºã³ãŒã1ã§ã¹ã¯ãªãããæ»ã¬å Žé¢ããããŸããæªå®çŸ©å€æ°åç
§ãšãã€ãéäžã®å€±æã ãã set -uo pipefail ã§æŸãã倱æããŠããã³ãã³ãã«ã¯ || true ãæ·»ããŠæå³ãæç¢ºã«ããŸãã
4. ã¯ãŒã«ããŠã³ã¯ããã»ã¹ããšã«ç¬ç«ãããã¡ã€ã«ã§ç®¡çãã
COOLDOWN_DIR="$STATE_DIR/cooldown"
file="$COOLDOWN_DIR/$(printf '%s' "$key" | tr -c 'A-Za-z0-9._-' '_')"
dasd ãš iii ã®ã¯ãŒã«ããŠã³ãç¬ç«ããŠããããã2ä»¶ãåæã«éŸå€è¶
ãããŠãçæ¹ã30åæŸçœ®ãããããšããããŸãããããã»ã¹åããã¡ã€ã«åã«ããéã® tr -c 'A-Za-z0-9._-' '_' ã§launchdã©ãã«ã®ãããåºåããå®å
šã«ãã¡ã€ã«åãžå€æã§ããŸãã
5. launchd管çããã»ã¹ã®åèµ·åã¯ãTERM â 2ç§åŸ ã¡ â KILL â kickstart â 3ç§åŸ ã¡ â æ®å確èªãã®é ãå®ã
é åºã®æå³ã¯æç¢ºã§ããTERMã§ã°ã¬ãŒã¹ãã«ãªçµäºã詊ã¿ãã2ç§åŸã« kill -0 ã§çå確èªãããŸã ããã° KILLã§åŒ·å¶çµäºããããã®åŸkickstartã§æ°ããã»ã¹ãèµ·åããããæåŸã«3ç§åŸ
ã£ãŠæ§PIDãæ®åããŠããªããã確èªããæ®ã£ãŠããã° restart-failed ããã°ã«èšé²ããŸããkickstartãå
ã«æã€ãšæ°æ§äºéèµ·åã«ãªããŸãã
6. 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 ã¯macOSæšæºã®ã¢ãããã¯ãªããã¯äœæã³ãã³ãã§ãã10åééã§èµ·åããã¹ã¯ãªãããååã®å®è¡ãšéè€ããå Žåã«ãåãPIDã2åkillãã«è¡ãã®ãé²ããŸããtrap ãå¿ãããšéäžæ»äº¡ã§ããã¯ãæ®åãã以éã®ãµã€ã¯ã«ãå
šã¹ãããããç¶ããŸãã
7. NEVER_TOUCH ãªã¹ããæç€ºããDRY_RUNã§äºåã«åŒã£ããã確èªãã
æäœ5ããã»ã¹ïŒkernel_task WindowServer launchd loginwindow FinderïŒãå®çŸ©ãã--dry-run ãå®è¡ããŠãWOULD RESTARTãã«æå³ããªãããã»ã¹ãçŸããªããã確èªããŠããlaunchdã«ããŒãããŸããéŸå€ãäœãèšå®ãããšæ®æ®µäœ¿ãã®ã¢ããªã察象ã«ãªãããšããããŸãã
8. sudo -n killall ã¯NOPASSWDèšå®æžã¿ã確èªããŠãããããã€ãã
sudoersãžã®è¿œå 㯠/usr/bin/killall ã³ãã³ãã®ã¿ã«éå®ããŸããlaunchdããã®èµ·åã¯ãã°ã€ã³ã»ãã·ã§ã³å€ãªã®ã§ããã¹ã¯ãŒãå
¥åãæ±ããéåžžã® sudo ã¯åäœããŸãããNOPASSWDãèšå®ãããŠããªãå Žåã¯éç¥ãã©ãŒã«ããã¯ãå¿
èŠã§ãã¹ã¯ãªããã¯ãããæšæºã§å®è£
ããŠããŸãããããã€åã« sudo -n /usr/bin/killall --help ãæåããã確èªããŸãïŒãšã©ãŒãªãå³åº§ã«è¿ãã°æš©éããïŒã
9. éç¥ã¯ã«ãŒãåŸã«1åãŸãšããŠéã
findings="${findings}â
${msg}"$'\n' # ã«ãŒãå
: ç©ã¿äžããã ã
# ã«ãŒãåŸ:
if [ -n "$findings" ]; then notify "ð§ mem-hog-guard\n${findings}\nswap: $swap"; fi
è€æ°ããã»ã¹ãåæã«éŸå€è¶
ãããŠãAPIã³ãŒã«ã¯1åã§æžã¿ãŸããã¹ã¯ãã䜿çšéã¯å
šèµ°æ»åŸã« sysctl -n vm.swapusageïŒ-n ã§å€ã®ã¿ïŒã§ååŸããŠæ·»ä»ããŸããfindings ã空ã§ããã°éç¥èªäœãéããªããããéé³ãªæ£åžžçšŒåãµã€ã¯ã«ã«ã¯Discordã®éç¥ãæ¥ãŸããã
10. ããŒã«ã«ãã°ãšDiscordéç¥ã®äž¡æ¹ãæ®ã
ãã°ã«ã¯ [2026-08-11 02:32:17] restarted dasd pid=1842 mem=47G cmprs=46G ã®ããã«ã¿ã€ã ã¹ã¿ã³ãã»PIDã»ã¡ã¢ãªéãèšé²ããŸããDiscordéç¥ã¯å³ææ§ã®ããã«ãããããŒã«ã«ãã°ã¯è¿œè·¡ã®ããã«ãããŸãããéç¥ã¯åãåã£ããå®éã«ã¯ååãããŠããªãã£ãïŒæ§ããã»ã¹ãæ®åããïŒããšããä¹é¢ã¯ãã°ã® restart-failed ããçºèŠã§ããŸãã
11. to_mb() ã§T/G/M/Kãå
šåäœã«ããŒãã
çŸè¡ã® dasd 㯠"47G" ãè¿ããŠããŸãããå°æ¥ "1.2T" ã "512K" ãè¿ãããã»ã¹ã«å¯ŸããŠãæ£ããéŸå€æ¯èŒã§ãããããå
š4åäœãåå²ããawkãå
¥ããŸãã1åäœæ¬ ãããšæ¯èŒæŒç®ã«0ã空æåãå
¥ããæå³ããªãããªã¬ãŒïŒãŸãã¯æ°žé ã«æ€ç¥ããªãïŒãèµ·ããŸãã
12. å€å æ®å確èªã¹ããããå€ããªã
kickstartåŸã« sleep 3 ã㊠kill -0 "$pid" ã§æ§PIDãæ¶ããŠãããã確èªããŸããæ®ã£ãŠããã° restart-failed ããã°ã«èšé²ããŸãããååå®äºããšããéç¥ãæ¥ãŠããŠãæ§ããã»ã¹ãšæ°ããã»ã¹ãäºéèµ·åããŠããäºå®ã¯ããã®ç¢ºèªã¹ãããã ããæããŠãããŸãã2026幎8æ9æ¥ã®å®è£
忥ã«ãããå€ããŠããããããkickstartåŸã«ã¡ã¢ãªãå¢ããŠããããšããäºå®ã«æ°ã¥ããŸã§ã«æ°ãµã€ã¯ã«ããããŸããã
ãŸãšã
top -o mem ã®RSSéé ç£èŠã«æ§é çãªç²ç¹ããããŸããmacOSã®å§çž®ã¡ã¢ãªïŒCMPRSïŒã¯RSSã«èšäžãããªããããRSS 264MBã®ãŸãŸå§çž®ã¡ã¢ãª46GBãæ±ãã dasd ã¯ãªã¹ãã®ã©ãã«ãçŸããŸããããã®ç²ç¹ãswap 37GBãšããç¶æ
ãäœãåºããPlaywrightã®launchPersistentContextã180ç§ã§ã¿ã€ã ã¢ãŠããç¶ããSNSèªåæçš¿ã1æ¥åãŸãããšãŒãã«ãªããŸãããæå120äžã®ç°å¢ã1æ¥æ¢ãŸããšãã®ãŸãŸãã¡ãŒãžã«ãªããŸãã
mem-hog-guard.sh ãè§£ãã®ã¯3ã€ã®åé¡ã§ããCMPRSãå«ã mem åã§æ€ç¥ããïŒRSSã§ã¯æ°žé ã«çŽ éãïŒãããã»ã¹ã®ç®¡çäž»äœã«å¿ããŠåèµ·åæ¹æ³ãå€ããïŒOSããŒã¢ã³ã¯ killall ã®ã¿ããŠãŒã¶ãŒlaunchdãžã§ãã¯ãTERMâKILLâkickstartãã®é åºãå¿
èŠïŒãã¯ãŒã«ããŠã³ãããã»ã¹ããšã«ç¬ç«ãããïŒå
šäœ1ãã¡ã€ã«ã«ãããšè€æ°æŒãã®çæ¹ã30åæŸçœ®ãããïŒã
launchdã® StartCalendarInterval ã§10åããã«èµ°ãããNice 10 ãš LowPriorityIO true ã§ããã¯ã°ã©ãŠã³ãåªå
åºŠã«æãããããã¯ãã¡ã€ã«ã§äºéèµ·åãé²ããã¯ãŒã«ããŠã³ã§é£ç¶åèµ·åãé²ãã--dry-run ã§æ¬çªããŒãåã«å®ããŒã¿ç¢ºèªãããããããæããããšã§ãèªåãæ°ã¥ããªããŠãçŽã£ãŠãããç°å¢ãæç«ããŸããç¿æãã°ãéããŠãæ·±å€2æ32åã«ååæžã¿ãswap 4.1GBãŸã§äœäžããšããã°ããã®å€ã®å£²äžã¯å®ãããŠããŸãã
ä»çµã¿ã®å
šäœåã»æ120äžã®å
èš³ã»30æ¥æé ã¯æænoteã«ãŸãšããŠããŸãã
ð Claude CodeèªåŸç°å¢ã§ãå®éã©ã皌ãã â ä»çµã¿ã»å®äŸã»å§ãæ¹ã»ãµããŒã
LilyïŒ@bokuwalilyïŒâ å人éçºè ãClaude Code ã§èªåååºç€ãçµã¿ãªãããiOSã¢ããªãWebãµãŒãã¹ãéç£ããŠããŸã
- å¶äœç©ã»èšäºã¯ bokuwalily.com ã«ãŸãšããŠããŸãð¥ïž
- AIã§ãå¯ãŠãŠãåãä»çµã¿ããäœã£ãŠæ120äžã«ãã話㯠noteã®ææèšäº ã«ð°
- OSS: github.com/bokuwalily ð
- ææ°æ å ±ã»ãåãåãã㯠X @bokuwalily ãžð
çããã® â€ïž ãã·ã§ã¢ãå±ã¿ã«ãªããŸãïŒ