2016-12-07 9 views
0

コンテキスト:私は人生を段階的にもっと便利にするためにbash関数を書こうとしていますが、私は目標が可能だとは思いません。2つのスクリプトを別々のディレクトリ、並列、およびフォアグラウンドで実行する

目標/質問:は1ディレクトリ内のレール・サーバを起動し、別のに反応し起動するシェル関数を作成しますが、二つの端末を開くことなく、私は、私は誰かが私の疑いを確認/拒否するために取得することができます願っていますタブを開き、コマンドを別々に実行します。 (は、これは可能です?)

をしようとしました:

function run_project(){ 
    (cd [RAILS_PROJ_DIR] && exec rails server) && (cd [REACT_PROJ_DIR] && exec yarn start) 
} 

問題:最初のための第二のコマンドを待機が正常に終了するため機能は動作しません。しかし、どうにかして両方とも正常に動作させることができれば、バックグラウンドで実行しないでください(ログ出力を見ることができません)。

UPDATE:応答のため

おかげで、すべて。 、他の人が両方のログ出力を混合、指摘したように

function run_project(){ (cd [RAILS_PROJ_DIR] && exec rails server &) && (cd [REACT_PROJ_DIR] && exec yarn start &) }

理想的ではない:私は、私は少し修正して欲しかったものに近いだが、それは丸い穴のための正方形のPEG溶液のビットですこれはまた、pryが動作しないように思われます。フォアマンはおそらく本当の方法です。受け入れられた答えとしてマークする。

+0

「フォアグラウンド」は1つだけです。フォアグラウンドで2つのプロセスを実行することはできません。もちろん、バックグラウンドで2つのプロセスを実行し、それらのプロセスの出力を取得してインターリーブされた方法で表示する特別な「コレクタ」プログラムを作成することもできますが、これは紛らわしいことではありませんか?おそらく、[multitail](https://linux.die.net/man/1/multitail)のようなものがあなたの要求に合っているでしょう。 – user1934428

+0

両方のログを一緒に読みたいですか? – User9102d82

答えて

0

&&&に置き換えます。

実際、&の左側のコマンドはバックグラウンドで実行されますが、他のコマンドの出力と混在していてもその出力を見ることができます。

1

「&」を使用して、シェルを使用してコマンドをバックグラウンドで開始することができます。

(cd /some/directory; ./command1 -a arg) >output.txt 2>&1 & 
(cd /some/other/directory; ./command2 -a other_arg) >output2.txt 2>&1 & 

これは、各コマンドの出力をファイルにキャプチャします。ファイルには、「tail -f」を使用して目を通すことができます。

コマンドが完了する前にログアウトすると、それらが強制終了される可能性があることに注意してください。その動作を防ぐには、起動時に 'nohup'コマンドを使用します。

コマンドが実行されたら、 'jobs'コマンドを使用して、 'fg'コマンドを使用してフォアグラウンドに移動させることができます。コマンドがフォアグラウンドになっている間、^ Zを使って停止し、 'bg'と打ち込んでバックグラウンドに送ります。

あなたが探しているものではありませんが、フォアグラウンドで同時に2つのジョブを持つことはできません。ただし、基本的なジョブ制御コマンドを使用して切り替えることができます。

Jamess-MacBook:bin jj$ (while [ 1 ]; do echo 'job 1'; sleep 3; done) >/tmp/job1.out 2>&1 & 
[1] 3735 
Jamess-MacBook:bin jj$ (while [ 1 ]; do echo 'job 2'; sleep 3; done) >/tmp/job2.out 2>&1 & 
[2] 3740 
Jamess-MacBook:bin jj$ tail -f /tmp/job 
job1.out job2.out 
Jamess-MacBook:bin jj$ tail -f /tmp/job?.out 

==> /tmp/job1.out <== 
job 1 
job 1 
job 1 
job 1 
job 1 
job 1 
job 1 

==> /tmp/job2.out <== 
job 2 
job 2 
job 2 
job 2 

==> /tmp/job1.out <== 
job 1 
^C 
Jamess-MacBook:bin jj$ jobs 
[1]- Running     (while [ 1 ]; do 
    echo 'job 1'; sleep 3; 
done) > /tmp/job1.out 2>&1 & 
[2]+ Running     (while [ 1 ]; do 
    echo 'job 2'; sleep 3; 
done) > /tmp/job2.out 2>&1 & 
Jamess-MacBook:bin jj$ fg %1 
(while [ 1 ]; do 
    echo 'job 1'; sleep 3; 
done) > /tmp/job1.out 2>&1 
^Z 
[1]+ Stopped     (while [ 1 ]; do 
echo 'job 1'; sleep 3; 
done) > /tmp/job1.out 2>&1 
Jamess-MacBook:bin jj$ bg 
[1]+ (while [ 1 ]; do 
    echo 'job 1'; sleep 3; 
done) > /tmp/job1.out 2>&1 & 
Jamess-MacBook:bin jj$ 
Jamess-MacBook:bin jj$ jobs 
[1]- Running     (while [ 1 ]; do 
    echo 'job 1'; sleep 3; 
done) > /tmp/job1.out 2>&1 & 
[2]+ Running     (while [ 1 ]; do 
    echo 'job 2'; sleep 3; 
done) > /tmp/job2.out 2>&1 & 
Jamess-MacBook:bin jj$ kill %1 
Jamess-MacBook:bin jj$ kill %2 
[1]- Terminated: 15   (while [ 1 ]; do 
    echo 'job 1'; sleep 3; 
done) > /tmp/job1.out 2>&1 
Jamess-MacBook:bin jj$ jobs 
[2]+ Terminated: 15   (while [ 1 ]; do 
    echo 'job 2'; sleep 3; 
done) > /tmp/job2.out 2>&1 
Jamess-MacBook:bin jj$ jobs 
Jamess-MacBook:bin jj$ 
関連する問題