Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Bashスクリプトにおけるバッチ処理の同時実行制御について #ツナギメオフライン.4

Avatar for akase244 akase244
January 21, 2026

Bashスクリプトにおけるバッチ処理の同時実行制御について #ツナギメオフライン.4

ツナギメオフライン ベンキョウカイ #4で発表したスライドです。

Avatar for akase244

akase244

January 21, 2026
Tweet

More Decks by akase244

Other Decks in Technology

Transcript

  1. LOCKFILE=/tmp/mybatch.lock if [ ! -f "$LOCKFILE" ]; then touch "$LOCKFILE"

    # 処理 fi trap 'rm -f "$LOCKFILE"' EXIT January 21, 2026. ツナギメオフライン ベンキョウカイ #4
  2. • 厳密には同時実行を防げない。 • 強制終了(「ctrl-c」、「kill -9」)した場合にロックファイルが残る。 • 処理実行中にサーバーが再起動した場合はロックファイルが残る。 • スクリプトに不具合があると途中で終了しロックファイルが残る。 •

    ロックファイルが存在している場合に「処理中の状態」なのか「処理に失敗 して残っている状態」なのかを判別できない。 January 21, 2026. ツナギメオフライン ベンキョウカイ #4
  3. • 厳密には同時実行を防げない。 • 強制終了(「ctrl-c」、「kill -9」)した場合にロックファイルが残る。 • 処理実行中にサーバーが再起動した場合はロックファイルが残る。 • スクリプトに不具合があると途中で終了しロックファイルが残る。 •

    ロックファイルが存在している場合に「処理中の状態」なのか「処理に失敗 して残っている状態」なのかを判別できない。 January 21, 2026. ツナギメオフライン ベンキョウカイ #4
  4. LOCKFILE=/tmp/mybatch.lock if [ ! -f "$LOCKFILE" ]; then # 状態を確認した時点

    # ここで別の処理に割り込まれる余地がある touch "$LOCKFILE" # 利用する時点 # 処理 fi trap 'rm -f "$LOCKFILE"' EXIT January 21, 2026. ツナギメオフライン ベンキョウカイ #4
  5. • 「200」はファイルディスクリプタ番号。 • 数字は何でもよいが0〜2は予約されている。 ◦ 0: stdin(標準入力) ◦ 1: stdout(標準出力)

    ◦ 2: stderr(標準エラー出力) • 「3」以降であれば利用してよい。 January 21, 2026. ツナギメオフライン ベンキョウカイ #4
  6. • ulimit • sysctl • fs.nr_open • /etc/security/limits.conf January 21,

    2026. ツナギメオフライン ベンキョウカイ #4 あまり詳しくないのでこのあたりを キーワードにしてAIに聞いてください
  7. • Linuxカーネルのロック機構(排他制御)。 ◦ 「-n」はノンブロッキングを意味する。 ▪ ロックが取れなければすぐに処理を終了する。 ◦ プロセスが終了するとロックが解放されることが保証されている。 ▪ 正常終了(「exit

    0」) ▪ 異常終了(「exit 0」以外) ▪ 強制終了(「ctrl-c」(SIGINT)、「kill -9」(SIGKILL)) ▪ 予期せぬ再起動・電源断 January 21, 2026. ツナギメオフライン ベンキョウカイ #4
  8. # crontabの場合はこのように簡潔な書き方でOK * * * * * /usr/bin/flock -n lockfile

    command January 21, 2026. ツナギメオフライン ベンキョウカイ #4
  9. LOCKDIR=/tmp/mybatch.lock if ! mkdir "$LOCKDIR" 2>/dev/null; then echo "すでに実行中" exit

    1 fi ・ ・ trap 'rmdir "$LOCKDIR"' EXIT January 21, 2026. ツナギメオフライン ベンキョウカイ #4
  10. • PHP ◦ https://www.php.net/manual/ja/function.flock.php • Python ◦ https://docs.python.org/3/library/fcntl.html#fcntl.flock • Ruby

    ◦ https://docs.ruby-lang.org/ja/latest/method/File/i/flock.html • Java ◦ https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java /nio/channels/FileChannel.html#lock() • Go ◦ https://pkg.go.dev/syscall#Flock January 21, 2026. ツナギメオフライン ベンキョウカイ #4