3つのシェルを自動的に開き、3つのコマンドを実行するには?

3つのシェルを自動的に開き、3つのコマンドを実行するには?

3つのシェルを開き、プログラムを1つずつ実行するように設定しました。

cd foo/bar
./foo.sh
cd foo/bar
node bar.js
cd foo/bar
ruby foobar.rb

しかし、時間がかかるため、これを行うためのシェルスクリプトを作成しました。

cd foo/bar

./foo.sh &
node bar.js &

ruby foobar.rb

ただし、CTRL-Cを押してスクリプトを停止すると、他の2つのプログラムはまだ実行中です。入ると

jobs

バックグラウンドプロセスは表示されません(おそらくスクリプトに属しています)。その場合は、そのfgプロセスを前景に取り込み、1つずつCTRL-Cを押すことができるので、これを行う必要があります。

ps ax | grep foo
ps ax | grep bar

プロセスIDを見つけてプロセスを終了します。

3つのシェルを自動的に開き、3つのプログラムを実行して3つのシェルを開いて実行するかのように動作させるより良い方法はありますか?私はSTDOUT出力に興味がないので、シェルウィンドウを3つの部分に分割しても大丈夫です。

tmux、emacs、または他のツールはこれを達成できますか? (私はこれが可能かどうかを知るにはtmuxやemacsに慣れていません。)

答え1

あなたの主な質問に対する答えではありませんが(私はscreenユーザーであり、に行く必要性を感じたことはありませんtmux)、次の点についてのコメントです。

しかし、時間がかかるため、これを行うためのシェルスクリプトを作成しました。

cd foo/bar

./foo.sh &
node bar.js &

ruby foobar.rb

ただし、CTRL-Cを押してスクリプトを停止すると、他の2つのプログラムはまだ実行中です。

非対話型シェルでこれを行うと、シェルはcmd &実行プロセスのPOSIX要件に従ってSIGINTおよびSIGQUIT信号処理を「無視」に設定します。これは、+がその信号を終了しない理由を説明します。cmdCtrlc

ただし、zsh、bash、mksh、yash(このコマンドを無視するdash、ksh93、boshを除くtrap)を含むいくつかのシェルでは、次のコマンドを使用してこれらのシグナルのデフォルト設定を復元できます。

#! /bin/zsh -
cd foo/bar || exit
(trap - INT QUIT; ./foo.sh) &
(trap - INT QUIT; node bar.js) &
ruby foobar.rb
wait

これにより、Ctrl+ はc非同期的に開始されたコマンドも終了します。

関連情報