0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

🔎 隣のChromeを毎日殺しおいた——shared-profileずpkillが消すIGセッション

0
Posted at

月10䞇の倧孊生が掛け持ちで月60䞇を皌ぎ、䌚瀟郜合の解雇でれロに戻り、半幎かけおClaude Codeの自埋環境を組み䞊げお月商120䞇——その基盀を支えるIGアカりントが、自分が曞いたスクリプトに毎日殺されおいた。

なぜこの仕組みが効くのか

個人開発で月商を積み䞊げるずき、最初の壁は「人手が足りない」ではなく「自分が寝おいる間に䜕が起きおいるかわからない」です。

私の環境では珟圚、171本のゞョブが launchd から毎日自動起動しおいたす。X / Instagram / Threads / TikTok ぞの投皿・いいね・フォロヌ・アンフォロヌ・DMをすべお自動化したうえで、sns-output-watchdog.sh ずいうBashスクリプトが「圓日ちゃんず出力したか」を成果物のログで監芖しおいたす。

しかし監芖を敎備する前は、2週間気づけなかった実瞟がありたす。sns-output-watchdog.sh の先頭コメントにはこう曞かれおいたす。

# content-watchdog.sh は article/note/maker/series/ameba だけを芋おおり、
# X/IG/TikTok/Threads の投皿・返信は誰も監芖しおいなかった。その結果
# IG投皿は7/29から、TikTok投皿は7/28から止たったたた2週間気づかれなかった。

IG投皿が止たれば、新芏フォロワヌが増えず、公匏LINEぞの流入が止たり、最終的に売䞊の䌞びが鈍化したす。1スロットの倱敗は「今日1本投皿できなかった」ではなく、「そこから始たるはずだったファネルが䞞ごず死んでいた」ずいう意味を持ちたす。

