sql >> データベース >  >> RDS >> Mysql

SIGTERMが送信されると、子プロセスはmysql接続を閉じますか?

    プロセスが完了すると(プロセスが終了するか、シグナルを使用して終了するため)、開いたままのすべてのファイルと接続がオペレーティングシステムによって自動的に閉じられます。接続を閉じるためにMySQLプロトコルを使用することにより、クリーンに閉じられません(接続が存在する場合)。 TCP / IPレベルでドロップするだけで、反対側のサーバーは閉じたドアと通信していることを検出します。これは常にすぐに発生するとは限りません。サーバーがディスカッションパートナーがいなくなったことに気付くまでに時間がかかる場合があります。これが発生すると、接続が切断されたと見なされ、その側の処理がクリーンアップされます。

    しないでください fork()を使用する前に、親プロセスでMySQL接続を開きます 。 fork() 接続のローカル側を管理するために使用されるデータ構造を複製し、結果は予測できません。さらに、子が(どのようにでも)完了すると、接続を閉じ(またはOSが接続を切断し)、MySQLサーバーもその終了を閉じ、親プロセスはそれが誰とも通信していないことを検出します。

    fork()を使用する前に、親プロセスでMySQL接続を閉じてください 次に、必要に応じて、親プロセスと子プロセスで別々の接続を開きます。

    また、次の間の親プロセスでサーバーとのMySQL通信をラップします。

    pcntl_sigprocmask(SIG_BLOCK, array(SIGCHLD));
    

    および

    pcntl_sigprocmask(SIG_UNBLOCK, array(SIGCHLD));
    

    それ以外の場合、子プロセスが完了すると、親プロセスにSIGCHLDが通知されます。 信号。受信した信号はスリープを再開します(sleep()で停止した場合 信号が到着したときに呼び出します)。 MySQLライブラリはsleep()を使用します サーバーと通信するためのMySQLプロトコルの一部として。そのようなsleep() (信号を受信したために)必要以上に早く強制的に戻ると、MySQLライブラリが混乱し、実際には正しくない奇妙なエラー(「MySQLサーバーがなくなった」など)が報告されることになります。

    この回答 をご覧ください 詳細な説明については。



    1. MySQLのストアドプロシージャ内にオプションのパラメータを記述しますか?

    2. 定期請求システム

    3. 複数の値に一致するOracleの行の削除

    4. Unix Korn シェル スクリプトで Oracle SP Out Param SYS_REFCURSOR からデータをフェッチする