Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Bashスクリプトにおけるバッチ処理の同時実行制御について #ツナギメオフライン.4
Search
akase244
January 21, 2026
Technology
0
78
Bashスクリプトにおけるバッチ処理の同時実行制御について #ツナギメオフライン.4
ツナギメオフライン ベンキョウカイ #4で発表したスライドです。
akase244
January 21, 2026
Tweet
Share
More Decks by akase244
See All by akase244
ローカル環境でSSL/TLS証明書を発行して警告表示を出さないようにするアレコレ #ツナギメオフライン.5
akase244
0
41
GitHub Actionsを使って指定した日時にPull Requestをマージしたい #lydmeet
akase244
0
43
疎通・有効期限を確認するコマンド #ツナギメオフライン.3
akase244
0
58
AIサービスに利用規約について聞いてみた #ツナギメオフライン.2
akase244
0
55
なぜ、新たに勉強会を始めるのか? #ツナギメオフライン.1
akase244
0
83
ある日突然あなたが管理しているサーバーにDDoSが来たらどうなるでしょう?知ってるようで何も知らなかったDDoS攻撃と対策 #phpcon.2024
akase244
3
8.9k
GoナニモワカラナイけどChatGPTと共に解決したい課題が解けるかやってみた #fukuokago
akase244
0
140
ブラウザの向こう側で「200 OK」を返すまでに何が起きているのか調べてみた #phperkaigi
akase244
7
3.4k
FQDN(ドメイン名)のバリデーションが意外と面倒だった #phpcon2022
akase244
1
2k
Other Decks in Technology
See All in Technology
Claude Codeの進化と各機能の活かし方
oikon48
6
1.7k
大規模サービスにおける レガシーコードからReactへの移行
magicpod
1
130
DX Improvement at Scale
ntk1000
2
280
EMからICへ、二周目人材としてAI全振りのプロダクト開発で見つけた武器
yug1224
3
380
名刺メーカーDevグループ 紹介資料
sansan33
PRO
0
1.1k
研究開発部メンバーの働き⽅ / Sansan R&D Profile
sansan33
PRO
4
22k
JAWS DAYS 2026 CDP道場 事前説明会 / JAWS DAYS 2026 CDP Dojo briefing document
naospon
0
140
オンプレとGoogle Cloudを安全に繋ぐための、セキュア通信の勘所
waiwai2111
3
1.1k
All About Sansan – for New Global Engineers
sansan33
PRO
1
1.4k
Security Diaries of an Open Source IAM
ahus1
0
200
Devinを導入したら予想外の人たちに好評だった
tomuro
0
880
Bill One 開発エンジニア 紹介資料
sansan33
PRO
5
18k
Featured
See All Featured
Thoughts on Productivity
jonyablonski
75
5.1k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
122
21k
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
220
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
470
Java REST API Framework Comparison - PWX 2021
mraible
34
9.2k
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
98
Imperfection Machines: The Place of Print at Facebook
scottboms
269
14k
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
170
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
210
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
120
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
80
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.4k
Transcript
Bashスクリプトにおける バッチ処理の同時実行制御について ツナギメオフライン ベンキョウカイ #4 January 21, 2026.
@akase244 <?php var_dump( (new Me()) ->WebApplicationEngineer() ->InfrastructureEngineer() ); January 21,
2026. ツナギメオフライン ベンキョウカイ #4
@tsunagimefm https://tsunagi.me/ January 21, 2026. ツナギメオフライン ベンキョウカイ #4
みなさんバッチ処理書いてますか? January 21, 2026. ツナギメオフライン ベンキョウカイ #4
そのバッチ処理は同時に動いても問題ないですか? January 21, 2026. ツナギメオフライン ベンキョウカイ #4
同時実行をあまり考えず こんな処理を書いてました January 21, 2026. ツナギメオフライン ベンキョウカイ #4
LOCKFILE=/tmp/mybatch.lock if [ ! -f "$LOCKFILE" ]; then touch "$LOCKFILE"
# 処理 fi trap 'rm -f "$LOCKFILE"' EXIT January 21, 2026. ツナギメオフライン ベンキョウカイ #4
パッと見は良さそう January 21, 2026. ツナギメオフライン ベンキョウカイ #4
何が問題か January 21, 2026. ツナギメオフライン ベンキョウカイ #4
色々と問題が January 21, 2026. ツナギメオフライン ベンキョウカイ #4
• 厳密には同時実行を防げない。 • 強制終了(「ctrl-c」、「kill -9」)した場合にロックファイルが残る。 • 処理実行中にサーバーが再起動した場合はロックファイルが残る。 • スクリプトに不具合があると途中で終了しロックファイルが残る。 •
ロックファイルが存在している場合に「処理中の状態」なのか「処理に失敗 して残っている状態」なのかを判別できない。 January 21, 2026. ツナギメオフライン ベンキョウカイ #4
• 厳密には同時実行を防げない。 • 強制終了(「ctrl-c」、「kill -9」)した場合にロックファイルが残る。 • 処理実行中にサーバーが再起動した場合はロックファイルが残る。 • スクリプトに不具合があると途中で終了しロックファイルが残る。 •
ロックファイルが存在している場合に「処理中の状態」なのか「処理に失敗 して残っている状態」なのかを判別できない。 January 21, 2026. ツナギメオフライン ベンキョウカイ #4
TOCTOU(Time-of-check to time-of-use) January 21, 2026. ツナギメオフライン ベンキョウカイ #4
January 21, 2026. ツナギメオフライン ベンキョウカイ #4 https://ja.wikipedia.org/wiki/Time-of-check_to_time-of-use
トックトゥー? January 21, 2026. ツナギメオフライン ベンキョウカイ #4
なんかちょっと発音するのが恥ずかしい January 21, 2026. ツナギメオフライン ベンキョウカイ #4
状態を確認した時点と実際にそれを利用する時点の 間に割り込まれる余地があるという問題 January 21, 2026. ツナギメオフライン ベンキョウカイ #4
LOCKFILE=/tmp/mybatch.lock if [ ! -f "$LOCKFILE" ]; then # 状態を確認した時点
# ここで別の処理に割り込まれる余地がある touch "$LOCKFILE" # 利用する時点 # 処理 fi trap 'rm -f "$LOCKFILE"' EXIT January 21, 2026. ツナギメオフライン ベンキョウカイ #4
ではどのように対応するか? January 21, 2026. ツナギメオフライン ベンキョウカイ #4
アプリケーションの仕組みで解決するのではなく カーネルの仕組みで解決する January 21, 2026. ツナギメオフライン ベンキョウカイ #4
LOCKFILE=/tmp/mybatch.lock exec 200>"$LOCKFILE" flock -n 200 # 以降、シェルが生きている限りロックを保持 January 21,
2026. ツナギメオフライン ベンキョウカイ #4
「exec 200>"$LOCKFILE"」??? January 21, 2026. ツナギメオフライン ベンキョウカイ #4
「command > /dev/null 2>&1」の 仲間だと思ってください January 21, 2026. ツナギメオフライン ベンキョウカイ
#4
• 「200」はファイルディスクリプタ番号。 • 数字は何でもよいが0〜2は予約されている。 ◦ 0: stdin(標準入力) ◦ 1: stdout(標準出力)
◦ 2: stderr(標準エラー出力) • 「3」以降であれば利用してよい。 January 21, 2026. ツナギメオフライン ベンキョウカイ #4
ファイルディスクリプタ番号の上限値は? January 21, 2026. ツナギメオフライン ベンキョウカイ #4
• ulimit • sysctl • fs.nr_open • /etc/security/limits.conf January 21,
2026. ツナギメオフライン ベンキョウカイ #4 あまり詳しくないのでこのあたりを キーワードにしてAIに聞いてください
「flock -n 200」??? January 21, 2026. ツナギメオフライン ベンキョウカイ #4
• Linuxカーネルのロック機構(排他制御)。 ◦ 「-n」はノンブロッキングを意味する。 ▪ ロックが取れなければすぐに処理を終了する。 ◦ プロセスが終了するとロックが解放されることが保証されている。 ▪ 正常終了(「exit
0」) ▪ 異常終了(「exit 0」以外) ▪ 強制終了(「ctrl-c」(SIGINT)、「kill -9」(SIGKILL)) ▪ 予期せぬ再起動・電源断 January 21, 2026. ツナギメオフライン ベンキョウカイ #4
crontabで排他制御を行いたい場合は? January 21, 2026. ツナギメオフライン ベンキョウカイ #4
# crontabの場合はこのように簡潔な書き方でOK * * * * * /usr/bin/flock -n lockfile
command January 21, 2026. ツナギメオフライン ベンキョウカイ #4
flockとか難しいんですけど? January 21, 2026. ツナギメオフライン ベンキョウカイ #4
LOCKDIR=/tmp/mybatch.lock if ! mkdir "$LOCKDIR" 2>/dev/null; then echo "すでに実行中" exit
1 fi ・ ・ trap 'rmdir "$LOCKDIR"' EXIT January 21, 2026. ツナギメオフライン ベンキョウカイ #4
mkdirはアトミックな処理 January 21, 2026. ツナギメオフライン ベンキョウカイ #4
• アトミックとは途中で割り込まれず成功か失敗かのどちらかしか起きない操 作。 • mkdirは後から実行した方が必ず失敗する。 • ただし、trapだけではロックディレクトリが残る可能性あり。 January 21, 2026.
ツナギメオフライン ベンキョウカイ #4
Bashスクリプトではなく プログラミング言語の場合は? January 21, 2026. ツナギメオフライン ベンキョウカイ #4
• 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
まとめ January 21, 2026. ツナギメオフライン ベンキョウカイ #4
• 同実行制御はアプリケーション側で対応するのではなく、カーネルの仕組 み(flock)を利用するか、アトミックな処理(mkdir)で対応する。 • 各プログラミング言語毎にflockの実装が準備されている。 • TOCTOUを発音するとなんだか恥ずかしい。 January 21, 2026.
ツナギメオフライン ベンキョウカイ #4
Thanks! Have a good programming!! January 21, 2026. ツナギメオフライン ベンキョウカイ
#4