运行命令而不让我等待

the*_*ror 159 command-line background-process

在 CLI 上,有时我输入的命令需要一段时间才能完成,有时我知道什么时候会发生。我对 Linux 中的“背景”等有些困惑。

告诉 CLI 我不想等待的最常见(或用户友好的方式)是什么,请立即给我回提示。如果它能给我一个进度条或只是忙碌的微调器,那就太好了!

Gre*_*ill 170

运行命令前,可以&在命令行追加到后台运行:

long-running-command &
Run Code Online (Sandbox Code Playgroud)

启动命令后,您可以按CtrlZ暂停它,然后bg将其置于后台:

long-running-command
[Ctrl+Z]
bg
Run Code Online (Sandbox Code Playgroud)

  • @AbhimanyuAryan,也许您想先调试您的 `find ...` 命令,然后在后台运行它。在这种情况下,您缺少 `-name` 选项。 (2认同)

Bra*_*iam 124

这是所有人的最爱,因为除了将进程发送到后台之外,您不必担心文本输出会弄脏您的终端:

nohup command &
Run Code Online (Sandbox Code Playgroud)

这不仅会在后台运行进程,还会生成一个日志(nohup.out在当前目录中调用,如果不可能,则为您的主目录),如果您关闭/注销当前 shell,则不会通过阻止子进程接收来终止进程父进程在被杀死时发出信号(即注销、通过 SIGHUP 向父进程发送信号或关闭当前 shell)。

还有其他被调用的,disown但那是其他答案的扩展,而不是本身的方法:

command & # our program is in background
disown # now it detached itself of the shell, you can do whatever you want
Run Code Online (Sandbox Code Playgroud)

这些命令不允许您轻松恢复进程输出,除非您使用黑客的方式来完成它。

  • 自 95 年以来的系统管理员。直到今天才听说过拒绝,谢谢!虽然它不适用于每个 shell(检查 bash、zsh、tcsh。tcsh 不起作用)。 (5认同)
  • `command > file.log 2>&1 & disown` 比 `nohup command &` 长一点,但我想这就是 @chicks 的建议。 (2认同)

tra*_*nik 38

这可能就是你想要的

my_command > output.log 2>&1 &

这将启动您的命令,将 stdout 和 stderr 重定向到output.log您可以指定的一些。如果您根本不关心存储输出 - 您可以使用/dev/null而不是实际文件。

&将在后台执行命令,以便您可以在运行时继续输入命令。 2>&1将 stderr 重定向到 stdout,以便捕获所有输出。

此外,当您运行这样的命令时,您应该从内核获得类似于以下内容的确认: [2] 1234 这意味着您的进程正在后台运行并且其 id 是1234,因此您可以稍后将其杀死,如果您愿意kill -9 1234

  • 谢谢,`2>&1` 非常重要,因为命令可能会失败并在某些情况下尝试输出错误! (2认同)

yoo*_*nix 11

查看screentmux。一个例子tmux

$ tmux new -d 'longrunningcommand'
Run Code Online (Sandbox Code Playgroud)

虽然使用 '&' 到背景的其他答案将起作用,但您必须重定向标准输出(和标准错误!)。如果不这样做,输出将直接进入您的外壳,与您可能拥有的任何其他输出混合。

如果您正在运行一个长命令并注销或断开连接,后台处理也会失败。系统会杀死你的工作。

如果您不熟悉 screen 或 tmux,它们基本上可以让您完全脱离外壳。您不是在后台运行您的程序,而是在后台运行整个 shell。然后您可以稍后切换回它,甚至可以从另一台计算机切换回它。它们都具有更多功能,您可能会或可能不会在此用例之外发现这些功能。

Screen 是久经考验的老程序;tmux 年轻得多,但已经从 screen 的过去中吸取了教训。


ale*_*xis 5

(为了完整性 - 已经回答:)您通过&在命令后添加以下命令将命令置于后台:

long_command with arguments > redirection &
Run Code Online (Sandbox Code Playgroud)

我正在添加此答案以解决您问题的另一部分:

没有真正等同于显示正在进行的后台命令的微调器,但您可以通过键入jobs或来查看后台命令的状态jobs -l。它会向您显示您的后台命令,以及它们是否正在运行、通过信号停止(例如,使用^Z),或者偶尔停止,因为它们正在等待您的交互式输入。


Dav*_*hua 5

您可以使用在后台运行程序&。例如,如果您想运行yum install XyZ,您可以运行:

yum install XyZ &
Run Code Online (Sandbox Code Playgroud)

stdout可以使用覆盖文件或附加到文件来重定向程序的或>输出>>。例如,如果您想登录yum一个文件yum.log

yum install XyZ > yum.log &
Run Code Online (Sandbox Code Playgroud)

或者,如果您想将输出添加到现有文件中log

yum install XyZ >> log &
Run Code Online (Sandbox Code Playgroud)

错误被打印到stderr而不是stdout,并且可以以相同的方式重定向到文件,但使用2>

yum install XyZ 2> errors
yum install XyZ 2>> errors
Run Code Online (Sandbox Code Playgroud)

如果您想同时重定向stderrstdout,您可以使用&>

yum install XyZ &> output
yum install XyZ &>> output
Run Code Online (Sandbox Code Playgroud)


mkc*_*mkc 3

&您只需在命令后面加上符号即可在后台运行命令。

例如:

areallylong_command &
Run Code Online (Sandbox Code Playgroud)

将在后台运行它。

您可以进一步将 stdout/stderr 重定向到适当的文件,以便在您执行某些操作时它们不会出现在您的终端上。

有关更多信息,请参阅:http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-3.html