在不同目录中并行运行两个脚本,并在前台

时间:2016-12-07 02:20:21

标签: ruby-on-rails bash shell unix reactjs

背景:我尝试编写一个bash函数,让我的生活更加方便,但我不认为目标是可行的。我希望我能找人确认/否认我的怀疑:

目标/问题:创建一个shell函数,它将在一个目录中启动一个rails服务器并在另一个目录中启动反应,但不打开两个终端选项卡并单独运行命令。 (这可能吗?

尝试:

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

问题:功能无效,因为第二个命令等待第一个命令成功完成。但是,如果我能以某种方式使两者成功运行,那么在后台运行是不是会阻止我查看日志输出?

更新:

感谢您的回复。我通过一点修改就接近了我想要的东西,但它是一个圆孔的方形钉解决方案:

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

正如其他人所指出的那样,混合两个日志输出并不理想,这似乎也阻止pry工作。工头可能是真正的方法。标记为已接受的答案。

3 个答案:

答案 0 :(得分:1)

您可以使用'&'在后台通过shell启动命令。

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

这会将每个命令的输出捕获到一个文件中,然后您可以使用&f; tail -f'留意。

请注意,如果您在命令完成之前注销,它们可能会被杀死。如果你想阻止这种行为,请使用' nohup'启动它们时的命令。

命令运行后,请使用'作业'命令看到它们列出,此时你可以使用&f;' fg'命令。当命令在前台时,使用^ Z来停止它,然后输入' bg'把它发送到后台。

不完全是您正在寻找的东西,但您不能同时在前台拥有两个工作。但是,您可以使用基本作业控制命令在它们之间切换。

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$

答案 1 :(得分:0)

我相信你所寻找的是Foreman

https://github.com/ddollar/foreman

http://blog.daviddollar.org/2011/05/06/introducing-foreman.html

您可以使用Procfile列出所有命令,如下所示:

Procfile.dev:

web: bundle exec rails server
yarn: exec yarn start

然后只需在命令行中运行foreman start

答案 2 :(得分:0)

将第二个&&替换为&

实际上,&左侧的命令将在后台运行,但您可以看到它的输出,尽管它与其他命令的输出混合在一起。