2016-07-22 50 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

相關問題