問題タブ [ipcopen3]
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.
perl - Perl の waitpid と open3
open3 によって呼び出されるプログラムの出力が大きすぎる (65536 以上) 場合、waitpid は永久に実行されます。
この問題は WNOHANG によって解決されます。
しかし今、リターンコードは $? -1 です。waitpid のリターンコードです。ダーティハックで解決できます:
そのようなことを行う適切な方法は何ですか?
アップデート。汚いハックが常に機能するとは限らないようです。
perl - open3 を 2 回使用する場合の IPC::Open3 内での警告
Hans Lub hereの提案にIPC::Open3を使用しています。
私の問題は、open3
呼び出しが初めて正しく機能することですが、その後の呼び出しでは警告が返されます。
私が使用しているコードサンプルは次のようになります。
他の人に私の問題を解決させようとしているように見える場合は申し訳ありませんが、これを回避することはできないようです.Perlモジュールの内部を見ることは、私の現在の理解を超えています.
perl - perlでopen3への入力としてスカラーを使用するにはどうすればよいですか
入力としてopen3にフィードしたいスカラーがあります。例えば
ただし、open3
は別のモジュールにあります。
次に、別のファイルで:
問題は、Example::Runner
から読み取ることができる参照がありますが<$in>
、必要なのは'<&'
、open3 がSTDIN
それを実行するコマンドとして使用できるように、プレフィックスを付けることができるものです。ハンドルへの参照をopen3が使用できるものに変換する方法はありSTDIN
ますか?
編集:
私の不自然な例では不十分であることは明らかです... {{DBI}} を直接使用しない理由は、このコードが実際にはフットプリントのない自動化に使用するより大きなコード本体の一部だからです。つまり、管理者が特別なツールをインストールしていない (RHEL 5/6 に標準装備されているものだけ) 30 台以上のサーバーの環境があります。これらのサーバーは、各環境 (local、dev、qa、beta、prod)、各プロジェクト (...) ごとに、一連のサーバー (db、app、web) に分割されます。とにかく、非常に一般的なタスクの 1 つは、データベースをある場所から別の場所にコピーすることです。次のようなコマンドでそれを実現します。
これは、本番データベースを開発環境にクローンする最も基本的なバージョンです (より典型的なバージョンには、各コマンドに多数のスイッチが含まれ、途中で多数のパイプ コマンドが含まれます)。そこで、これに関する抽象化のライブラリを作成しました (IPC::Open3::Callback::*)。途中で、データベースのコピー後に実行する必要があるいくつかの SQL コマンドを実行する必要がありました。そのため、任意の SQL スクリプト セットを実行する機能を追加しました (クローン操作のソースと宛先に基づいて)。次のようなコマンドでそれらを実行できます。
しかし、SQL スクリプトのコンテンツの一部を変更する必要があることに気付いたので、それを丸呑みして少し作業を行い、それを$command_runner
asに提供したいと思いましたSTDIN
。そうは言っても、私はfilenoを使用してこれに対処しようとしました:
しかし$in_handle
、スカラー参照の場合は機能しません。とにかく、それは長い話です。
perl - select なしの IPC::open3 エラー処理
以下のコードは正常に動作していますが、IO::Select を使用せずに同じことを達成したい - perl にあまり慣れていないため、いくつか試してみましたが、何も機能しません。
ERRLOG に書き込んだ後、プロセスを停止したい。
以下のコードを試しました-
ただし、if 条件内で while ループが実行されません。
perl - IPC::Open3 と、子が入力を待っているかどうかの判断
上記のコードは、別のスクリプト (子と呼ばれる) を実行する必要がある、私が書いているスクリプトの一部です。/var/tmp に Cookie ファイルが存在するかどうかによって、子プロセスは入力を求められる場合とされない場合があります (どちらのスクリプトも CentOS5 / perl 5.8.8 で記述されています)。
親が親の STDIN から入力を渡すことができるように、子が入力を待っているかどうか、いつ待っているかを判断する必要があります。また、親が Perl::Critic の残忍な (重大度 1) チェックに合格する必要があるため、open3 を使用して子プロセスを開く必要があります。
コメントを含めたのは、Cookie ファイルが既に設定されている場合、少なくとも親に子を適切に呼び出させることができるためです。その場合、子は入力を待機しないためです。
子供が入力を待っているかどうかを判断する方法の例を見つけようとして、私は周りをチェックしました。私が見つけた 1 つの例では strace ( http://www.perlmonks.org/?node_id=964971 ) を使用していましたが、それは私がやろうとしていることに対して複雑すぎるように感じます。
私を導くためのリンクは大歓迎です。