2つの子プロセスを連続して作成するには、どのコマンドを使用しますか?


8

2つの子プロセスを生成したいのですが、最初のプロセスがその実行の特定のポイント(標準出力を調べることで判断できます)に達するまで待ってから、2番目のプロセスを生成します。これを達成するのにどのUNIXコマンドが関係するのかはわかりませんが、UNIXコマンド名は簡潔で、時には暗号化されているため、Google経由で何かを見つけるのに苦労しました。

私は解決しようとしている特定の問題の解決策を求めていません(追加のポインターがあれば幸いです)、私は主に、どのUNIXコマンドを調べて使用するかを知ることに関心があります。


Pythonの使用に心を開いていますか?
xrisk 2018

3
「実行の特定のポイント」をどのように決定するかを知らなければ、これは非常にあいまいです。
muru、

@muruが明確にするために編集
w.brian

したがって、実際には3つのプロセスが必要です。1.実行し、出力を作成します。2. 1の出力を監視し、特定の時点で3。しかし、それはプログラムを設計する良い方法ではありません。
djsmiley2kStaysInside 2018年

回答:


7

このためのxargsユーティリティを使用できます。stdinの各行に対してコマンドを実行できるため、コマンドをxargs開始するときにstdinに1行を入力として確実に取得する必要があります。これは、次のコマンドで実行できますgrep

proc1 | grep --max-count=1 "${targetString}" | xargs --max-lines=1 --no-run-if-empty --replace -- proc2

引数--max-count=1--max-lines=1および--no-run-if-emptyことを確認してはproc2ならば、一度正確に開始されていないproc1出力${targetString}場合は決して初めて、そしてproc1決して出力${targetString}--replaceことを回避するxargs、コマンドラインに入力行を追加します。

次のコマンドラインを使用してテストしました。

(echo Start >&2; sleep 3 ; echo Trigger; sleep 3; echo End >&2) | grep --max-count=1 Trigger | xargs --max-lines=1 --no-run-if-empty --replace -- echo "Triggered"

1
+1これは非常に創造的な答えです。proc1からの残りの出力が必要な場合は、かなり複雑になります。Teeや追加のファイル記述子や名前付きパイプなどを使用する必要があります。
ジョー

7

エレガントなコマンド/あなたが尋ねた質問への答え(つまり、その実行の特定のポイントに到達する)があるかどうかはわかりませんが、ソリューションを構築するために使用できるツール/テクニックがあります。以下、そしておそらく私がまだ知らない他のもの:

  1. バックグラウンドプロセス(&)
  2. 条件付き実行(&&および||)
  3. 睡眠
  4. 待機(これは特に便利です-複数のジョブをバックグラウンドで起動すると、すべてのジョブが完了するまで待機します)
  5. 名前付きパイプ(プロセス間で通信するためのメカニズムを提供できます)。
  6. inodenotifywait

ロックファイルの書き込みとチェックも一般的な方法です(プロのヒント-環境を制御できる場合は、/ tmpではなくramdiskに書き込みます-多くのディストリビューションでは/ dev / shmです)。


6

これは単なるアイデアですが、最初のプロセスは出力をgrepにパイプします。grepで出力を読み取り行ループにパイプし、各行を探しているものと比較します。見つかったら、proc2を実行します。

#!/bin/bash
targetString="line you are looking for"
proc1 | grep "${targetString}" |
while read line
do
if [ "$line" = "${targetString}" ]; then
    proc2
fi
done

「その実行のある時点」がで決定できるとしstdoutたら、次はどうでしょうか?

proc1 | grep "stdout trigger string" && proc2

&&は、grepreturn が発生0したときに起動する必要があります。一致が見つかった場合にのみ実行されます。


1
stdinが閉じられるまで、grepは続行します。それまでは何も返しません(0またはそれ以外)。
ボブ

@ボブああ、ありがとう...この考えを言い換えましょう。
Louis Waweru、2018

@bobこれは特に乱雑でばらばらで、ツールの誤用ですが、fail2banを使用してログファイルを監視し(つまり、stdoutをファイルにパイプして)、その行が2番目のスクリプトであるときに2番目のスクリプトを実行するようにルールをプログラムできます。見つかりました(ただし、トリガーファイルを変更して再調整し、inotifyを使用する方がよりエレガントなソリューションです)
davidgo

1
targetstringがproc1出力で複数回出現する場合、proc2は複数回実行されます。あなたがした場合はproc2 &、その後break、それは起こらないだろうが、それは、パイプを閉じてPROC1が途中で終了するだろう。または、proc2が起動したらフラグを設定し、それを使用してproc2が再度実行されないようにすることもできます。他の回答と同様に、proc1の出力の残りは破棄されるため、必要に応じてさらに作業が必要です。
ジョー

1
@ジョーグッドポイント。元の質問は、実際にはどのコマンドを使用できるかを尋ねるだけだったので、これは実際には、それらのコマンドの可能性のいくつかを示す答えにすぎません(主に|、そしてgrepここにあります)。
Louis Waweru
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.