オンラインで検索したところ、名前付きパイプを使用する簡単な「チュートリアル」が見つかりました。しかし、私はバックグラウンドジョブで何かをするとき、私は多くのデータを失うようです。bashで名前付きパイプを使用する - データが失われるという問題
[編集:はるかに簡単な解決策を見つけました。返信を参照してください。だから私が提出した質問は、今や学術的なものになりました - もし仕事サーバが必要な場合に備えて)
Linux 2.6.32-25-汎用#45-Ubuntu SMPでのUbuntu 10.04の使用10月16日19:52:42 UTC 2010 x86_64 GNU/Linux
GNU bash、バージョン4.1.5(1)-release(x86_64-pc-linux-gnu)。
私のbashの機能は次のとおりです。
function jqs
{
pipe=/tmp/__job_control_manager__
trap "rm -f $pipe; exit" EXIT SIGKILL
if [[ ! -p "$pipe" ]]; then
mkfifo "$pipe"
fi
while true
do
if read txt <"$pipe"
then
echo "$(date +'%Y'): new text is [[$txt]]"
if [[ "$txt" == 'quit' ]]
then
break
fi
fi
done
}
私はこれをバックグラウンドで実行します。
> jqs&
[1] 5336
そして今、私はそれを養う:
for i in 1 2 3 4 5 6 7 8
do
(echo aaa$i > /tmp/__job_control_manager__ && echo success$i &)
done
出力が矛盾しています。 私は頻繁にすべての成功のエコーを得ることはありません。 成功エコーと同じくらい多くの新しいテキストエコーが得られます。
「フィード」から「&」を削除した場合、動作するようですが、出力が読み取られるまでブロックされています。したがって、私はサブプロセスがブロックされることを望みますが、メインプロセスはブロックしません。
単純なジョブ制御スクリプトを書くことを目的としているので、最大10個のジョブを並列に実行し、後で処理するために残りのキューをキューに入れることはできますが、
以下の全ジョブマネージャ:
function jq_manage
{
export __gn__="$1"
pipe=/tmp/__job_control_manager_"$__gn__"__
trap "rm -f $pipe" EXIT
trap "break" SIGKILL
if [[ ! -p "$pipe" ]]; then
mkfifo "$pipe"
fi
while true
do
date
jobs
if (($(jobs | egrep "Running.*echo '%#_Group_#%_$__gn__'" | wc -l) < $__jN__))
then
echo "Waiting for new job"
if read new_job <"$pipe"
then
echo "new job is [[$new_job]]"
if [[ "$new_job" == 'quit' ]]
then
break
fi
echo "In group $__gn__, starting job $new_job"
eval "(echo '%#_Group_#%_$__gn__' > /dev/null; $new_job) &"
fi
else
sleep 3
fi
done
}
function jq
{
# __gn__ = first parameter to this function, the job group name (the pool within which to allocate __jN__ jobs)
# __jN__ = second parameter to this function, the maximum of job numbers to run concurrently
export __gn__="$1"
shift
export __jN__="$1"
shift
export __jq__=$(jobs | egrep "Running.*echo '%#_GroupQueue_#%_$__gn__'" | wc -l)
if (($__jq__ '<' 1))
then
eval "(echo '%#_GroupQueue_#%_$__gn__' > /dev/null; jq_manage $__gn__) &"
fi
pipe=/tmp/__job_control_manager_"$__gn__"__
echo [email protected] >$pipe
}
jq <name> <max processes> <command>
jq abc 2 sleep 20
を呼び出すと、一つのプロセスを開始します。 その部分は正常に動作します。もう1つ、罰金を開始します。 1人で手作業でうまくいくようです。 しかし、上記の単純な例のように、ループを10回開始するとシステムが失われるようです。
IPCデータのこの明らかな損失を解決するために私ができることについてのヒントは非常に高く評価されます。
よろしく、 Alain。
[2番目の2018編集*コマンドからの出力に変数を設定する方法](https://stackoverflow.com/a/41236640/1765658)または[GitHub.com:Connector- bash](https://github.com/F-Hauri/Connector-bash)。ここで私は現在のシェルセッションにサブプロセスhoding * tools *を接続します。 –