Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Bashスクリプトにおけるバッチ処理の同時実行制御について #ツナギメオフライン.4
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
akase244
January 21, 2026
Technology
150
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Bashスクリプトにおけるバッチ処理の同時実行制御について #ツナギメオフライン.4
ツナギメオフライン ベンキョウカイ #4で発表したスライドです。
akase244
January 21, 2026
More Decks by akase244
See All by akase244
Laravelのアプリケーションをどこにデプロイするか #ツナギメオフライン.9
akase244
0
120
mkpasswd を再実装したくなったので AIに伴走してもらいながら rekey という パスワードジェネレーターを作ってみた #fukuokago
akase244
0
48
Let’s Encryptのフォールバック先について #ツナギメオフライン.8
akase244
0
71
PHPでローカル環境用のSSL/TLS証明書を発行することはできるのか? #phpconkagawa
akase244
0
500
「Linuxサーバー構築標準教科書」を読んでみた #ツナギメオフライン.7
akase244
0
1.4k
connpassのMCPを作ってみた #ツナギメオフライン.6
akase244
0
82
ローカル環境でSSL/TLS証明書を発行して警告表示を出さないようにするアレコレ #ツナギメオフライン.5
akase244
0
110
GitHub Actionsを使って指定した日時にPull Requestをマージしたい #lydmeet
akase244
0
100
疎通・有効期限を確認するコマンド #ツナギメオフライン.3
akase244
0
110
Other Decks in Technology
See All in Technology
プロダクト思考 × 基盤思考を AIで実現する Compound Engineering
tkc66buzz
1
310
AIオーケストレーションを活用した 開発ワークフローの設計と実践
bqnq
0
120
多層防御と最⼩権限で実現する、安全なAIエージェント設計パターン
lycorptech_jp
PRO
1
250
ASTを使って影響範囲を特定する
nealle
0
140
The Agent Builder Loop from Daily Work to OSS
minorun365
PRO
3
120
DEFCON_CHV_CTF_Write-up.pdf
bata_24
0
120
あるけみー式LTスライド作成術
alchemy1115
1
140
2026-09-04 SRE Tech Talk #15 怠惰なTerraform / Lazy Terraform
masasuzu
0
230
Snowflakeのコスト最適化を支えるアーキテクチャ設計
ktatsuya
0
1.3k
From Vanilla Kubernetes to a Batteries-Included Platform: Developer Experience at 1,300+ Clusters
yosshi_
0
670
OpenTelemetryのメトリクスをCloudWatchに送ってPromQLで見てみた
ota1022
0
100
Amazon Quick on DesktopがIAM Identity Centerで動かない理由
yukiogawa
0
140
Featured
See All Featured
Faster Mobile Websites
deanohume
310
32k
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
600
Technical Leadership for Architectural Decision Making
baasie
3
560
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
470
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
680
How to make the Groovebox
asonas
2
2.4k
Exploring anti-patterns in Rails
aemeredith
3
500
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
230
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.8k
Building Applications with DynamoDB
mza
96
7.2k
Agile that works and the tools we love
rasmusluckow
331
22k
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