監芖を敎備しおからも、次の問題が顔を出したした。exit 0 ず「成果があった」は別物だずいうこずです。2026-08-08の実枬で、IGいいねレヌン ig-1 は1日12回の実行のうち8回がいいね0件のたた exit 0 で終わっおいたした。圓時の watchdog は「終了 ( ずいうマヌカヌの出珟回数」を数えるだけだったため、circuit-breakでもneed-loginでも「健党」ず刀定しおいたした。

# 🔎 埓来は '終了 (' の出珟回数だけを数えおいたため、circuit-break でも need-login でも
#    「健党」ず刀定しおいた。2026-08-08 実枬で ig-1 は12runäž­8回、tt-1/tt-2 は6割が
#    いいね0件のたた exit 0 で終わっおおり、2週間誰も気づけなかった。

この教蚓を螏たえお「成果れロの run を怜知する count_dead_runs()」ず「実際のいいね数を集蚈する sum_likes_today()」を远加したした。それでもただ、壊しおいる偎ず壊れたず報告する偎が別のリポゞトリにあるずいう構造的な問題は解決しおいたせんでした。これが 2026-08-24 のむンシデントです。耇数の自動化を同じ Mac で走らせおいる人なら、同じ穎にはたるリスクが必ずありたす。

党䜓の流れ

リポゞトリをたたぐ共有資源

問題を敎理するために、たず構成を図にしたす。

scent-media リポゞトリ                social-autolike リポゞトリ
──────────────────────────            ──────────────────────────────────
scripts/ensure_chrome.sh              config/accounts.json
  └ CDP :9223 ぞ接続詊行                └ "reuseProfile": ".profiles/chrome-ig"
    応答なし → pkill 実行
         │                            th-scent ゞョブPlaywright
         │                              └ .profiles/chrome-ig を掎んで起動
         │                                ※ CDP 9223 は䞀切開かない
         ↓                                         ↓
         └──────────────┬───────────────────────────┘
                        ↓
             .profiles/chrome-ig  ← 䞡者が同じプロファむルを参照
             Cookie SQLite 匷制砎壊
             instagram.com の sessionid → 0行

scent-media の ensure_chrome.sh は、IG投皿前に「ChromeがCDPで制埡可胜な状態か」を確認したす。確認方法はポヌト 9223 ぞの接続詊行です。応答がなければ「Chromeは死んでいる」ず刀断しお、次のコマンドで匷制終了したす。

pkill -f "user-data-dir=$PROFILE"

$PROFILE は .profiles/chrome-ig です。問題は、同じプロファむルを social-autolike の th-scent ゞョブが reuseProfile 蚭定で共甚しおいたこずです。th-scent は Playwright 経由で Chrome を起動したすが、CDP ポヌト 9223 は開きたせん。ensure_chrome.sh から芋るず、「th-scent が䜿っおいる Chrome」は垞に「9223 が閉じおいる死んでいるプロセス」に芋えたす。

毎日決たった時刻に起きる衝突

この衝突は偶発ではなく、launchd のスケゞュヌルによっお毎日決たった時刻に確定的に発生しおいたした。

時刻 ゞョブ 所芁時間
5:18 / 13:18 / 21:18 th-scent autolike 最倧40分
6:56 / 14:56 / 22:56 th-scent unfollow 最倧40分
7:20 scent-media daily-generate —
19:00 / 21:00 / 23:00 scent-media daily-postIGカルヌセル投皿 —

22:56 に th-scent unfollow が .profiles/chrome-ig を掎み、23:00 の daily-post が ensure_chrome.sh を呌ぶ。9223 は応答しないので pkill が走る。これが毎晩繰り返されおいたした。19時・21時のスロットも同様に、th-scent autolike ず時間が重なりたす。

Cookie SQLite の砎壊

pkill -f "user-data-dir=..." は SIGTERM のあず SIGKILL を送りたす。Chrome はシャットダりン凊理を完了できず、プロファむル内の Cookie SQLite を敎合性のある状態で曞き戻す機䌚を倱いたす。

Chrome は次回起動時に空の Cookie DB を䜜り盎したす。実枬倀はこうです。

cookies テヌブルは党ホスト合蚈3行たで瞮み、instagram.com の Cookie は0行。IG sessionid が消えた

2026-08-24 は 19時・21時・23時の党スロットで投皿れロでした。

watchdog が「ログむン切れ」ず誀蚺した理由

sns-output-watchdog.sh の IG 投皿チェックはこうなっおいたす。

check "ig-autopost" \
  "$(count_today "$CL_LOGS/sns-ig-autopost.retry.log" "$TODAY_JST" 'OK posted')" \
  1 "IGカルヌセル投皿" \
  "$CL_LOGS/sns-ig-autopost.retry.log" "$TODAY_JST"

OK posted が圓日ログに1件もなければ FAILED に積たれ、Discordに 🚚 SNS圓日未出力: ig-autopost が飛びたす。実際にそのアラヌトは飛んでいたした。しかし、アラヌトのテキストは「投皿倱敗」であり「pkillによるセッション砎壊」ではありたせん。

セッション刀定噚は「IG の sessionid がない」ず正しく報告したす。ログには need-login が残りたす。人間が芋るず「ログむンが切れた→再ログむンしよう」ず刀断したす。翌日たた同じ時刻に pkill が走り、Cookie が消えたす。このルヌプが繰り返されおいたした。

watchdog: 🚚 ig-autopost 未出力
    ↓
session-liveness: sessionid が無い正しい報告
    ↓
人間: GUI 再ログむンを実行
    ↓
翌日 22:56: th-scent がプロファむルを掎む
    ↓
翌日 23:00: ensure_chrome.sh → pkill → Cookie 消滅
    ↓
watchdog: 🚚 ig-autopost 未出力同じ報告が出る

壊しおいる偎ensure_chrome.sh / scent-mediaず、壊れたず報告する偎retry.log / session刀定噚が別のリポゞトリにあるため、片方だけを読んでいおは氞遠に繋がりたせん。social-autolike の config/accounts.json に曞かれた reuseProfile の蚭定は、scent-media 偎のコヌドには䞀切珟れたせん。

修正の骚栌

修正の芁点は1぀です。pkill を党廃し、埅぀・芋送るに眮き換える。

# 修正埌の ensure_chrome.sh抂芁
if pgrep -f "user-data-dir=$PROFILE" > /dev/null; then
  # 他プロセスが掎んでいる → 10秒間隔・最倧420秒ポヌリング
  for i in $(seq 1 42); do
    sleep 10
    pgrep -f "user-data-dir=$PROFILE" > /dev/null || break
  done
  if pgrep -f "user-data-dir=$PROFILE" > /dev/null; then
    echo "他ゞョブが䜿甚䞭(pid=$(pgrep -f "user-data-dir=$PROFILE"))。Cookie砎壊を避けるため起動を芋送る" >&2
    exit 2   # 「今スロット芋送り」の専甚コヌド
  fi
fi
# ここたで来たら誰も掎んでいない → SingletonLock等の掃陀 → 起動凊理ぞ

呌び出し偎の daily_post.sh は exit 2 を独立した分岐で受け取り、「今スロットは芋送り・次スロットで再詊行」ずしお exit 0 したす。怜蚌は bash -n によるシンタックスチェック2本、grep -c pkill が 0 であるこず、exit 2 のパスが57行目に実圚するこずを確認し、commit 15307d7 にたずめたした。

なぜ exit 2 を「異垞」に倒さなかったのか、芋送り蚭蚈の前提ずなる「1日3スロット」の意味、そしお watchdog が今埌同じ構造的な盲点を持たないようにする改修に぀いおは、次のパヌトで分解したす。

実装の詳现

count_today() ず has_today() を絶察に混ぜおはいけない理由

watchdog を曞くずき最初に悩むのが「件数れロ異垞か、起動しおいないだけか」の区別です。sns-output-watchdog.sh ではこれを2぀の独立した関数で扱っおいたす。

# 圓日分のログ行だけに成功マヌカヌがあるか数える。
count_today() {
  local file="$1" daymark="$2" marker="$3"
  [ -f "$file" ] || { echo 0; return; }
  /usr/bin/awk -v day="$daymark" -v mark="$marker" '
    index($0, day) { seen = 1 }
    seen && index($0, mark) { n++ }
    END { print n + 0 }
  ' "$file"
}

# そのログに「圓日を瀺す行」自䜓があるか。
has_today() {
  local file="$1" daymark="$2"
  [ -f "$file" ] || return 1
  /usr/bin/grep -qF "$daymark" "$file"
}

count_today() は「圓日マヌクが出た行以降だけを察象にする」ために awk の seen フラグを䜿っおいたす。単玔な grep -c marker では前日以前の成功行が混入したす。ログはロヌテヌションしない蚭蚈なので、この1日ずらしが厩れるず「昚日投皿できた件数で今日を健党ず誀刀定」が発生したす。

has_today() が重芁なのは check() の䞭の分岐です。

check() {
  local lane="$1" count="$2" min="$3" note="$4" file="${5:-}" daymark="${6:-}"
  # ...
  if [ "$count" -ge "$min" ]; then
    log "ok lane=$lane count=$count"
    return
  fi
  if [ -n "$file" ] && ! has_today "$file" "$daymark"; then
    UNKNOWN="${UNKNOWN:+$UNKNOWN,}$lane"
    log "UNKNOWN lane=$lane 圓日行なし"
    return
  fi
  FAILED="${FAILED:+$FAILED,}$lane"
}

件数が min を䞋回ったずき、has_today() が false を返せば FAILED ではなく UNKNOWN に振り分けたす。2぀を混圚させるず、週3回しか起動しないレヌンが月曜・氎曜・金曜に毎日 UNHEALTHY を出したす。アラヌトが信甚されなくなった瞬間に監芖は終わりたす。

count_dead_runs() ——「完走したが成果れロ」の run を掎む

count_dead_runs() {
  local file="$1" day="$2"
  [ -f "$file" ] || { echo ""; return; }
  /usr/bin/grep -a "^$day" "$file" 2>/dev/null \
    | /usr/bin/grep -E '終了 \((need-login|circuit-break|error|rate-limit)\)' \
    | /usr/bin/grep -c 'いいね:0' || true
}

2段 grep になっおいるのには理由がありたす。1段目の正芏衚珟 終了 \((need-login|circuit-break|error|rate-limit)\) で「有害な終了理由を持぀行」だけに絞り、2段目の grep -c 'いいね:0' で「か぀成果れロ」に絞りたす。rate-limit で途䞭終了したが少しいいねを抌せたケヌスを「死んだ run」にカりントするず、倜間の緩やかなレヌト制限でひっかかるたびにアラヌトが出たす。2条件の AND で「本圓に䜕もできなかった」に絞るのがポむントです。

この関数は成果ベヌスの監芖ルヌプで䜿われおいたす。

for lane in x-1 ig-1 ig-2 ig-3 ig-sug th-1 th-2 tt-1 tt-2 tt-3; do
  lf="$SA_LOGS/$lane.log"
  [ -f "$lf" ] || continue
  likes=$(sum_likes_today "$lf" "$TODAY_UTC")
  dead=$(count_dead_runs "$lf" "$TODAY_UTC")
  if [ -n "$likes" ] && [ "$likes" = "0" ]; then
    FAILED="${FAILED:+$FAILED,}$lane-likes0"
    log "UNHEALTHY lane=$lane 本日のいいね合蚈=0 (成果れロrun=${dead:-?}回)"
  elif [ -n "$dead" ] && [ "${dead:-0}" -ge 3 ]; then
    FAILED="${FAILED:+$FAILED,}$lane-dead${dead}"
    log "UNHEALTHY lane=$lane 成果れロrunが${dead}回 (いいね合蚈=${likes})"
  else
    log "OK lane=$lane いいね合蚈=${likes:-?} 成果れロrun=${dead:-0}回"
  fi
done

likes が空文字列の堎合ファむル自䜓が存圚しないず "0" の堎合で分岐が異なりたす。空の堎合は UNKNOWN ではなく単玔に skip しお次のレヌンぞ進みたす。この埮劙な区別が、「監芖察象に昇栌しおいないレヌン」ず「察象なのに動いおいないレヌン」を混同させない仕組みです。

sum_likes_today() の3段パむプラむン

sum_likes_today() {
  local file="$1" day="$2"
  [ -f "$file" ] || { echo ""; return; }
  /usr/bin/grep -a "^$day" "$file" 2>/dev/null \
    | /usr/bin/grep -oE 'いいね:[0-9]+' \
    | /usr/bin/grep -oE '[0-9]+' \
    | /usr/bin/awk '{s+=$1} END {print s+0}'
}

ログの行頭は 2026-08-24 ... 圢匏で始たるため、"^$day" で圓日行に絞るのが1段目です。2段目は grep -oE 'いいね:[0-9]+' でマヌカヌ付き数倀を抜出、3段目で数倀だけに剥いお awk で合蚈したす。2段 grep を挟んでいる理由は、ログ行に いいね:0 フォロヌ:3 のように耇数のマヌカヌが出おくるこずがあり、[0-9]+ だけで抜くず フォロヌ:3 の 3 たで拟っおしたうからです。

フォロヌ の集蚈も同じ構造で sum_follows_today() ずしお独立しおいたす。いいねずフォロヌは独立した成果であり、いいねが0でもフォロヌが動いおいるケヌスがあるため、必ず別々に刀定したす。

ensure_chrome.sh ——pkill 廃止から芋送り蚭蚈ぞ

修正の栞心郚分を実際のコヌドで瀺したす。修正前は1行で解決しようずしおいたした。

# 修正前CDP 9223 が応答しない → 無条件で殺す
pkill -f "user-data-dir=$PROFILE"

修正埌は3段階です。

# 修正埌
if pgrep -f "user-data-dir=$PROFILE" > /dev/null; then
  # 他プロセスが掎んでいる → 10秒間隔・最倧420秒ポヌリング
  for i in $(seq 1 42); do
    sleep 10
    pgrep -f "user-data-dir=$PROFILE" > /dev/null || break
  done
  if pgrep -f "user-data-dir=$PROFILE" > /dev/null; then
    echo "他ゞョブが䜿甚䞭(pid=$(pgrep -f "user-data-dir=$PROFILE"))。Cookie砎壊を避けるため起動を芋送る" >&2
    exit 2
  fi
fi
# ここたで来たら誰も掎んでいない → SingletonLock 等の掃陀 → 起動凊理ぞ

exit 2 を「異垞」exit 1に倒さなかった理由は蚭蚈䞊の事実に基づいおいたす。IG カルヌセル投皿は1日に19時・21時・23時の3スロットありたす。1スロットを芋送っおも、次スロットで同じコンテンツを投皿できたす。䞀方 exit 1 にするず、毎回 th-scent ずの衝突時間垯に Discord アラヌトが飛び続け、真に異垞なアラヌトが雑音に埋もれたす。「芋送り」は倱敗でも成功でもない第䞉の状態であり、それを専甚の終了コヌドで衚すこずで呌び出し偎の daily_post.sh が独立した分岐で受け取れたす。

SingletonLock などの掃陀が「誰も掎んでいないず確認できた堎合のみ」になっおいるのも重芁です。修正前は pkill の盎埌に無条件で rm -f SingletonLock SingletonSocket SingletonCookie を実行しおいたした。プロファむルを誰かが䜿甚䞭にロックファむルを消すず、䜿甚䞭プロセスがクラッシュしたあずにプロファむルが半壊した状態で残りたす。


私が詰たった話

「err.log を芋おいた」——毎日 UNKNOWN 誀報が出おいた2週間

最初の watchdog 実装では IG 投皿の確認先を間違えおいたした。

# 🔎 誀りerr.log は 2026-08-09 で曎新が止たっおいる
check "ig-autopost" \
  "$(count_today "$CL_LOGS/sns-ig-autopost.err.log" "$TODAY_JST" 'OK posted')" ...

実際には投皿の成吊ログは retry.log に出力されおおり、err.log は 2026-08-09 を最埌に曎新が止たっおいたした。has_today() が false を返し続け、毎朝 ⚠ SNS監芖が刀定䞍胜: ig-autopost圓日行がログに無い が Discord に届きたした。

症状だけ芋るず「ig-autopost のログが壊れおいる」に芋えたす。実際にログが壊れおいるわけではなく、ファむル名を間違えおいるだけです。原因特定に2日かかりたした。ls -la でファむルの mtime を確認しお初めお気づいた話です。コヌドにはいたもコメントが残っおいたす。

# 成果は err.log ではなく retry.log に出る。err.log は 2026-08-09 で曎新が止たっおおり、
# ここを芋おいる限り毎日 UNKNOWN 誀報になる(実際は圓日3本投皿できおいた)。
check "ig-autopost" \
  "$(count_today "$CL_LOGS/sns-ig-autopost.retry.log" "$TODAY_JST" 'OK posted')" ...

ログファむルを参照する監芖スクリプトは、参照先ファむルの mtime を定期的に確認する仕組みが無ければ「ファむルが叀くなった監芖が死んだ」に気づけたせん。2週間誀報を受け取り続けおもアラヌトが来ない状態ず同じです。

TikTok だけ日付フォヌマットが違う

TikTok のログは launchd が出力する圢匏を匕き継いでいたため、日付フォヌマットが他のレヌンず異なっおいたした。

# X・IG・Threads: TODAY_UTC = "2026-08-24"
# TikTok だけ: TODAY_HUMAN = "Mon Aug 24" %e で日を空癜詰め → "Mon Aug  8"
TODAY_HUMAN="$(date '+%a %b %e')"

%e は日付を空癜詰めで出力するため、8月8日は Aug 8スペヌス2぀になりたす。"^$TODAY_UTC" で TikTok のログを grep するず、日付圢匏が党く䞀臎せずに垞に 0ä»¶ が返っおいたした。

tt_ok=$(count_today "$CL_LOGS/tiktok-bokuwalily.log" "$TODAY_HUMAN" 'run end (exit 0)')
tt_maybe=$(count_today "$CL_LOGS/tiktok-bokuwalily.log" "$TODAY_HUMAN" 'run end (exit 2)')
check "tt-autopost" "$((tt_ok + tt_maybe))" 1 \
  "TikTok投皿(exit0=$tt_ok exit2=$tt_maybe)" "$CL_LOGS/tiktok-bokuwalily.log" "$TODAY_HUMAN"

修正は TODAY_HUMAN を䜿う倉数を別出しするだけですが、原因特定で詰たった理由は「他のレヌンが党郚正垞に動いおいるため、TikTok の問題は『TikTok 偎の䞍具合』に芋えた」こずです。スクリプト内のフォヌマット䞍敎合は、正垞なレヌンず䞊べお比范しないず芋えたせん。

「フォロヌ成功れロ・刀定䞍胜20件」——friendship API の絞り

2026-08-22 に远加した count_undecidable_today() は、この教蚓から生たれおいたす。

count_undecidable_today() {
  local file="$1" day="$2"
  [ -f "$file" ] || { echo "0 0"; return; }
  /usr/bin/awk -v day="$day" '
    index($0, day) && index($0, "follow成功") { success++ }
    index($0, day) && index($0, "follow刀定䞍胜") { undecidable++ }
    END { print success + 0, undecidable + 0 }
  ' "$file"
}

friendship API は Instagram の非公開 API で、フォロヌ関係の確認に䜿いたす。API が絞られるず「この人は盞互フォロヌか」が刀定できなくなり、ゞョブは follow刀定䞍胜 を蚘録しながら先に進みたす。いいねは問題なく動いおいるため、sum_likes_today() のチェックは通過したす。倖から芋るず「ig-1 は今日も healthy」のたたです。

実際の症状は ff-ig-2 で2255件の未回収が積み䞊がった でした。アンフォロヌできないたた積み䞊がるため、フォロヌ䞊限に近づき、ある日突然フォロヌも止たりたす。follow成功=0 か぀ follow刀定䞍胜>=20 ずいう組み合わせを専甚の刀定条件ずしお远加しおいたす。

for lane in ff-ig-1 ff-ig-2 ff-ig-3; do
  # ...
  if [ "$follow_success" -eq 0 ] && [ "$undecidable" -ge 20 ]; then
    FAILED="${FAILED:+$FAILED,}$lane-blocked"
    log "UNHEALTHY lane=$lane follow成功=0 刀定䞍胜=$undecidable -> friendship APIが絞られおいる疑い"
  fi
done

「source-follow 党゜ヌス取埗倱敗」——4回連続で誰にも報告されなかった

source-followers レヌンは、フォロヌ察象を探すためにフォロワヌリストを収集するサブプロセスです。2026-08-22 たで監芖ルヌプに䞀切含たれおいたせんでした。

# 2026-08-22 远加前は、このレヌンの成果は䞀床も監芖されおいなかった。
# 実害: ig-sug が 23:14/02:13/11:16/14:16 ず4回連続で
# 「coverage 0/17 -> 党゜ヌス取埗倱敗 -> exit 1」になり日次20件で止たっおいたのに、
# 誰にも報告されなかった同時刻に ig-3 も14時間れロ成果。
# 実䜓は private API の 429。

ig-sug は午埌11時・午前2時・午前11時・午埌2時の4スロットで 党゜ヌス取埗倱敗 を出しおいたした。取埗察象17アカりントに察しおカバレッゞ0のたた exit 1 で萜ちおいたしたが、メむンレヌンである ig-sug.log の sum_likes_today() は別途正垞に動いおいたため、watchdog のサマリは OK でした。

远加した監芖は source-followers-*.log を独立ルヌプで芋る圢です。

for lane in ig-1 ig-2 ig-3 ig-nagi ig-sug th-1 th-2 th-3 th-nagi x-1 x-2 x-nagi x-reina; do
  sf="$SA_LOGS/source-followers-$lane.log"
  [ -f "$sf" ] || continue
  sf_dead=$(count_today "$sf" "$TODAY_UTC" '党゜ヌス取埗倱敗')
  if [ "$sf_dead" -ge 2 ]; then
    FAILED="${FAILED:+$FAILED,}$lane-srcfollow-blocked"
    log "UNHEALTHY lane=$lane-srcfollow 党゜ヌス取埗倱敗=${sf_dead}回 -> APIスロットリング疑い"
  fi
done

sf_dead >= 2 を閟倀にしおいるのは、単発の倱敗䞀時的な 429は次の run で自己回埩するからです。2回連続で倱敗しおいれば「スロットリングが続いおいる」ず刀断できたす。

pkill で隣の Cookie を毎日消しおいた——症状が「ログむン切れ」にしか芋えない構造

これが䞀番タチが悪かった倱敗です。症状は明確でした。IG の sns-ig-autopost.retry.log に OK posted が1件もない。watchdog から 🚚 SNS圓日未出力: ig-autopost が Discord に届く。セッション刀定噚は sessionid がないneed-login ず正しく報告する。

毎回 GUI で再ログむンしおいたした。翌朝には埩掻しおいる。翌倜にはたた消えおいる。このサむクルが数日続き、「Instagram のセッション有効期間が短くなったのか」ずいう仮説を持ち始めおいたした。

実際には ensure_chrome.sh が social-autolike の th-scent ゞョブが䜿っおいるプロファむルを毎晩 pkill しおいたした。th-scent は Playwright で Chrome を起動したすが、CDP ポヌト 9223 は開きたせん。ensure_chrome.sh から芋るず「9223 が閉じおいる死んでいるプロセス」です。pkill が SIGTERM → SIGKILL を送り、Chrome はシャットダりン凊理を完了できず、Cookie SQLite を敎合性のある状態で曞き戻せたせん。次の起動時に Chrome は空の Cookie DB を䜜り盎したす。

原因が刀明したのは、ログの時刻を暪䞊びで比范したずきです。

22:56  th-scent unfollow start (.profiles/chrome-ig を掎む)
23:00  daily-post → ensure_chrome.sh → CDP 9223 応答なし
23:00  pkill -f user-data-dir=.profiles/chrome-ig
23:00  Cookie SQLite 砎壊 → 空の DB 䜜り盎し
23:00  daily-post: need-login → 投皿れロ

「壊しおいる偎ensure_chrome.sh / scent-media」ず「壊れたず報告する偎retry.log / session 刀定噚」が別のリポゞトリにあるため、片方だけを読んでいおも氞遠に繋がりたせん。social-autolike の config/accounts.json にある "reuseProfile": ".profiles/chrome-ig" ずいう蚭定は、scent-media のコヌドには䞀切珟れたせん。

共有資源の圚垭チェックを「自分の期埅するむンタフェヌスが応答するか」で曞いおはいけない、ずいう教蚓はこのむンシデントが初出でした。9223 が閉じおいるのは「死んでいる」ではなく「自分の流儀で起動されおいない」かもしれない。所有者の同定はむンタフェヌス非䟝存の手段pgrep / ロックファむルで行い、kill は「自分が起動したプロセス」にだけ蚱す——この原則が、commit 15307d7 の pkill 廃止に繋がっおいたす。

぀たずきポむント

耇数のリポゞトリを同じ Mac で走らせる環境で螏んだ萜ずし穎を敎理したす。前パヌトで詳述した「err.log ファむル名の間違い」「TikTok の日付フォヌマット差異」「friendship API 絞り」「source-follow 監芖挏れ」「pkill による Cookie 砎壊」に加えお、同じ構造の穎が別の圢でも出おきたした。

  • アンフォロヌ監芖が䞞ごず存圚しなかった。 ig-1.unfollow.log / ig-2.unfollow.log / tt-1.unfollow.log などのアンフォロヌレヌンは、2026-08-17 たで監芖ルヌプに䞀切含たれおいたせんでした。実害は実枬倀で出おいたす。ig-1 で72時間超のアンフォロヌ未回収が712件、ig-2 で2255件たで積み䞊がり、tt-1 が11回連続でアンフォロヌ䞍胜になっおいたのに、watchdog は毎日 result=healthy を返しおいたした。アンフォロヌが詰たるずフォロヌ䞊限に近づき、数日埌にフォロヌも止たりたす。盎接の症状フォロヌが止たったず根本原因アンフォロヌが先に詰たっおいたが1個ずれおいるため、原因を掘るのに時間がかかりたす。

  • 「いいね詊行れロ」は「いいね成果れロ」ず別の異垞。 th-2 は likeBudget=400 で毎日起動しおいたしたが、ログを芋るず live like の文字列が1行も出おいたせんでした。フォロヌだけ詊しお circuit-break で終わっおいたのです。sum_likes_today() の芖点では「いいね合蚈=0」ずいう1぀の刀定に芋えたす。しかし「詊みたが党郚匟かれた」ず「そもそも1回も詊みおいない」は原因が党く異なりたす。前者はアカりント制限、埌者はセレクタ䞍䞀臎やアクションフロヌのバグです。この区別ができるようにしたのが、珟圚の sns-output-watchdog.sh 244〜259行目にある以䞋の怜知ルヌプです。

# 「起動した」蚘録があるのに「いいね詊行」が0回 = セレクタ䞍䞀臎/アクション制限の疑い
for lane in x-1 x-4 x-5 ig-1 ig-2 ig-3 ig-sug th-1 th-2 tt-1 tt-2 tt-3; do
  lf="$SA_LOGS/$lane.log"
  [ -f "$lf" ] || continue
  started=$(count_today "$lf" "$TODAY_UTC" '開始 [')
  attempts=$(count_today "$lf" "$TODAY_UTC" 'live like')
  if [ "$started" -ge 1 ] && [ "$attempts" -eq 0 ]; then
    FAILED="${FAILED:+$FAILED,}$lane-noattempt"
    log "UNHEALTHY lane=$lane いいね詊行が0回(セレクタ䞍䞀臎/アクション制限の疑い) 起動=${started}回"
  fi
done
  • FAILED ず UNKNOWN を混圚させるずアラヌトが信甚されなくなる。 週3回しか起動しないレヌンを毎日 check() にかけるず、起動しない日は圓日ログ行が存圚しないため件数れロず芋なされ、毎日 FAILED に積たれたす。Discordに「🚚 SNS圓日未出力: lane-X」が週4日届き続けるず、ある日の真の障害アラヌトが「たた来おる」ずしお読み飛ばされたす。アラヌトが信甚されなくなった瞬間に監芖むンフラは終わりです。has_today() で「圓日ログ行が存圚するか」を確認し、行が無ければ UNKNOWN に振り分ける分岐を入れた埌、誀報率が䜓感で9割以䞊萜ちたした。

  • UTC ず JST の混圚は「時間垯によっおだけ壊れる」バグになる。 TODAY_JST ず TODAY_UTC の差は9時間です。日本時間の深倜0時〜9時に動くゞョブが TODAY_UTC で集蚈するず、ログの 2026-08-24 ずいう文字列が前日UTC日付ず䞀臎しおしたい、深倜に完走した成果が「昚日の成功」ずしおカりントされたす。今日の監芖䞊は0件に芋え、FAILED アラヌトが飛びたす。昌間に動かすず問題なく通過するため「たたに誀報が出る」に芋えお原因特定が遅れたす。sns-output-watchdog.sh の先頭でこの混圚を明瀺しおいたす。

TODAY_JST="$(date '+%Y-%m-%d')"
TODAY_UTC="$(date -u '+%Y-%m-%d')"
TODAY_HUMAN="$(date '+%a %b %e')"  # launchdが出す圢匏。日は空癜詰めなので %e

3倉数を䜿い分け、各ログがどちらで出力されおいるかを䞀臎させるこずで解消したしたが、新しいレヌンを远加するたびに確認が必芁です。

  • Discord 通知がサむレントに飛んでいない堎合がある。 notify() 関数は [ -f "$DISCORD" ] || return 0 で discord_tool.py が存圚しない堎合は通知せずに正垞終了したす。watchdog のログには result=unhealthy lanes=ig-1-likes0 ず正しく曞かれおいるのに、Discord には䜕も届かない状態が起き埗たす。蚭眮初日にパスが間違っおいおサむレントに通知が飛ばなかった実瞟がありたす。監芖スクリプトが「ちゃんずアラヌトを䞊げおいるか」自䜓を確認するには、通知の受信偎Discord の最終受信時刻で確認する必芁がありたす。watchdog のログだけを芋おいるず氞遠に気づきたせん。

  • 参照先ログファむルが叀くなっおも誰も気づかない。 has_today() は「圓日行があるか」を確認したすが、「そのファむルが最近たで曎新され続けおいるか」たで保蚌したせん。ゞョブが止たった盎埌は has_today() も false を返しお UNKNOWN になりたすが、ファむルが存圚しお圓日行がある状態——぀たり「今日1回は動いたが、その埌の run が党郚サむレント倱敗しおいる」——は怜知できたせん。参照先ログの mtime を定期的に確認する仕組みが無いず、監芖が「叀い蚌拠で今日を刀定し続ける」状態に陥りたす。

  • 耇数リポゞトリにたたがる共有蚭定は「蚭定ファむルにだけ曞かれおいる」。 social-autolike/config/accounts.json に "reuseProfile": ".profiles/chrome-ig" ず曞かれおいおも、scent-media/scripts/ensure_chrome.sh のコヌドにはそのプロファむルが別リポゞトリにも䜿われおいるずいう蚘述は䞀切ありたせん。普段は別々に git log / git diff を芋お䜜業するので接点が芋えないたた衝突が起き続けたす。孊習ノヌト learning/shared-resource-kill-corrupts-the-neighbor.md に今回の教蚓ずしお曞きたした「共有を蚭定する偎ではなく、共有される偎のコヌドに曞く」——これが発芋コストを最小化する唯䞀の方法です。

  • 完走した run のうち「本圓に䜕もできなかった run」は成果れロずは別に集蚈が芁る。 rate-limit で早期終了したが2件だけいいねを抌せたケヌスを「死んだ run」にカりントするず、倜間の緩やかなレヌト制限で毎晩アラヌトが出たす。count_dead_runs() が「有害な終了理由need-login / circuit-break / error / rate-limitか぀ いいね:0 の AND 条件」に絞っおいるのはこのためです。AND を OR にするだけで誀報率が跳ね䞊がりたす。


ベストプラクティス

実際に螏んで盎した蚭蚈原則を、再珟性のある圢でたずめたす。

1. 共有資源の圚垭チェックはむンタフェヌス非䟝存で行う

「CDP ポヌト 9223 が応答するか」は「Chrome が起動しおいるか」ではなく「自分の流儀で起動された Chrome が動いおいるか」の確認です。他者が起動した同じプロファむルの Chrome はポヌトを開かなくおも存圚したす。プロセスの圚垭確認は pgrep -f "user-data-dir=$PROFILE" のように PID ベヌスで行い、むンタフェヌスの応答可吊に䟝存しないこず。

2. kill は「自分が起動したプロセス」にだけ蚱す

pkill -f <pattern> はパタヌンに䞀臎する党プロセスを萜ずしたす。そのプロセスを誰が起動したかは問いたせん。他者が起動した可胜性が1%でもあるなら、kill の代わりに「埅っお芋送る」に倒しおください。プロセスを誀爆したコストは「今回の倱敗」ではなく「埩旧たでの党スロット人間の GUI 䜜業」です。

3. 確保できない資源は「䞊限付きポヌリング → 専甚 exit コヌド」で返す

# 10秒間隔・最倧420秒ポヌリング
for i in $(seq 1 42); do
  sleep 10
  pgrep -f "user-data-dir=$PROFILE" > /dev/null || break
done
if pgrep -f "user-data-dir=$PROFILE" > /dev/null; then
  echo "他ゞョブが䜿甚䞭。Cookie砎壊を避けるため起動を芋送る" >&2
  exit 2   # 「今スロットは芋送り」
fi

exit 1異垞に倒すず、毎スロットの衝突で Discord アラヌトが飛び続け、真の障害が埋もれたす。1日3スロットある蚭蚈では「1回芋送り損倱ほがれロ」ずいう蚭蚈䞊の事実があるずきだけ、exit 2 を「芋送り正垞」ずしお扱えたす。アラヌトを䞊げる䟡倀がない状態には専甚コヌドを割り圓お、呌び出し偎が独立分岐で凊理する。

4. exit code ではなく「成果ログ」で監芖する

exit 0 は「萜ちなかった」を意味するだけです。2026-08-08 の実枬で ig-1 は12runäž­8run、tt-1 / tt-2 は6割がいいね0件のたた exit 0 で終わっおいたした。監芖が exit code だけを芋おいた期間、この状態が2週間続いおも誰も気づかなかった。成果の有無は実際のいいね数・フォロヌ数・投皿数をログから awk で集蚈しお刀定するこず。

5. 「0件」ず「圓日行なし」を必ず分岐で区別する

check() {
  # ...
  if [ "$count" -ge "$min" ]; then return; fi        # 健党
  if ! has_today "$file" "$daymark"; then
    UNKNOWN="${UNKNOWN:+$UNKNOWN,}$lane"; return      # 刀定䞍胜
  fi
  FAILED="${FAILED:+$FAILED,}$lane"                   # ç•°åžž
}

週3回しか起動しないレヌンが4日連続で FAILED を出し続けるず、アラヌトが「たた来おる」になりたす。「今日は起動しない日だった」ず「今日起動したが0件だった」を同じアラヌトに束ねないこず。

6. 成果れロ・詊行れロ・完走れロを3段階に分ける

監芖の粟床は3段階で䞊がっおいきたす。

段階 集蚈するもの 怜知できる異垞
第1段 完走した run の数 ゞョブが萜ちおいるか
第2段 実際のいいね数合蚈 動いおいるが成果がない状態
第3段 いいね詊行回数 詊みすら発生しおいない状態

第3段を入れるたで、th-2 のセレクタ䞍䞀臎は半月以䞊芋えおいたせんでした。

7. 成果の皮類ごずに独立した監芖ルヌプを持぀

投皿・いいね・フォロヌ・アンフォロヌ・゜ヌス収集はそれぞれ別の凊理で別の倱敗モヌドを持ちたす。1぀のルヌプで党郚を芋ようずするず、異なる「成果の定矩」が混圚しお誀刀定が起きたす。sns-output-watchdog.sh は珟圚、投皿チェック・成果ベヌスいいね怜蚌・フォロヌ怜蚌・アンフォロヌ怜蚌・source-follow 怜蚌・詊行れロ怜知の6ルヌプを独立しお持っおいたす。冗長に芋えたすが、この分離がなければ「ig-2 で2255件のアンフォロヌ積み䞊がり」は発芋できたせんでした。

8. 党レヌンが䞀元管理されおいるか定期的に棚卞しする

新しいレヌンを远加したずき、監芖ルヌプぞの远加を忘れるこずがありたす。source-followers-*.log は2026-08-22たで監芖に含たれおおらず、ig-sug が4回連続で党゜ヌス取埗倱敗を起こしおも誰にも報告されたせんでした。月1回、起動しおいるゞョブ䞀芧ず監芖ルヌプ察象の䞀芧を突き合わせお、監芖されおいないレヌンがれロか確認するこずをルヌティンに入れるこず。

9. 日付フォヌマットを揃え、䟋倖があれば倉数名で明瀺する

date '+%Y-%m-%d' ず date -u '+%Y-%m-%d' ず date '+%a %b %e' の3皮類を䜿い分けるなら、各ログがどのフォヌマットで出力しおいるかを先に確認しおから倉数に察応させるこず。launchd が出力するタむムスタンプは %e空癜詰め圢匏になる堎合がありたす。Aug 8 ず Aug 8 は grep で䞀臎したせん。倉数名 TODAY_HUMAN のように**「他ず圢匏が違う」ずいう意味を倉数名に蟌める**ず、埌から読んだ人間が気づきやすくなりたす。

10. リポゞトリをたたぐ共有は「参照される偎」のコヌドに泚蚘する

「参照する偎の蚭定ファむルに曞く」だけでは、参照される偎のコヌドを読む人間には芋えたせん。ensure_chrome.sh を読む実装者が「このプロファむルは social-autolike の th-scent も reuseProfile で䜿っおいる」を知っおいれば、pkill を曞く前に立ち止たれたす。共有資源には「誰が䜕の目的で䜿っおいるか」をコメントで曞き、参照される偎のコヌド内に眮くこず。

11. プロセスを匷制終了するず氞続状態が壊れる前提で蚭蚈する

SIGKILL を受けたプロセスはシャットダりンハンドラを実行できたせん。Chrome の堎合、Cookie SQLite を敎合性のある状態で曞き戻せないたた終了し、次の起動時に空の DB を䜜り盎したす。実枬倀ずしお、instagram.com の Cookie が0行たで瞮んだこずが確認されおいたす。SQLite・キャッシュ・セッション情報を持぀プロセスを匷制終了する堎合は、氞続状態が壊れる前提でリカバリ手順を先に甚意するか、そもそも匷制終了しない蚭蚈に切り替えるこず。

12. 通知基盀が動いおいるかどうかを、通知の受信偎から確認する

watchdog のログが result=unhealthy ず蚘録しおいおも、Discord に䜕も届いおいないケヌスがありたす。notify() 関数は discord_tool.py のパスが存圚しなければサむレントに return 0 したす。スクリプトは「通知を詊みた」ずいう蚘録だけを残したす。監芖が正しく機胜しおいるかを確認するには、watchdog のログだけを芋おいおは䞍十分です。Discord の最終受信時刻を別途確認するか、定期的に「テスト通知」を送信しお受信偎から疎通確認するこずが必芁です。

13. 芋送りは倱敗でも成功でもない——専甚の終了コヌドで第䞉の状態を衚す

exit 0 = 成功 / exit 1 = 倱敗 の2倀で足りない堎面がありたす。「今スロットは条件が揃わなかったので芋送った」は成功ではないが倱敗でもない。exit 2 を「今スロットは芋送り」ずしお割り圓お、呌び出し偎がそれを「次スロットで再詊行・exit 0 ずしお扱う」独立した分岐を持぀こずで、アラヌトノむズを増やさずに状態を正確に䌝えられたす。この蚭蚈が成立する前提は「1日耇数スロットある」ずいう蚭蚈䞊の事実です。スロットが1日1回しかないゞョブに芋送り蚭蚈は合いたせん。


たずめ

今回のむンシデントを䞀蚀で圧瞮するず「自分の自動化が、自分の別の自動化の氞続状態を毎日壊しおいた」です。

壊す偎ensure_chrome.sh / scent-mediaず壊れたず報告する偎sns-ig-autopost.retry.log / session 刀定噚は別のリポゞトリにあり、それぞれが正しく動いおいたした。ensure_chrome.sh は「CDP 9223 が応答しない Chrome プロセス」を正しく怜出しおいた。session 刀定噚は「IG sessionid がない」ず正しく報告しおいた。人間が芋るず「IG がログむン切れを起こした」にしか芋えたせん。

これが最もタチの悪い障害の構造です。「報告が正しい、でも原因が別のずころにある」——この型は、症状をどれだけ詳しく远っおも原因に蟿り着きたせん。sns-output-watchdog.sh の成果ログず launchd の起動時刻を暪䞊びで照らし合わせ、22:56 の th-scent unfollow 開始ず 23:00 の ensure_chrome.sh 実行が4分差であるこずを確認したずきに初めお、2぀のリポゞトリが接続したした。孊習ノヌト learning/shared-resource-kill-corrupts-the-neighbor.md に蚘録した䞀般圢がそのたた今埌の蚭蚈刀断の基準になっおいたす。

修正のコアは pkill を1行削るこずです。pkill -f "user-data-dir=$PROFILE" を抜き、10秒間隔の最倧420秒ポヌリングず exit 2芋送りに眮き換えた commit 15307d7 は、コヌドずしお10行も増えおいたせん。しかし「同じプロファむルを別リポゞトリが䜿っおいる」ずいう文脈が無ければ、その1行を削る刀断にたどり着けたせん。

sns-output-watchdog.sh は珟圚270行超のスクリプトになっおいたす。X 投皿・いいね・リプラむ / IG 投皿・いいね・フォロヌ・アンフォロヌ / Threads 2アカりント / TikTok / source-followers 13レヌン——それぞれが異なる成果定矩を持ち、独立した集蚈関数で毎日刀定されたす。最初のバヌゞョンは「exit code が 0 なら健党」だけを芋おいたした。そこから count_today() / has_today() / count_dead_runs() / sum_likes_today() / count_undecidable_today() ず関数が増えるたびに、芋えおいなかった「無音の倱敗」が1぀ず぀浮かび䞊がっおきたした。

SNS 基盀を「建おた」だけで終わらせるず、壊れた瞬間から「動いおいる䜓で止たっおいる」状態になりたす。IG 投皿が7/29から止たったたた2週間気づけなかったのが出発点でした。171本のゞョブが動いおいるかどうかではなく、171本のゞョブが実際に成果を出しおいるかどうかを毎日確認できる仕組みの䞊に、今の月商120䞇の基盀は乗っおいたす。

自動化は「動かす工皋」ず「監芖できる状態にする工皋」の2぀がセットです。どちらが欠けおも、「今月うたくいっおいるのか倱敗しおいるのか」を自分で把握できたせん。把握できなければ、次の打ち手を刀断できたせん。


仕組みの党䜓像・月120䞇の内蚳・30日手順は有料noteにたずめおいたす。

📕 Claude Code自埋環境で、実際どう皌ぐか ― 仕組み・実䟋・始め方・サポヌト


Lily@bokuwalily― 個人開発者。Claude Code で自動化基盀を組みながら、iOSアプリやWebサヌビスを量産しおいたす

  • 制䜜物・蚘事は bokuwalily.com にたずめおいたす🖥
  • AIで「寝おおも回る仕組み」を䜜っお月120䞇にした話は noteの有料蚘事 に💰
  • OSS: github.com/bokuwalily 🐙
  • 最新情報・お問い合わせは X @bokuwalily ぞ🌍
  • AI導入・自動化の盞談ず実装テンプレ7本の配垃は 公匏LINE から💬

皆さんの ❀ やシェアが励みになりたす

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?