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
安全にプロセスを停止するためにシグナル制御を学ぼう!
Search
yamamoto-hiroya
March 23, 2023
Technology
2.3k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
安全にプロセスを停止するためにシグナル制御を学ぼう!
yamamoto-hiroya
March 23, 2023
More Decks by yamamoto-hiroya
See All by yamamoto-hiroya
AUTO_INCREMENTのIDカラムがオーバーフローしたらどうなるの?実例から学ぶDB設計の注意点
yamamotohiroya
1
1k
パフォーマンスを改善するには仕様変更が1番はやい
yamamotohiroya
18
8.2k
プルリクサイズが大きいと警告してくれる君を作りました!
yamamotohiroya
1
560
カンファレンスはフィードバックが大事
yamamotohiroya
1
150
ISUCONのススメ
yamamotohiroya
0
990
Other Decks in Technology
See All in Technology
信頼できるテスティングAIをどう育てるか?
odan611
0
180
Data Hubグループ 紹介資料
sansan33
PRO
0
3.1k
[しろおび夏祭り2026] チャットするAIから、作業するAIへ - 使われ方の変化と、その裏側で起きていること
kk0n
0
660
AI工学特論: MLOps・継続的評価
asei
11
3.1k
AIエージェントの知識表現と推論に なぜグラフが使われるのか - 記号的AIの復権とニューラルAIとの統合
yohei1126
1
250
AIツールを導入しても生産性はあがらない? カオナビが直面した 3つの壁と乗り越え方。/ Overcoming 3 Barriers to AI-Driven Productivity at kaonavi
kaonavi
0
1.3k
CloudWatchから始めるAWS監視
butadora
0
310
Retriever と Reranker、結局どうする?
kazuaki
1
570
NetBoxを利用した作業効率化の試み_NetDevNight4
tnoha
0
420
なぜ、あなたのAPIは使われないのか? AX時代の設計原則、ガードレール、運用体制
yokawasa
1
1.2k
Escolhendo LLMs na Prática: Lições Reais em Busca Agêntica no Mercado Livre —TDC 2026 Floripa
jpbonson
0
110
エンタープライズデータへ安全につなぐ Production-ready なエージェント設計 ― AI × MCP リファレンスアーキテクチャ ― #AIDevDay
cdataj
1
450
Featured
See All Featured
Optimizing for Happiness
mojombo
378
71k
How Software Deployment tools have changed in the past 20 years
geshan
1
34k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.6k
Building Flexible Design Systems
yeseniaperezcruz
330
40k
Embracing the Ebb and Flow
colly
88
5.1k
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
620
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
30k
Digital Ethics as a Driver of Design Innovation
axbom
PRO
1
350
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
2
3.7k
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
420
Transcript
安全にプロセスを停止するために シグナル制御を学ぼう! NE株式会社 やまもとひろや
先に注意 • 本スライドにはサンプルコードがいくつか登場し ます。 • 文字が小さく読みにくい場合があります。 • 気になる方はお手元でスライドを開いて視聴す ることをオススメします。 2
自己紹介 • NE株式会社のやまもとひろやです。 • PHPerKaigi2022 ◦ ベストフィードバッカー殿堂入りしました。 ◦ PHPerチャレンジは4位でした。 •
プロポーザル採択のレギュラーセッションは初です。 • PHP歴約10年です。 • 右の写真はPHPerKaigi2021の ベストフィードバッカー賞でもらった Oculus Quest 2です。 • よろしくおねがいします! 3
アジェンダ • ターゲット • 「プロセス」とは • 「シグナル」とは • 「シグナル制御」とは •
「安全に」とは • 活用例 • まとめ 4
ターゲット • PHPの処理を ◦ Ctrl+Cで止めたことがある人 ◦ killコマンドで止めたことがある人 • PHPの処理が途中で死んで困ったことがある人 •
プロセス/シグナルが何となくしか分からない人 • 同僚や後輩に「シグナル制御って何?」って聞かれた時に答えに困る人 • 是非持ち帰って共有してください! 5
それではスタート! 6
プロセスはすぐ死ぬ 7 よーし今から処理するぞー! プロセス君
プロセスはすぐ死ぬ 8 よーし今から処理するぞー! プロセス君 シグナル君 あ、処理やめてください
プロセスはすぐ死ぬ 9 よーし今から処理するぞー! プロセス君 シグナル君 やっぱり処理やーめた あ、処理やめてください
プロセスはすぐ死ぬ 10 よーし今から処理するぞー! プロセス君 シグナル君 やっぱり処理やーめた あ、処理やめてください • どこまで処理されたか分からない! •
最初から処理をやり直さないと! • ゴミデータが残ってしまった!
• 本講演においてはPHPの処理のことをプロセスと呼びます。 • 例えば以下のtest.phpを実行したとして、psコマンドに載ってくるものがプロセスです。 プロセスってなに? test.php <?php while(1){} 11 $
ps PID TTY TIME CMD 63512 ttys001 0:03.34 php test.php
シグナルって何? • 本講演においてはプロセスに対して与える命令のことをシグナルと呼びます。 • 例えば先程のtest.phpの実行を停止するためにCtrl+Cで止めたとして、内部的にはプロセ スに対してSIGINTというシグナルが送られて停止しています。 • Ctrl+CがSIGINTというのは以下で確認ができます。 ◦ ^CがCtrl+Cの意味
◦ intrがSIGINTの意味 12 $ stty -a cchars: discard = ^O; dsusp = ^Y; eof = ^D; eol = <undef>; eol2 = <undef>; erase = ^?; intr = ^C; kill = ^U; lnext = ^V; min = 1; quit = ^\; reprint = ^R; start = ^Q; status = ^T; stop = ^S; susp = ^Z; time = 0; werase = <undef>;
どういう時にシグナルが送られてくるの? • PHPスクリプト実行中にCtrl+C • PHPスクリプトのプロセスに対してkillコマンド • PHPが動いているDockerコンテナに対してdocker stop • PHPが動いているAWS/コンテナに対してデプロイ/コンテナ切替など
• etc 13
シグナル制御ってなに? 14 よーし今から処理するぞー! プロセス君
シグナル制御ってなに? 15 よーし今から処理するぞー! プロセス君 シグナル君 あ、処理やめてください
シグナル制御ってなに? 16 よーし今から処理するぞー! プロセス君 シグナル君 ちょっと待ってくださいね。 この処理が終わってから停止しますね。(キリッ) あ、処理やめてください
シグナル制御ってなに? • 本講演においてはプロセスにシグナルが送られてきた際、処理を終了する前に何らかの処 理を実施することをシグナル制御(シグナルハンドリング)と呼びます。 • 例えば先程の無限ループにプロセスにて終了する前に echo ”hoge”;する、みたいなことが できるようになるのがシグナル制御です。 17
「安全に」とは • 本講演においては「後片付け・後処理をしたうえで終了すること」を安全にプロセスを停止す る、と定義します。 • 例えば以下のようなステータスをデータ管理しているとして • 10: 未着手→20: 着手中→30:
終了 • これらは一連の処理で30になり20で止まることが基本的にないものの場合、異常終了した 際には10に戻して終了する、などが安全に処理を終了するということになります。 18
シグナル制御のコード解説 19
シグナル制御 20 • pcntl_async_signals(true); ◦ シグナルハンドラを有効にする。 ◦ とりあえず最初に宣言しておけば OK。 •
pcntl_signal(SIGINT, "hoge_handler"); ◦ シグナルハンドラの設定をする。 ◦ SIGINTが来たらhoge_handlerというハンドラ (関数)を実行するという意味。 • hoge_handler ◦ 今回の制御処理。以降ハンドラと呼ぶ。 ◦ hogeを出力して処理を終了する。
シグナル制御 21 • pcntl_async_signals(true); ◦ シグナルハンドラを有効にする。 ◦ とりあえず最初に宣言しておけば OK。 •
pcntl_signal(SIGINT, "hoge_handler"); ◦ シグナルハンドラの設定をする。 ◦ SIGINTが来たらhoge_handlerというハンドラ (関数)を実行するという意味。 • hoge_handler ◦ 今回の制御処理。以降ハンドラと呼ぶ。 ◦ hogeを出力して処理を終了する。
シグナル制御 22 • pcntl_async_signals(true); ◦ シグナルハンドラを有効にする。 ◦ とりあえず最初に宣言しておけば OK。 •
pcntl_signal(SIGINT, "hoge_handler"); ◦ シグナルハンドラの設定をする。 ◦ SIGINTが来たらhoge_handlerというハンドラ (関数)を実行するという意味。 • hoge_handler ◦ 今回の制御処理。以降ハンドラと呼ぶ。 ◦ hogeを出力して処理を終了する。
pcntl_signalについて • 第1引数signal: シグナルの種類(1とか2とか) • 第2引数handler: 後述 • 第3引数restart_syscalls: ※説明を省略
23
pcntl_signalについて • 引数に渡すhandlerについて • 公式リファレンス 24 • signo, siginfoが送られてくるか受け取らなくても良い •
returnはvoidでなくても良い(何でも良い)
余談: callableについて • callableについて ◦ 関数名そのまま渡す場合 ▪ 単純に文字列で’hoge’を渡せば良い ◦ staticメソッドを渡す場合
▪ 配列でarray(‘class_name’, ‘method_name’) ▪ 文字列で’class_name::method_name’ ◦ インスタンスメソッドを渡す場合 ▪ array($obj, ‘method_name’) ▪ array($this, ‘method_name’) ◦ その他selfやparentも使える 25
シグナルの種類 $ kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT
4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGEMT 8) SIGFPE 9) SIGKILL 10) SIGBUS 11) SIGSEGV 12) SIGSYS 13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGURG 17) SIGSTOP 18) SIGTSTP 19) SIGCONT 20) SIGCHLD 21) SIGTTIN 22) SIGTTOU 23) SIGIO 24) SIGXCPU 25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGINFO 30) SIGUSR1 31) SIGUSR2 26
よく見るシグナル • SIGINT: キーボードからの割り込みシグナル( Ctrl+C) • SIGTERM: 終了シグナル(killコマンドのデフォルト) • SIGKILL:
強制終了シグナル • それぞれ意味が異なる 27
シグナルの種類 28 • SIGKILLは制御できません。 ◦ これができてしまうと永遠にkillできないプロセスができあがります。
安全にするための 事例/活用例紹介 29
活用例(データをキレイにしてから終了する) 30 通常パターン プロセス停止パターン プロセスを制御せずに停止した場合 20で止まる可能性がある。 DBレコードの場合はシグナル制御ではなくトランザクション -ロールバックの 方が良い。
活用例(データをキレイにしてから終了する) 31 通常パターン プロセス停止パターン プロセスを制御せずに停止した場合 20で止まる可能性がある。 DBレコードの場合はシグナル制御ではなくトランザクション -ロールバックの 方が良い。
活用例(データをキレイにしてから終了する) 32 通常パターン プロセス停止パターン プロセスを制御せずに停止した場合 20で止まる可能性がある。 DBレコードの場合はシグナル制御ではなくトランザクション -ロールバックの 方が良い。
活用例(どこまで終わったかを通知してから終了する) 33 通常パターン プロセス停止パターン 通知の部分はメールとか slack通知とかのイメージです
活用例(処理が終わるのを待ってから終了する) 34
活用例(受けたシグナルによって処理を分岐) 35
活用例(受けたシグナルによって処理を分岐) 36 kill -2(SIGINT)を送る シグナルを検知してプロセスが停止する様子
活用例(受けたシグナルによって処理を分岐) 37 kill -15(SIGTERM)を送る シグナルを検知してもプロセスが停止しない様子
活用例(受けたシグナルによって処理を分岐) 38 kill -3(SIGQUIT)を送る 意図しないシグナルなので例外が起こる様子
NEでの活用事例 • AWSへコンテナをデプロイ • デプロイするとコンテナが停止=バッチ処理がデプロイのタイミングで終了してしまう • タイミングによっては意図しない状態になってしまう • その度にエンジニアが裏から対応する必要があった •
何とかバッチを「安全に」停止させられないものか … • ↓ • シグナル制御しよう! 39
NEでの活用例(before) デプロイ時にすぐにコンテナが停止し、中のプロセスが停止してしまう。 バッチが途中で死んでしまうため中途半端なデータができてしまう可能性があった。 40 バッチ ver1.0 デプロイ 命令 バッチ ver2.0
NEでの活用例(after) バッチを最後まで走らせてからコンテナを閉じるように制御を入れた。 その結果処理途中で死ぬことがなくなりデータの整合性が保たれるようになり 安全にデプロイできるようになった。 41 バッチ ver1.0 デプロイ 命令 バッチ
ver2.0
その他時間が余った時用 • PHPの中身について ◦ https://github.com/php/php-src/blob/php-8.2.3/ext/pcntl/pcntl.c#L593 ◦ この辺に定義されてる ◦ 試しにsignoに1より小さい数を渡すと以下のエラーが出た ◦
a ◦ 42
その他時間が余った時用 • SIGUSR1, SIGUSR2について • これらはユーザーが自分で定義して使うことのできるシグナルです。 • SIGINTでもSIGTERMでもないんだよなーという場合に、ユーザー固有の用途で自由に使 うことができます。 43
参考 • PHPとシグナル その裏側 ◦ めちゃくちゃ参考になります。 44
付録 • サンプルコード ◦ https://github.com/yamamoto-hiroya/phperkaigi2023 45
まとめ • 本講演では安全にプロセスを停止するためのシグナル制御を解説しました。 • 仕組みを理解して正しく使っていきましょう。 • Discordやtwitterでフィードバックお待ちしております! • @HiroyaYamamoto1 46
47