如何在后台运行命令并且不获取输出?

158

我写了两个 shell 脚本 a.shb.sh。在 a.shb.sh 中,我有一个无限循环,它们会向终端输出一些内容。我想要编写另一个脚本来调用 a.shb.sh,但我希望用户立即重新控制终端,而不是让脚本无限运行,并且我想隐藏终端中的输出。

8个回答

286

如果您的后台作业需要较长时间才能完成,或者您仅使用SecureCRT或类似工具登录服务器,请使用nohup

stdoutstderr 重定向到/dev/null以忽略输出。

nohup /path/to/your/script.sh > /dev/null 2>&1 &

仅仅补充一下,有时候脚本会带参数,那么上面的命令会返回模棱两可的输出重定向 - sabertooth1990
我发现更好的方法是使用 nohup /path/to/your/script.sh parameter1 > & 1 & 如果有人知道更好的方法,请告诉我。 - sabertooth1990
31
如果使用nohup命令,就不需要使用/dev/null 2>&1,因为它会自动将所有的标准输出和错误流附加到nohup.out文件中。只需使用以下命令:nohup /path/to/your/command & - leonardo
1
@sabertooth1990,你的命令行有误:-bash: syntax error near unexpected token '&' - notes-jj
1
你要如何结束创建的进程? - Alexis_A
显示剩余5条评论

44

像这样将输出重定向到文件:

./a.sh > somefile 2>&1 &

这将会把标准输出和标准错误都重定向到同一个文件。如果你想要将标准输出和标准错误分别重定向到两个不同的文件,可以使用这个命令:

./a.sh > stdoutfile 2> stderrfile &

如果您不关心stdout和/或stderr,可以将/dev/null用作一个或两个文件。

有关重定向的详细信息,请参见bash manpage


38

6
注意:当终端关闭时,该命令将终止。 - dwitvliet
2
对于未来想要解决在会话结束后保持命令运行的人,我建议使用screen或tmux。它们本质上是在一个“会话中运行另一个会话”,并在您关闭初始会话后继续运行。如果您重新登录,则可以重新连接到正在进行的会话。例如,非常适合运行rsync备份,其中同步需要长时间运行,而您又不想让会话一直运行。 - DanteAlighieri
1
请不要使用&>/dev/null,它似乎是>/dev/null 2>&1的简写!在这个例子中可能没有危害,但为了澄清事情:它不符合POSIX标准,并且在某些系统上使用#!/usr/bin/env sh作为shebang时总是产生一个退出代码0。 - Martin Braun

38

在子shell中运行以移除通知并关闭STDOUT和STDERR:

(&>/dev/null script.sh &)

7
这是唯一一个答案,也不会将后台作业日志打印为[1] + 54765 done <emacs>。谢谢。 - alper
这是我也尝试过的唯一可行的解决方案,以便不在终端中打印输出。 - Falco
如果我想将输出保留到现有的日志文件中,而不是在终端中显示怎么办?移除 /dev/null 部分即可吗? - TechFanDan
2
这个绝对完美地运行了!这里有更多关于子shell的文档:https://tldp.org/LDP/abs/html/subshells.html - cdrini

19

如果它们与包含脚本的同一目录中:

./a.sh > /dev/null 2>&1 &
./b.sh > /dev/null 2>&1 &

在结尾处添加的&是让你的脚本在后台运行的关键。

> /dev/null 2>&1这部分并不是必需的,它重定向了标准输出和标准错误流,这样你就不必在终端上看到它们。对于有大量输出的嘈杂脚本,你可能希望这样做。


4
nohup sh -x runShellScripts.sh &

1
-x 是什么意思? - alper

3
如果要在Linux Kickstart中运行脚本,您需要按照以下方式运行。
sh /tmp/script.sh > /dev/null 2>&1 < /dev/null &

2

这些例子都可以正常工作:

nohup sh prog.sh proglog.log 2>&1 &

循环语句可以像这样使用:

for i in {1..10}; do sh prog.sh; sleep 1; done prog.log 2>&1 &

它在后台运行且不显示任何输出。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接