Bash 如何在后台运行shell命令并抑制所有输出?
我正在尝试编写一个Shell脚本(用于MacOSX Termninal),它将运行一个命令来启动开发服务器(gulp serve)。我让它工作,但服务器正在持续运行,因此它不允许我在同一窗口中输入后续命令而不停止服务器(Control+C)。我的问题是,有没有一种方法可以在后台运行进程和/或抑制任何/所有输出?我的目标是编写一个“停止服务器”命令,该命令将终止进程(我也不确定如何执行)。我已经尝试了使用符号和&>/dev/null的所有组合,但没有任何效果。以下是我目前掌握的情况:Bash 如何在后台运行shell命令并抑制所有输出?,bash,macos,shell,terminal,gulp,Bash,Macos,Shell,Terminal,Gulp,我正在尝试编写一个Shell脚本(用于MacOSX Termninal),它将运行一个命令来启动开发服务器(gulp serve)。我让它工作,但服务器正在持续运行,因此它不允许我在同一窗口中输入后续命令而不停止服务器(Control+C)。我的问题是,有没有一种方法可以在后台运行进程和/或抑制任何/所有输出?我的目标是编写一个“停止服务器”命令,该命令将终止进程(我也不确定如何执行)。我已经尝试了使用符号和&>/dev/null的所有组合,但没有任何效果。以下是我目前掌握的情况: if [ "
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
首先,在后台运行进程
cd / && gulp serve --gulpfile /server/example/gulpfile.js > /tmp/gulp.log &
在cd
之后,您需要&
(and)和&
在后台运行
要杀死所有gulp
进程
killall gulp
首先,在后台运行进程
cd / && gulp serve --gulpfile /server/example/gulpfile.js > /tmp/gulp.log &
在cd
之后,您需要&
(and)和&
在后台运行
要杀死所有gulp
进程
killall gulp
您正在对
killall
执行输出重定向,而不是gulp
,因此gulp
将继续愉快地将文本分割到您的终端。请尝试:
cd / && gulp server --gulpfile /server/example/gulpfile.js >/dev/null 2>&1 &
其次,您的kill命令不会因为您没有告诉它而终止您的进程;您要求它杀死所有tail
进程。相反,您希望:
killall gulp
这些修改应该是实现目标的最直接途径。然而,有一些额外的事情可能是有用的知道
流程管理在*nix世界中有着悠久的历史,因此我们一直在发明工具来简化这一过程。您可以自己重新发明它们(下一步是存储gulp过程的PID,这样您就可以确保您只杀死它,而不杀死名称中带有“gulp”的任何东西),或者您可以一直编写一个系统监控文件。对于Linux,这将是SysV、Upstart或systemd;我不确定OSX的等价物是什么
然而,由于您只是出于开发目的,而不是为了制作网站,所以您可能实际上并不需要它;您的实际目标是能够在运行
gulp
时执行特殊shell命令。您可以使用终端选项卡来执行此操作,或者更优雅地使用iTerm的拆分功能、screen
或tmux
。当您发现自己在终端中大量工作时,Tmux尤其是一个有用的工具,并且是一件需要熟悉的有用的事情。您正在killall上执行输出重定向,而不是gulp
,因此gulp
将继续愉快地将文本分割到您的终端。请尝试:
cd / && gulp server --gulpfile /server/example/gulpfile.js >/dev/null 2>&1 &
其次,您的kill命令不会因为您没有告诉它而终止您的进程;您要求它杀死所有tail
进程。相反,您希望:
killall gulp
这些修改应该是实现目标的最直接途径。然而,有一些额外的事情可能是有用的知道
流程管理在*nix世界中有着悠久的历史,因此我们一直在发明工具来简化这一过程。您可以自己重新发明它们(下一步是存储gulp过程的PID,这样您就可以确保您只杀死它,而不杀死名称中带有“gulp”的任何东西),或者您可以一直编写一个系统监控文件。对于Linux,这将是SysV、Upstart或systemd;我不确定OSX的等价物是什么
然而,由于您只是出于开发目的,而不是为了制作网站,所以您可能实际上并不需要它;您的实际目标是能够在运行
gulp
时执行特殊shell命令。您可以使用终端选项卡来执行此操作,或者更优雅地使用iTerm的拆分功能、screen
或tmux
。当您发现自己在终端中大量工作时,Tmux尤其是一个有用的工具,并且是一个需要熟悉的有用工具。如果您想抑制所有输出,您也应该重定向stderr
。类似于:gulp服务器--parms……>/tmp/gulp.log 2>&1&
。这表示“将句柄2(stderror
)重定向到与句柄1(stdout
)相同的位置”。顺序在这里很重要,所以必须在1之后进行。如果要抑制所有输出,也应该重定向stderr
。类似于:gulp服务器--parms……>/tmp/gulp.log 2>&1&
。这表示“将句柄2(stderror
)重定向到与句柄1(stdout
)相同的位置”。在这里订购物品,所以必须在1之后完成。这就成功了,谢谢你的回答和详细解释!还要感谢@Diego Torres Milano!这就成功了,谢谢你的回答和详细的解释!还要感谢@Diego Torres Milano!