2016-12-07 28 views
0

上下文:我试图写一个bash函数,使我的生活更加方便,但我认为目标是不可能的。我希望我可以找人确认/拒绝我的怀疑:在分开的目录中,并行和在前台运行两个脚本

目标/问题:创建Shell函数,将在一个目录启动轨服务器并启动在另一个反应,但没有打开两个终端并单独运行命令。 (这可能?)

尝试:

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 &) }

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

+0

只有一个“前景”。您不能在前台运行两个进程。当然,你可以在后台运行两个进程,并编写一个特殊的“收集器”程序来获取这些进程的输出并以某种交错方式显示它 - 但这不会让人感到困惑吗?也许像[multitail](https://linux.die.net/man/1/multitail)更适合您的要求。 – user1934428

+0

你是否还想一起阅读两个日志? – User9102d82

回答

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 & 

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

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

命令运行后,使用'jobs'命令查看它们列出的内容,您可以使用'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$