【问题标题】:How do you run a shell command in the background and suppress all output?如何在后台运行 shell 命令并抑制所有输出?
【发布时间】:2016-11-26 14:12:25
【问题描述】:

我正在尝试编写一个 Shell 脚本(用于 Mac OSX 终端),它将运行一个命令来启动一个开发服务器(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

【问题讨论】:

    标签: bash macos shell terminal gulp


    【解决方案1】:

    您正在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;我不确定 OS X 等价物是什么。

    但是,由于您只是出于开发目的而不是生产网站,因此您可能实际上并不需要它;您的实际目标是能够在 gulp 运行时执行临时 shell 命令。您可以使用终端选项卡来执行此操作,或者更优雅地使用 iTerm、screentmux 的拆分功能。当您发现自己在终端中工作很多时,Tmux 尤其是一个有用的工具,并且是一个熟悉的有用的东西。

    【讨论】:

    • 这成功了,谢谢你的回答和详细的解释!还要感谢@Diego Torres Milano!
    【解决方案2】:

    首先,在后台运行进程

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

    cd 之后,您需要&& (and) 和& 才能在后台运行。

    杀死所有gulp 进程

    killall gulp
    

    【讨论】:

    • 如果你想抑制 all 输出,你也应该重定向stderr。类似:gulp server --parms...... > /tmp/gulp.log 2>&1 &。这表示“将句柄 2 (stderror) 重定向到与句柄 1 (stdout) 相同的位置”。这里的顺序很重要,所以必须在 1 之后完成。
    猜你喜欢
    • 1970-01-01
    • 2021-06-06
    • 2017-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多