web-dev-qa-db-ja.com

1つのコマンドで複数のプロセスを開始するにはどうすればよいですか?

pianobarプレーヤーを使用しています。ただし、起動する前に、torpolipoを実行する必要があります。両方とも継続的です(中断されるまで実行されます)。基本的に私が探しているのは、torおよびpolipoプロセスを生成し(それらの出力は必要ありません)、フォアグラウンドでピアノバーを開く単一のコマンドです。

編集:torの開始には数秒かかることが判明しました。これが、提案されたソリューションが最初は機能しなかった理由です。誰かが同じ問題を抱えている場合に備えて、これを投稿します:

function piano {
    tor &
    polipo &
    sleep 3
    pianobar &&
    killall tor
    killall polipo
}
2
seeker_of_bacon

これを.profileまたは.bashrcまたは.zshrc、または使用するシェルに入れます。

function mycommand {
    tor &
    polipo &
    planobar
}

そして今、mycommandを実行するだけです

2
polemon

これがシェルスクリプトの目的です; 1つだけ入力しながら複数のコマンドを実行します。以下は、あなたが求めたことを実行すると私が信じている短いスクリプトです。

#!/bin/sh

tor    & tor_pid=$!
polipo & polipo_pid=$!

sleep 5
pianobar

kill $tor_pid
kill $polipo_pid

それをファイル(おそらく$HOME/local/bin/startpiano)に入れ、chmod +x $HOME/local/bin/startpianoで実行可能にし、PATH変数の最後に$HOME/local/binを追加します。

これはシェル関数の目的でもあります;論理的に異なるタスクを実行します。次のようなシェル関数を作成できます。

startpiano () {
  tor    & tor_pid=$!
  polipo & polipo_pid=$!

  sleep 5
  pianobar

  kill $tor_pid
  kill $polipo_pid
}

これは、特定のシェルのスタートアップファイルの1つに含まれます。

[〜#〜] edit [〜#〜]:編集された質問では、タスクが少し複雑になりすぎたため、エイリアスを使用しないことをお勧めします。ただし、エイリアスに関する元のテキストはそのままにしておきます。

これはエイリアスの目的でもあります;何度も入力する必要のない簡単なことをするために。これは、エイリアスを設定する方法です。

alias startpiano="polipo &; tor &; pianobar"

これも、シェルの初期化スクリプトの1つに含まれます。

これらの3つのソリューションのいずれかを入力すると、

$ startpiano

必要なプログラムを開始します。

  • シェルスクリプトには、シェル関数とエイリアスに比べて、シェル初期化ファイルに重みを追加しないという利点があります(PATH変数の末尾にその場所を追加することは別として)。

  • シェル関数には、後でコマンドライン引数を追加できる(スクリプトにも適用される)というエイリアスよりも優れている点と、読み取り可能である(多くの点で独自の「スクリプト」のように動作する)という利点があります。

  • エイリアスは機能しますが、実際には、エイリアスの唯一の使用法は、lsへのコマンドラインフラグなど、指先の利益のために非常に単純なものを短いものに置き換えることです(alias ls="ls -F"のみ私が持っているエイリアス)。

7
Kusalananda