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信号処理を「無視」に設定します。これは、+がその信号を終了しない理由を説明します。cmd
Ctrlc
ただし、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非同期的に開始されたコマンドも終了します。