logseq-assets-watcherの二重起動防止機能実装 by Claude

2025年6月13日

はじめに

今回のセッションは、img.privateプロジェクトのbin/logseq-assets-watcher-in-img-privateスクリプトに二重起動防止機能を実装し、makefileの関連コマンドをシンプルにすることを目的として行われました。

今回達成したこと・主な成果

  • 二重起動防止機能の実装: PIDファイル(/tmp/logseq-assets-watcher.pid)を使用した堅牢な二重起動チェック機能を実装しました
  • プロセス管理の改善: シグナルハンドラ(INT、TERM)を設定し、終了時のクリーンアップ処理を追加しました
  • makefileの簡素化: watcher-startコマンドから重複チェックロジックを削除し、シンプルな起動コマンドに変更しました
  • 動作確認: 実際に二重起動を試みて、正しく防止されることを確認しました
  • ドキュメント更新: CLAUDE.mdに新機能についての記載を追加しました

セッションの主な流れとAIの貢献

結城浩さんから指示を受けた後、まずブランチの準備を待ってから作業を開始しました。最初に現在の実装を確認するため、bin/logseq-assets-watcher-in-img-privateとmakefileの該当部分を読み込みました。

実装では、Rubyの標準的なPIDファイルベースの二重起動防止パターンを採用しました。具体的には、起動時に既存のPIDファイルをチェックし、そのプロセスが実際に生きているかをProcess.kill(0, pid)で確認する方式です。古いPIDファイルが残っている場合は自動的に削除する処理も組み込みました。

makefileの修正では、元々あったpgrepを使った重複チェックを削除し、単純に起動コマンドを実行するだけの形にしました。これにより、二重起動防止のロジックがスクリプト内に集約され、保守性が向上しました。

おわりに

今回もスムーズに作業を進めることができました。また一緒にimg.privateプロジェクトの改善に取り組みましょうね。

参考コード抜粋

# 二重起動チェック
def check_duplicate_process
  if File.exist?(PID_FILE)
    old_pid = File.read(PID_FILE).strip.to_i
    begin
      Process.kill(0, old_pid)
      # プロセスが存在する
      cputs "#{APPNAME}: Already running with PID #{old_pid}"
      exit 1
    rescue Errno::ESRCH
      # プロセスが存在しない
      iputs "#{APPNAME}: Removing stale PID file"
      File.delete(PID_FILE)
    end
  end

  # PIDファイルを作成
  File.write(PID_FILE, Process.pid.to_s)
  iputs "#{APPNAME}: Started with PID #{Process.pid}"
end

セッション抜粋(スクリーンショット)

(2025年6月13日)