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

安全にプロセスを停止するためにシグナル制御を学ぼう!

 安全にプロセスを停止するためにシグナル制御を学ぼう!

yamamoto-hiroya

March 23, 2023
Tweet

More Decks by yamamoto-hiroya

Other Decks in Technology

Transcript

  1. 自己紹介 • NE株式会社のやまもとひろやです。 • PHPerKaigi2022 ◦ ベストフィードバッカー殿堂入りしました。 ◦ PHPerチャレンジは4位でした。 •

    プロポーザル採択のレギュラーセッションは初です。 • PHP歴約10年です。 • 右の写真はPHPerKaigi2021の ベストフィードバッカー賞でもらった Oculus Quest 2です。 • よろしくおねがいします! 3
  2. ターゲット • PHPの処理を ◦ Ctrl+Cで止めたことがある人 ◦ killコマンドで止めたことがある人 • PHPの処理が途中で死んで困ったことがある人 •

    プロセス/シグナルが何となくしか分からない人 • 同僚や後輩に「シグナル制御って何?」って聞かれた時に答えに困る人 • 是非持ち帰って共有してください! 5
  3. 「安全に」とは • 本講演においては「後片付け・後処理をしたうえで終了すること」を安全にプロセスを停止す る、と定義します。 • 例えば以下のようなステータスをデータ管理しているとして • 10: 未着手→20: 着手中→30:

    終了 • これらは一連の処理で30になり20で止まることが基本的にないものの場合、異常終了した 際には10に戻して終了する、などが安全に処理を終了するということになります。 18
  4. シグナル制御 20 • pcntl_async_signals(true); ◦ シグナルハンドラを有効にする。 ◦ とりあえず最初に宣言しておけば OK。 •

    pcntl_signal(SIGINT, "hoge_handler"); ◦ シグナルハンドラの設定をする。 ◦ SIGINTが来たらhoge_handlerというハンドラ (関数)を実行するという意味。 • hoge_handler ◦ 今回の制御処理。以降ハンドラと呼ぶ。 ◦ hogeを出力して処理を終了する。
  5. シグナル制御 21 • pcntl_async_signals(true); ◦ シグナルハンドラを有効にする。 ◦ とりあえず最初に宣言しておけば OK。 •

    pcntl_signal(SIGINT, "hoge_handler"); ◦ シグナルハンドラの設定をする。 ◦ SIGINTが来たらhoge_handlerというハンドラ (関数)を実行するという意味。 • hoge_handler ◦ 今回の制御処理。以降ハンドラと呼ぶ。 ◦ hogeを出力して処理を終了する。
  6. シグナル制御 22 • pcntl_async_signals(true); ◦ シグナルハンドラを有効にする。 ◦ とりあえず最初に宣言しておけば OK。 •

    pcntl_signal(SIGINT, "hoge_handler"); ◦ シグナルハンドラの設定をする。 ◦ SIGINTが来たらhoge_handlerというハンドラ (関数)を実行するという意味。 • hoge_handler ◦ 今回の制御処理。以降ハンドラと呼ぶ。 ◦ hogeを出力して処理を終了する。
  7. 余談: callableについて • callableについて ◦ 関数名そのまま渡す場合 ▪ 単純に文字列で’hoge’を渡せば良い ◦ staticメソッドを渡す場合

    ▪ 配列でarray(‘class_name’, ‘method_name’) ▪ 文字列で’class_name::method_name’ ◦ インスタンスメソッドを渡す場合 ▪ array($obj, ‘method_name’) ▪ array($this, ‘method_name’) ◦ その他selfやparentも使える 25
  8. シグナルの種類 $ 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
  9. 47