2016-07-22 214 views
0

我正在尝试编写一个Shell脚本(用于Mac OSX Termninal),它将运行一条命令来启动一个开发服务器(gulp serve)。我有它的工作,除了服务器连续运行,所以它不允许我在同一窗口中输入后续命令而不停止服务器(Control + C)。我的问题是,有没有一种方法可以在后台运行进程和/或禁止任何/所有输出?我的目标是写一个'停止服务器'命令,将会终止进程(我也不确定该怎么做)。我已经尝试了使用&符号和/ dev/null的所有组合,并且没有什么效果。这是我到目前为止有:如何在后台运行shell命令并禁止所有输出?

if [ "$1" = "server" ] 
then 
    if [ "$2" = "on" ] 
    then 
    cd/& gulp serve --gulpfile /server/example/gulpfile.js # the output is still shown 
    printf "\033[0;32mserver is online.\033[0m\n" 
    else 
    killall tail &>/dev/null 2>&1 # this doesn't kill the process 
    printf "\033[0;32mportals is offline.\033[0m\n" 
    fi 
fi 

回答

2

你做的输出重定向上killall,不gulp,所以gulp将继续文本欢快拆出到终端。尝试改为:

cd/&& gulp server --gulpfile /server/example/gulpfile.js >/dev/null 2>&1 & 

其次,你的kill命令不会因为你没有告诉它而杀死你的进程;你要求它杀死所有tail进程。你想改为:

killall gulp 

这些修改应该是最直接的目标路径。但是,还有一些可能有助于了解的其他内容。

流程管理在* nix世界有着悠久的历史,所以我们一直在创造工具来使这个过程更容易很长一段时间。你可以自己重新创建它们(下一步是存储你的吞吐过程的PID,这样你就可以确保你只杀它,而不是名字中的“吞噬”),或者你可以全部方式并编写一个系统监控文件。对于Linux,这将是SysV,Upstart或systemd;我不确定OS X是什么。

但是,由于您只是为了开发目的而不是生产网站,所以您可能实际上并不需要这么做;您的实际目标是能够在gulp正在运行时执行特别的shell命令。您可以使用终端选项卡执行此操作,或者更优雅地使用iTerm的分割功能,screentmux。当你发现自己在终端上工作很多时,特别是Tmux是一个有用的工具,并且对熟悉这件事很有用。

+0

这样做的窍门,谢谢你的回答和详细的解释!感谢@Diego Torres Milano! – robmarston

1

首先,在后台

cd/&& gulp serve --gulpfile /server/example/gulpfile.js > /tmp/gulp.log & 

cd你需要&&(和)和&在末后台运行后运行的过程。

要杀死所有gulp过程

killall gulp 
+1

如果你想压制* all *输出,你也应该重定向'stderr'。例如:'gulp server --parms ......> /tmp/gulp.log 2>&1&'。这就是说“将句柄2('stderror')重定向到与句柄1('stdout')相同的地方”。订单在这里很重要,所以它必须在1之后完成。 – gilez