問題タブ [pcntl]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
php - 親プロセスでゾンビの子を殺す
だから私は次のことをしたい:
たくさんのプロセスをフォークするデーモンをセットアップする。
したがって、デーモンは一連のプロセスをフォークしてから、別の一連のプロセスをフォークします
問題は、子プロセスが終了するまでに長い時間がかかる可能性があることです。子をフォークしているにもかかわらず、親プロセスに他の作業がある場合、ゾンビの子を防ぐにはどうすればよいですか?
親プロセス(デーモン)は次のようなことを行います。
問題は、親プロセスが子をフォークする以外に他の作業を行う必要がある場合、および子が終了するのに長い時間がかかる場合に、子プロセスが終了するのをどのように待つことができるかです。
システムデーモンのPEAR関数を使用してデーモンを作成し、pcntl_fork
関数を使用してプロセスを作成しています。
php - pcntl_fork 子プロセスを使用すると、親から作成された CodeIgniter インスタンスにアクセスできません
コードイグナイターライブラリを使用してデーモンプロセスを作成しようとしています.問題は、デーモンプロセスをフォークすると、CIインスタンスにアクセスできなくなり、__constructで初期化されたすべてのライブラリにもアクセスできなくなり、新しい子プロセスに CI インスタンスがありますが、まだどのライブラリにもアクセスできず、次のエラーが発生します。
エラー - 2012-02-27 00:13:07 --> 重大度: 警告 --> インクルード (application/errors/error_general.php): ストリームを開くことができませんでした: そのようなファイルまたはディレクトリはありません /srv/http/FreeFileConvert/system /core/Exceptions.php 146 ERROR - 2012-02-27 00:13:07 --> 重大度: 警告 --> include(): 含めるための 'application/errors/error_general.php' を開くことができませんでした (include_path='. :/usr/share/pear') /srv/http/FreeFileConvert/system/core/Exceptions.php 146
これが私のコードです:
関数「add_to_queue()」は正常に動作しますが、問題は「start_worker」にあります。これは、フォークが機能しなくなった後、ログ ヘルパー関数にアクセスすることさえできません。そのため、コードで error_log() を使用しています。
誰か助けていただければ幸いです。
windows - Windows での PHP CLI: Ctrl-C コマンドの処理?
コマンドラインでPHPでCTRL+を処理するにはどうすればよいですか? 関数は Windows では動作しません。CPcntl_*
php - 後続の pcntl_signal シグナルがハンドラーを開始しない
私が持っているコードの基本的な説明をすることから始めましょう。メインの親プロセスから始めます (注: 簡単にするためにすべての機能を示しているわけではありません。拡張が必要な場合はいつでもお知らせください)。
何が起こっているかは次のとおりです。
- スクリプトを開始し、プロセスを適切に取得します (例: Parentpid:2、childpid:3)。
- 次に、親に SIGHUP シグナルを送信すると、適切に強制終了され、新しい子プロセスが開始されます (たとえば、Parentpid: 2、childpid:4)。
- 次に、親に 2 番目の SIGHUP シグナルを送信すると、新しい子プロセスを適切に試行して追加しますが、2 番目の childpid を強制終了することを拒否します。(例: Parentpid:2、undyingchildpid:4、newchildpid:5)
詳細が必要かどうか、または意味がないかどうかを教えてください。初めて子供たちを適切に殺す理由がわかりませんが、2回目はそうではありません。
さらに厄介な部分は、再起動ハンドラーを変更して、SIGINT で子を殺そうとし続けるように変更すると、毎回失敗しますが、SIGKILL コマンドを送信すると、子プロセスが強制終了されることです。
適切に処理するには、子供が SIGINT によって殺される必要があります。私はそれをSIGKILLしたくありません。2 回目の SIGINT が機能しない理由はありますが、SIGKILL は機能しますか?
php - コンパイル後も PNCTL が php で有効にならない
PHP を --enable-pcntl でコンパイルしましたが、PHP でプロセス制御関数にアクセスしようとすると、次のようになります。
何か不足していますか?私のApacheはプリフォークでコンパイルされていません。これが機能するために必要ですか?
完全な PHP コンパイル フラグ:
Apache モジュール:
編集: 多分私は十分に明確ではありませんでした。Web サーバーからの pcntl 関数は使用しません。繰り返しますが、私の pcntl 関数はコマンド ラインからも機能していません。それについて何か考えはありますか?
php - pcntl_waitはSIGTERMによって中断されません
pcntl_waitのPHPドキュメントによると、
待機関数は、子が終了するまで、または現在のプロセスを終了するかシグナル処理関数を呼び出すアクションを持つシグナルが配信されるまで、現在のプロセスの実行を一時停止します。
ただし、次のコードを実行し、シグナルハンドラーを使用してSIGTERMを親プロセスに送信すると、子が終了した後kill -s SIGTERM [pid]
にのみ呼び出されます(つまり、スリープが終了するのを待つ必要があります。SIGTERMによって中断されるべきではありませんか?pcntl_wait()
fork_test.php:
出力(SIGTERMは30秒待機した後にのみ表示されます):
PHPバージョン=>5.3.3
php - execを中断して子プロセスを強制終了する方法
PHPCLIスクリプト内で。を使用して長時間実行されるシェルコマンドを呼び出そうとしていますexec()
。しかし、PHPスクリプトを中断して、生成された子プロセスを強制終了する方法を一生理解することはできません。を呼び出すとすぐにexec()
、シグナルハンドラが無視されるようです。次のコードは、私が期待するとおりに機能します。SIGTERMをプロセスに送信すると、エコーSIGTERM
してすぐに終了します。
ただし、に置き換えるsleep(60);
とexec('sleep 60');
、スリープが終了するまでシグナルハンドラに到達しません。2つの質問があります:
exec
シグナルを(またはshell_exec
または)で動作させるにはどうすればよいproc_open
ですか?- シグナルをトラップしたときに、によって生成された子プロセスをどのように強制終了でき
exec
ますか?
php - Zend Framework の既存の db 接続に基づいて新しい db 接続を作成する
Zend Framework を使用し、子プロセスをフォークする CLI スクリプトがあります。CLIから起動するとうまくいきますが、bashスクリプトから起動すると、bashスクリプトが終了するとdb接続が閉じられます。
子に同じデータベースへの新しい db 接続を与える必要があると思います。残念ながら、元の接続の作成方法は私にはあまりにも不可解なので、既存の接続をベースに新しい接続を作成したいと思います。どうやってやるの?
これは、Bootstrap での作成方法と、後でアクセスする方法です。
そして、これは私が新しい接続を使用したい場所です:
php - pcntl_fork は PHP でどのように機能しますか?
私はpcntl_fork
PHPについて混乱しています。
マルチスレッドに対応していると思いますが、どのように機能し、スクリプトでどのように使用しますか?
php - PHPPCNTL-ターミナルでの制御を維持する
並列プロセスを実行して、少なくとも4人のユーザーを同時に処理したいと思います。
出力は次のようになります。
現在起こっていることはparent1
、スクリプトのコントロールが4回表示された後、失われ、新しい空のコマンドラインが開始された後です。さらに5秒間待った後、残りの出力が表示されます。
どうすればそれが起こらないようにすることができますか。好きなときにスクリプトを壊せるようにしたいと思います。
編集
CTRL + Cを押して端末経由で信号を送信した場合、スクリプトは停止しません。その瞬間に停止するようにスクリプトに通知する方法が必要です。