タグ付けされた質問 「concurrency」

4
スクリプト内のtmuxまたはgnome-terminal内で一連のプログラムを起動する方法は?
tmuxまたはgnome-terminalまたはxfterminalでいくつかのコマンドを同時に起動し、単一のコマンドを実行してすべての異なるタブを起動し、そのコマンドが終了したらそのタブを閉じたいと思いました。 他のソフトウェアも歓迎します XX "cmd1" "cmd2" "cmd3"など、ジョブを実行する単一のスクリプトを発行したかった

1
通常のファイル 'filename'を作成できません:ファイルが存在します
ビルドスクリプトの1つでこの奇妙なエラーメッセージが表示されています- cp失敗し、「ファイルが存在します」というエラーを返します。を使用してみましたがcp -f、ファイルが存在する場合は上書きするはずですが、エラーが表示されます。cp手動で実行すると、既存のファイルを上書きするために実行すると完全に機能します。このエラーの原因は何ですか?
23 cp  concurrency 


3
tee + cat:出力を数回使用し、結果を連結します
たとえば、あるコマンドを呼び出すとecho、そのコマンドの結果を他のいくつかのコマンドで使用できますtee。例: echo "Hello world!" | tee >(command1) >(command2) >(command3) catを使用すると、いくつかのコマンドの結果を収集できます。例: cat <(command1) <(command2) <(command3) 私は両方のことを同時に行うことができるようにしたいのでtee、何か他の出力(たとえばecho私が書いたもの)でそれらのコマンドを呼び出してから、単一の出力ですべての結果を収集することができますcat。 それは、その結果を順に維持することが重要です。この手段の出力のラインcommand1、command2およびcommand3絡み合っが、(それがで起こるようにコマンドがあるとして注文するべきではありませんcat)。 そこよりも良い選択肢かもしれcatとteeが、それらは私がこれまで知っているものです。 入力と出力のサイズが大きくなる可能性があるため、一時ファイルの使用を避けたい。 どうすればこれができますか? PD:別の問題は、これがループで発生し、一時ファイルの処理が難しくなることです。これは私が持っている現在のコードであり、小さなテストケースで動作しますが、私が理解できない何らかの方法でauxfileから読み書きするときに無限ループを作成します。 somefunction() { if [ $1 -eq 1 ] then echo "Hello world!" else somefunction $(( $1 - 1 )) > auxfile cat <(command1 < auxfile) \ <(command2 < auxfile) \ …
18 pipe  cat  tee  concurrency 

2
複数のプロセス間の通信
私はmanager()関数をx回の個別のプロセスとして実行するbashスクリプトを持っています。スクリプト内からすべてのmanager()プロセスにメッセージを転送するにはどうすればよいですか? 匿名パイプについて読んだことがありますが、メッセージを共有する方法がわかりません。名前付きパイプでそれをやろうとしましたが、プロセスごとに個別の名前付きパイプを作成する必要があるようです。 これを行う最もエレガントな方法は何ですか? これまでの私のコードは次のとおりです。 #!/bin/bash manager () { while : do echo "read what has been passed to \$line" done } x=1 while [ $x -le 5 ] do manager x & x=$(( $x + 1 )) done while : do while read line do echo "What has been passed …

4
ループデバイスをアトミックに割り当てる方法は?
私はいくつかのディスクイメージを処理するためにいくつかのシェルスクリプトを書いており、いくつかのディスクイメージにアクセスするにはループデバイスを使用する必要があります。ただし、プログラムを競合状態にさらさずにループデバイスを適切に割り当てる方法がわかりません。 私losetup -fは次の未割り当てのループデバイスを取得し、そのループデバイスを次のように割り当てるために使用できることを知っています。 ld=$(losetup -f) sudo losetup $ld myfile.img dostuffwith $ld しかし、プログラムの複数のインスタンスを同時に実行したい場合、これはほぼ競合状態の教科書の例であり、それは私をかなり悩ませます。このプログラムの複数のインスタンスを実行している場合、または他のプログラムもループデバイスを取得しようとしている場合、各プロセスは次の呼び出しの前にループデバイスを割り当てることができないlosetup -f場合があります。その場合、両方のプロセスが同じループであると見なします。デバイスは利用可能ですが、入手できるのは1つだけです。 これに外部同期を使用することもできますが、(可能な場合は)追加の複雑さを避けたいです。また、ループデバイスを使用する他のプログラムは、思いついた同期を尊重しない可能性があります。 この潜在的な競合状態を回避するにはどうすればよいですか?理想的には、たとえば次のようなコマンドを使用して、ループデバイスをアトミックに検出およびバインドできるようにしたいと考えています。 ld=$(sudo losetup -f myfile.img) dostuffwith $ld ただし、それを行うと、$ldループデバイスパスに割り当てられず、sudoアウトを移動すると、sudo ld=$(losetup -f myfile.img)アクセス許可エラーが発生します。



2
bashが「>>()」を処理する方法
出力のリダイレクトとプロセスの置換を実験しているときに、次のコマンドとその結果の出力を偶然見つけました。 me @ elem:〜$ echo foo>>(cat); エコーバー バー me @ elem:〜$ foo (はい、最後の空の改行は意図的なものです。) つまり、echoのバーをbashし、通常のプロンプトを表示し、echoのfoo、echoは改行、カーソルをそこに残します。もう一度Enterキーを押すと、プロンプトが新しい行に出力され、カーソルはそのあとに表示されます(空のコマンドラインでEnterキーを押すと期待どおり)。 私はそれがファイル記述子にfooを書き込み、猫がそれを読み取り、2番目のエコーエコーのバーであるエコーのfooを読み取り、その後コマンドプロンプトに戻ることを期待していました。しかし、明らかにそうではありません。 誰かが何が起こっているのか説明してもらえますか?
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.