Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何在后台运行shell命令并抑制所有输出?_Bash_Macos_Shell_Terminal_Gulp - Fatal编程技术网

Bash 如何在后台运行shell命令并抑制所有输出?

Bash 如何在后台运行shell命令并抑制所有输出?,bash,macos,shell,terminal,gulp,Bash,Macos,Shell,Terminal,Gulp,我正在尝试编写一个Shell脚本(用于MacOSX Termninal),它将运行一个命令来启动开发服务器(gulp serve)。我让它工作,但服务器正在持续运行,因此它不允许我在同一窗口中输入后续命令而不停止服务器(Control+C)。我的问题是,有没有一种方法可以在后台运行进程和/或抑制任何/所有输出?我的目标是编写一个“停止服务器”命令,该命令将终止进程(我也不确定如何执行)。我已经尝试了使用符号和&>/dev/null的所有组合,但没有任何效果。以下是我目前掌握的情况: if [ "

我正在尝试编写一个Shell脚本(用于MacOSX Termninal),它将运行一个命令来启动开发服务器(gulp serve)。我让它工作,但服务器正在持续运行,因此它不允许我在同一窗口中输入后续命令而不停止服务器(Control+C)。我的问题是,有没有一种方法可以在后台运行进程和/或抑制任何/所有输出?我的目标是编写一个“停止服务器”命令,该命令将终止进程(我也不确定如何执行)。我已经尝试了使用符号和&>/dev/null的所有组合,但没有任何效果。以下是我目前掌握的情况:

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!