メむンコンテンツぞスキップ
芋出し画像

Claude Code の䞊行セッションを、PC の再起動から2回の操䜜で戻す — 難しかったのは「戻す」より「萜ずしおいいか」の刀定だった

    Windows Terminal のタブを6枚ほど開いお、それぞれ別のプロゞェクトで Claude Code を䞊行で動かしおいる。PC を再起動するたびに、それを党郚元に戻すのが面倒だった。そこで、再起動の前に1回抌す「保存」ず、立ち䞊げた埌に1回抌す「埩元」を䜜った。

    結論を先に曞く。

    • 戻すこず自䜓は簡単だった。Claude Code は --resume にセッションIDを付ければ䌚話を再開できる。芁るのは「どのタブで・どのフォルダで・どのセッションが動いおいたか」の察応衚ず、それを1回で開き盎すコマンドだけだ

    • 難しかったのは、保存する瞬間に「このセッションは今、萜ずしおよいか」を決めるこずだった。分からないものは動いおいるずみなし、確実に動いおいるものは止め、疑わしいものは材料を画面に出しお私が y/N で決める。この2段にした

    • 単䜓テストも、2〜4タブでの実機確認も党郚通っおいたのに、本圓の再起動では5本䞭2本が戻らなかった。埩元は「耇数のタブが同じ瞬間に起動する」唯䞀の堎面で、そこでだけ同じログファむルぞの曞き蟌みが衝突した。盎しおからもう䞀床再起動したら、5本ずも戻ったただし条件は1回目ず少し違う。埌で曞く

    土台は、前に蚘事に曞いた「セッションの自動切替」ず同じ、自䜜の起動スクリプトラッパヌだ。

    自動切替は、Claude Code の䌚話コンテキストが決めた量を超えたら、匕き継ぎ資料を曞かせおから claude を終わらせ、同じタブで新しい claude を立ち䞊げお資料を読たせる仕組みだ。AI は自分で /clear を抌せないので、ラッパヌがプロセスごず入れ替える。入れ替わるたびにセッションIDは新しくなるが、タブずフォルダはそのたた残る。この蚘事で「自動切替」ず曞いたら、この入れ替えのこずだ。


    䜕が面倒だったか

    再起動の前に、私は毎回こうしおいた。

    1. 党郚のタブを目で芋お、Claude Code が返事の途䞭でないか確かめる

    2. 党郚のセッションに /rename で名前を付ける

    3. 再起動する

    4. タブを1枚ず぀開いお元のフォルダに移動し、/resume の䞀芧から名前で探しお遞ぶ

    名前を付けるのは、/resume の䞀芧で芋分けるためでしかない。本圓に芁るのは「タブずフォルダずセッションIDの察応衚」だけで、それは機械が芚えおおける。

    䜜ったもの

    ボタンは、タスクバヌのアむコン2぀にしたピン留めは最初に手で1回だけ。

    • 保存萜ずす前に1回抌す。動いおいる Claude Code のセッションを党郚調べお、萜ずしおよければ察応衚を保存する

    • 埩元立ち䞊げた埌に1回抌す。保存した察応衚から、各タブを元のフォルダ・元の䌚話で開き盎す。りィンドりの䜍眮ず倧きさも戻すこれは埌から足した

    やらないこずも決めた。

    • 電源操䜜はしない。保存した埌の再起動は自分でやる。そのため、保存しおから再起動するたでの間に始めた䜜業は、保存した蚘録に入らない。保存は再起動の盎前に抌す

    • ログむンした時の自動埩元はしない。抌した時だけ動く

    • ラッパヌを通さずに起動した玠の claude は戻さない。芋぀けたら、数だけ譊告する

    蚘録係は hook 3本

    察応衚は、Claude Code の hook で䜜っおいる。

    • SessionStartセッションが始たったら、そのタブの蚘録を䜜るフォルダ・セッションID・プロセスID・起動時刻・起動フラグ

    • UserPromptSubmitプロンプトが送られたら「動いおいる」にする

    • Stop返事が終わったら「埅っおいる」にする

    蚘録の鍵は、セッションIDではなく、ラッパヌがタブごずに振るIDにした。自動切替が働くずセッションIDは倉わるが、タブは同じだからだ。

    生きおいるかどうかは、プロセスIDず䜜成時刻の䞡方が䞀臎するかで芋る。プロセスIDだけだず、番号を再利甚した別のプロセスを「生きおいる」ず読んでしたう。ラッパヌ自身のプロセスIDも蚘録する。自動切替の途䞭には、claude は終わっおいるがラッパヌは生きおいる隙間があるからだ。

    䜜る前に枬ったこず

    hook がい぀来お、い぀来ないかは、䜜る前に手で確かめたClaude Code 2.1.301。蚭蚈に効いたのは次の4぀だ。

    • Esc で返事を䞭断するず、Stop は来ない。このたただず「動いおいる」のたた残る。そこで、䌚話ファむルの最埌の䌚話の行が䞭断の蚘録Request interrupted by userなら「埅っおいる」ずみなすこずにした。ただし、ファむルの物理的な最埌の行は、䌚話ではなくタむトルなどのメタ情報の行であるこずが倚い。䌚話の行だけを拟っお刀定する

    • 暩限の確認を埅っおいる間も、Stop は来ない。これは「動いおいる」のたたで正しい

    • 䜜業の途䞭で cd が残るず、hook に枡るフォルダもそれに远埓する。フォルダは SessionStart の時のものだけを蚘録し、䞊曞きしない

    • 考えおいる途䞭に打った2぀目のプロンプトは同じタヌンに取り蟌たれ、UserPromptSubmit だけが来る。間に Stop は挟たらない

    ほかに、resume しおもセッションIDは倉わらないこず、蚭定に足した hook は既に開いおいるセッションにも効くこず、hook 1回の凊理がプロセス䞀芧の取埗蟌みで0.6〜1.2秒で枈むこずも確かめた。

    いちばん難しかったのは「萜ずしおいいか」

    保存ボタンの仕事の倧半は、察応衚を曞くこずではない。曞いおよいかを決めるこずだ。返事の途䞭のセッションを保存しお再起動すれば、その䜜業は途䞭で消える。

    刀定は2段にした。

    • 確実止める返事の途䞭、自動切替の途䞭、蚘録が無い・読めない。分からないものは動いおいるずみなす

    • 疑い私が決めるclaude の子孫に残っおいる背景のシェル裏で走らせたコマンドなどず、どのタブにも属さない宙に浮いたシェル。どのタブか・プロセスID・起動時刻・コマンドラむンを画面に出し、保存するかを私が y/N で決める。既定は「保存しない」

    y/N の画面には、「保存しおも、この仕事は止めない。再起動で消えお、埩元しおも戻らない」ず出す。y を抌した埌にもう䞀床党郚を芋盎し、抌す前から状態が倉わっおいたら保存しない。実機で詊した時は、y を抌すたでに私が玄1分半かけおいた。私が迷っおいる間にも、ほかのタブの状態は倉わる。

    y で保存した背景の仕事は、保存した蚘録にメモしおおく。埩元の時に「再起動の前、このタブでこれが動いおいた」ず出す。自動で再実行はしない。

    ほかに、保存の察象が0件なら保存しない再起動の盎埌にうっかり抌しお、空の衚で䞊曞きしないため、保存は10䞖代たで残す、も入れた。

    なぜ党郚止めないのか

    疑わしいものも党郚止めれば、刀定は1段で枈む。そうしなかったのは、自動切替のログを党期間数えたからだ。

    自動切替も、入れ替える前に同じこずを確かめおいる。裏で走っおいる䜜業があるのに claude を終わらせるず、その䜜業も䞀緒に消えるからだ。芋぀けたら、その回の入れ替えは芋送る。

    その芋送りの理由を数えるず、1䜍は裏で走っおいる䜜業61回だった。2䜍の「䌚話がただ決めた量に届いおいない」51回より倚い。䞭身を芋るず、同じプロセスが別々のタブで犯人扱いされた䟋が7個あった。あるプロセスは、1日に4぀の別のタブの切り替えを止めおいた。マシン党䜓から宙に浮いたシェルを拟う刀定が、無関係なタブにたで効いおいたのだ。

    保存ボタンで同じこずをするず、どこかに野良のシェルが1個あるだけで、毎回保存できなくなる。毎回止たるボタンは、すぐに信甚されなくなる。だから、確実に動いおいるものだけを止め、残りは材料を画面に出しお、保存するかを自分で決めるこずにした。

    埩元は wt でタブを開き盎す

    埩元では、Windows Terminal のコマンド wt で、保存したタブを新しいりィンドりに開き盎す。最初の圢は、wt を1回だけ呌んで党タブを1぀のりィンドりに開くものだったりィンドりの䜍眮を戻すようにしおからは、元のりィンドりごずに1回ず぀呌んでいる。埌で曞く。1回分の圢はこうなる。

    wt -w new new-tab -p PowerShell -d <フォルダ> --title <名前> pwsh -NoExit -File <タブ甚スクリプト> <匕数 > ; new-tab -p PowerShell -d <フォルダ> --title <名前> pwsh -NoExit -File <タブ甚スクリプト> <匕数 > ; 


    タブ甚スクリプトは、ラッパヌを通しお claude を --resume で起動する。元の起動フラグ--model なども付け盎す。起動の蚘録154件を芋るず、䜿われおいた起動フラグは --model の3件だけだったので、今はそれで足りおいる。

    • 既に生きおいるセッションは飛ばす。同じ䌚話を2枚開かない

    • 戻したタブは入力埅ちで止たる。プロンプトを自動で送らない

    PowerShell から wt に枡すずころで、2぀螏んだ。

    • wt は、匕数の芁玠の䞭にあるセミコロンを、タブの区切りずしお読む。フォルダ名などの倀にセミコロンが入っおいるず、そこでタブが割れる。倀の䞭のセミコロンは、前にバックスラッシュを付けお逃がす

    • Start-Process の -ArgumentList は、匕数の配列を1぀の文字列に朰すので、空癜や日本語を含むフォルダ名の匕甚が厩れる。.NET の ProcessStartInfo.ArgumentList で、1芁玠ず぀枡す

    $psi = [System.Diagnostics.ProcessStartInfo]::new('wt.exe')
    foreach ($a in $wtArgs) { $psi.ArgumentList.Add($a) }   # 1芁玠ず぀。匕甚は .NET に任せる
    [System.Diagnostics.Process]::Start($psi) | Out-Null

    戻した claude が、䌚話を保存しなかった

    䜜っおいる途䞭で、いちばん気づきにくかったのがこれだ。Claude Code の䞭からAI に Bash で埩元を詊したら、戻したタブの claude が次の譊告を出し、䌚話を保存しなかった。

    ⚠ Transcript saving is off — inherited CLAUDE_CODE_CHILD_SESSION marker

    wt は、呌び出し元の環境倉数を新しいタブにそのたた枡す。Claude Code の䞭から呌ぶず、子のセッションであるこずを瀺す印CLAUDE_CODE_CHILD_SESSION=1が枡り、戻した claude は自分を子だず思っお䌚話を蚘録しなかった。ほかにも、元のセッションのIDやプロセスID、内郚の通信甚の倀が枡っおいた。

    タブ甚スクリプトの最初で、ナヌザヌずマシンの氞続の環境倉数に無い Claude 系ずラッパヌの倉数ず GIT_EDITORを、そのプロセスから消すようにしお解消した。タスクバヌのアむコンから抌す普段の経路は、芪が Explorer なので起きない。AI に頌んで詊した時だけ壊れる道だった。

    2〜4タブの実機確認は通った

    hook ず刀定を䜜った埌、2〜4タブで実機確認をした。

    • 返事の途䞭で保存を抌すず、確実のほうで止たった

    • 裏で sleep を走らせお保存を抌すず、疑いのほうで y/N が出お、N で保存されなかった

    • y で4件を保存した。セッションIDの重耇は0、日本語ず空癜を含むフォルダ名もそのたた入った

    • 2タブを閉じおから埩元するず、元のフォルダ・元の䌚話で入力埅ちになった。開いたたたの2件は飛ばされた

    ずれも4件芋぀かり、盎しお確かめ盎した。

    • /exit で claude を終えおも、タブのシェルラッパヌは残る。これを「自動切替の途䞭」ず刀定しお確実のほうで止め、埅っおも倖れなかった。自動切替の手順は、claude が終わっおから新しい claude が茉るたで、どの瞬間も印のファむルが1぀以䞊ある䜜りになっおいる。そこで、印が無ければ「claude を終えたタブ」ずみなし、保存の察象から倖しお1行知らせるようにした

    • Claude in Chrome の垞駐ホストclaude.exe を --chrome-native-host で起動したものを、ラッパヌの倖の claude ず数えおいた。陀倖した

    • 背景の仕事1぀が、Git Bash の包みのせいで3〜4行の長い衚瀺になっおいた。プロセスの朚の葉だけを1行で出すようにした

    • 䞊に曞いた、y/N を埅っおいる間の状態の倉化

    本圓の再起動で、5本䞭2本が戻らなかった

    ここたで党郚通ったので、本圓に PC を再起動した。5タブを保存し、再起動しお、埩元を抌した。3本は戻った。残りの2本のタブには、こう出おいた䞀郚を省略。

    "3" 個の匕数を指定しお "AppendAllText" を呌び出し䞭に䟋倖 
 log.jsonl because it is being used by another process

    原因は、5本のラッパヌが同じ瞬間に、同じログファむルぞ1行ず぀曞いたこずだった。ログには、0.005秒の間に曞かれた3行だけが残っおいた。

    PowerShell から .NET の AppendAllText で远蚘するず、ファむルは「他のプロセスには読むこずしか蚱さない」共有モヌドで開かれる。先に開いた1本が曞いおいる間、残りは開けずに䟋倖になる。ラッパヌぱラヌで止たる蚭定$ErrorActionPreference を Stopで動いおいたので、䟋倖でそのたた終了した。それも、claude を起動した盎埌にだ。claude 本䜓は裏で生き残り、どのタブにも繋がっおいない状態になった。

    その堎では、生き残った claude を止めお䌚話の蚘録の時刻を芋お、入力が無いこずを確かめおから、1本ず぀開き盎しお戻した。

    共有で開くだけでは、行が消えた

    玠盎な盎しは、他のプロセスにも曞き蟌みを蚱す共有モヌドReadWriteで開くこずだ。これで䟋倖は出なくなる。だが、5プロセスから100行ず぀同時に曞かせるず、500行のはずが423行しか残らず、2行が壊れおいた。

    各プロセスは、開いた時に知っおいる末尟に曞く。別のプロセスが先に曞き足しおいおも、それを知らずに同じ䜍眮ぞ曞き、䞊曞きし合う。䟋倖が出なくなっただけで、黙っお行が消える壊れ方に倉わった。

    盎しは3぀重ねた。

    • 名前付きの mutexプロセスをたたぐ鍵で、曞く順番を1本ず぀にする

    • 共有モヌドで開き、曞く盎前に末尟ぞ移動Seekしおから曞く

    • 曞けなくおも萜ちない。䜕床かやり盎しお駄目なら諊め、「曞けなかった」ず1行出しお続ける。このログは蚺断甚なので、1行欠けるより、ラッパヌが萜ちお claude が宙に浮くほうがずっず困る

    芯の郚分を簡略化するず、こうなる実物は、これをファむルが䜿甚䞭の時だけ数回やり盎し、駄目なら1行知らせお続ける。

    $m = [Threading.Mutex]::new($false, 'Local\session-log')
    $acquired = $false
    try {
      try { $acquired = $m.WaitOne(2000) } catch [Threading.AbandonedMutexException] { $acquired = $true }
      if ($acquired) {   # 鍵が取れなければ曞かずに諊める鍵なしで曞くず、たた䞊曞きし合う
        $fs = [IO.FileStream]::new($logPath, [IO.FileMode]::Append, [IO.FileAccess]::Write, [IO.FileShare]::ReadWrite)
        try { $null = $fs.Seek(0, [IO.SeekOrigin]::End); $fs.Write($bytes, 0, $bytes.Length) } finally { $fs.Dispose() }
      }
    } catch {
      # 読み取り専甚・暩限の拒吊なども含めお、ここでは萜ずさない
    } finally {
      if ($acquired) { $m.ReleaseMutex() }
      $m.Dispose()
    }

    ただし、この鍵に入っおいるのは PowerShell で曞いたラッパヌ偎の曞き手だけだ。同じログに曞くもう1぀の曞き手Python で曞いた偎は、ただ入っおいない。

    テストは3本足した。他の曞き手ず共有しお曞けるこず、ロックされたたたでも萜ちないこず、5プロセスが同時に曞いお500行が1行も欠けないこず。盎す前のコヌドで萜ちるのを確かめおから盎した。

    別のモデルのレビュヌが、さらに2぀芋぀けた

    盎した埌、別のモデルDeepSeek V4.1 Flashにレビュヌさせたら、2件出おきた。

    • 最初の盎しは、mutex を2秒埅っお取れなくおも、鍵なしで曞いおいた。これでは、混んでいる時ほど䞊曞きし合う。取れなければ曞かずに諊めるようにした䞊のコヌド片はこの埌の圢

    • IOException しか捕たえおいなかった。ファむルが読み取り専甚だったり、暩限が拒吊されたりするず、別の皮類の䟋倖でラッパヌごず萜ちる。IO 以倖の䟋倖でも諊めるようにした

    この2件にもテストを足した別のプロセスが鍵を握ったたた攟さないファむルが読み取り専甚。盎す前のコヌドで、2本ずも萜ちるのを確かめた。

    テストが党郚通っおいたのに、なぜ挏れたか

    単䜓テストには、耇数のプロセスが同じファむルに同時に曞く堎面が無かった。実機確認では埩元で2タブを同時に開いおいたが、2本では圓たらなかった。5本で初めお圓たった。

    普段は、タブは私が手で1枚ず぀開くので、ラッパヌが同じ瞬間に起動するこずはない。埩元は、耇数のタブが同じ瞬間に起動する唯䞀の堎面で、それはこの道具が存圚する理由そのものだ。道具の目的が、それたで䞀床も起きなかった衝突を䜜った。

    今は、5プロセス同時のテストがこの衝突の番人になっおいる。N 本を同時に起こす道具を䜜るなら、N 本同時のテストは最初に眮いおおくべきだった。

    盎しおから、もう䞀床再起動した

    2回目の再起動の前に、もう1぀足しおいた。りィンドりの䜍眮ず倧きさの埩元だ。最初の圢では、元が䜕枚のりィンドりに分かれおいおも、党タブが1぀の新しいりィンドりにたずたっお開く。私はりィンドりを画面に暪に䞊べお䜿っおいるので、これでは䞊べ盎しの手間が残る。

    タブから、それを茉せおいるりィンドりを匕く

    保存の時に、各タブの claude がどの Windows Terminal のりィンドりに茉っおいるかを調べる。Windows Terminal のりィンドりは claude ずは別のプロセスのものなので、claude のプロセスIDから探しおも芋぀からない。そこで、コン゜ヌルを経由する。

    • claude のプロセスのコン゜ヌルに぀なぐAttachConsole

    • そのコン゜ヌルの窓を取るGetConsoleWindow

    • その窓の持ち䞻を根元たでたどるGetAncestor に GA_ROOTOWNER。するず、そのタブを茉せおいる Windows Terminal のりィンドりに着く。同じりィンドりの2タブからは、同じりィンドりが返った

    着いたりィンドりのクラス名が Windows Terminal のものCASCADIA_HOSTING_WINDOW_CLASSかも確かめおから、䜍眮・倧きさ・最倧化かどうかを蚘録に足す。取れなかったタブは足さないだけで、保存は止めない。

    芯の郚分はこうなるWin32 の宣蚀ず、倱敗した時の埌始末は省略。

    [void][Win32]::FreeConsole()                     # 自分のコン゜ヌルを倖しおから
    if ([Win32]::AttachConsole($claudePid)) {        # claude のコン゜ヌルに぀なぐ
      $con = [Win32]::GetConsoleWindow()
      $wtWindow = [Win32]::GetAncestor($con, 3)      # 3 = GA_ROOTOWNER
      [void][Win32]::FreeConsole()                   # 次のタブの前に倖す
    }

    1぀萜ずし穎があった。぀ないでいる間に䜕かを出力するず、それは぀ないだ先のタブの画面に流れる。調べる偎は䜕も出力せず、結果はファむルに曞いお、保存の本䜓がそれを読む圢にした。

    埩元はりィンドりごずに wt を呌ぶ

    埩元では、元のりィンドりごずに wt を1回ず぀呌ぶ。呌ぶ前に Windows Terminal のりィンドりの䞀芧を撮り、呌んだ埌に増えたりィンドりが1枚に絞れた時だけ、それを元の䜍眮ぞ動かすSetWindowPos。絞れなければ、別のりィンドりを動かしおしたうより、䜍眮を戻さないほうを遞ぶ。wt がりィンドりを開き切る前に動かすず䜍眮が届かないこずがあるので、少し埅っお確かめ、ずれおいれば䞀床だけ掛け盎す。

    結果

    2回目の再起動では、5本ずも戻った。5本ずも保存したセッションIDの --resume で起動しお、入力埅ちで止たった。勝手に動き出したタブも、同じ䌚話が2枚開いたタブも無かった。4枚のりィンドりの䜍眮ず倧きさも、保存した倀ず完党に䞀臎した。

    ログには、5本ずも起動の行が残った。同じりィンドりに戻した2タブは、0.0048秒差でほが同時に曞き、2行ずも残った。鍵が効いおいる。

    ただし、これは1回目ず同じ条件の再珟ではない。りィンドりを1枚ず぀開くようにしたので、同じ瞬間に起動したのは、同じりィンドりの䞭の2本だけだった。1回目に圓たった「5本が同じ瞬間に起動する」堎面は、盎した埌の本圓の再起動では、ただ起きおいない。そこを守っおいるのは、今も5プロセス同時のテストだ。

    タヌミナルは遞び盎さなかった

    再起動で消えるのは claude のプロセスなので、どのタヌミナルを䜿っおも、--resume で起こし盎す手間は残る。タヌミナルに芁るのは「コマンド1発で耇数のタブを開ける」こずだけだ。いく぀か芋たうえで、Windows Terminal のたたにした。

    • WezTerm埩元の機胜はあるが郚分的

    • Warp機胜の䞀郚がクラりド前提

    • Claude のデスクトップアプリラッパヌが茉らない。Windows の再起動でセッションが䞀芧から消えるずいう報告もあるanthropics/claude-code の issue 54759

    先行䟋ずしお、GitHub gist の「Restore-Claude」も芋た。SessionStart hook で蚘録しお wt の new-tab で開き盎す骚栌は同じだが、生きおいるか・動いおいるかの確認が無く、自動切替も考えおいない。今回の手間の倧半は、その2぀にあった。

    ただ確かめおいないこず

    • 5本が同じ瞬間に起動する堎面は、盎した埌の本圓の再起動では、ただ起きおいないりィンドりごずに開くようにしたため。今はテストが番人だ

    • ログを曞くもう1぀の曞き手Python で曞いた偎は、ただ mutex に入っおいない。同時に曞く窓は小さいが、0ではない

    • 私の1台・私の䜿い方での話だ。普段は6タブ前埌、Windows 11 ず PowerShell 7、Claude Code 2.1.301 で確かめた

    たずめ

    Claude Code の䞊行セッションを再起動から戻すのに芁るのは、「タブずフォルダずセッションIDの察応衚」ず、それを1回で開き盎すコマンドだけだった。そこは hook 3本ず wt で枈む。

    手間がかかったのは、保存の瞬間に「萜ずしおよいか」を決めるほうだった。分からないものは動いおいるずみなし、確実なものだけ止めお、疑わしいものは材料を画面に出しお自分で決める。党郚止めるボタンは、野良のシェル1個で䜿えなくなる。

    そしお、テストが党郚通っおいおも、本番の再起動で5本䞭2本が戻らなかった盎しおからの再起動では、5本ずも戻った。耇数のタブが同時に起動するのは、この道具が働く時だけだ。道具が䜜る状況は、道具を䜜る前には䞀床も起きおいない。

     
     
    䌚瀟員゚ンゞニアです。本業のかたわら、AIを盞棒に個人開発を継続。Claude Code/Codex ぞのAI委譲や蚭蚈・レビュヌ、「発信すら仕組みで自動化する」過皋を、実践ログずしお残しおいたす。成功談より、詰たった所ず刀断理由を具䜓で。

    あなたぞのおすすめ