如何将命令行应用程序直接发送到后台?


22

我已经知道按下会ctrl+z停止应用程序,然后可以使用bg命令将应用程序发送到后台,但这意味着停止应用程序的时间很短。

如何不停止将应用程序直接发送到后台?


如果它已经在运行,可以肯定不能。
凯文

1
如果您的任务需要在“消失前”输入到后台,则可以使用zenity或yad之类的工具(如果您喜欢guis)。他们仍然可以从后台发送和接收输出。我确信使用管道和设备也可以使您从后台访问控制台,但是我不确定该怎么做。

@Joe太酷了,但我的意思完全不对。我只想直接将应用发送到后台而不暂停。即不按下ctrl+z然后运行命令bg。是否有单个按键组合将应用程序发送到后台?
trusktr 2013年

Answers:


17

从前台向后台发送应用程序需要终端和外壳程序之间的合作。终端不能单独执行此操作,因为外壳程序必须设置前台进程组。Shell不能单独执行此操作,因为终端必须处理按键(shell不在前台,因此无法接收按键)。

一个非常近似的方法是将应用程序真正快速地发送到后台。毕竟,一个应用程序与其他人共享CPU时间,暂停几分之一秒无关紧要。(它适用于实时应用程序,因此请确保在后台启动它们。)我使用Ctrl+ 的外壳程序绑定Z将最后一个预期的作业发送到后台。这样,按Ctrl+ Z Ctrl+ Z可以在最少的暂停时间内将作业发送到后台。

这是我的zsh绑定,当命令行不为空时,它还会“后台”半类型的命令

fancy-ctrl-z () {
  emulate -LR zsh
  if [[ $#BUFFER -eq 0 ]]; then
    bg
    zle redisplay
  else
    zle push-input
  fi
}
zle -N fancy-ctrl-z
bindkey '^Z'          fancy-ctrl-z

用英语,对于受众中的非zsh用户:

  • 定义一个执行以下操作的shell函数:

  • 将此功能绑定到Ctrl+ Z

如果仅希望后台行为而不管命令行是否为空:

function bg_ { builtin bg "$@"; }
zle -N bg_
bindkey '^Z' bg_

我不知道你是否可以在bash中做同样的事情。它应该和一样简单bind -x '"\C-z": bg',除了bash将tty stop字符留在原处,因此它永远不会获得Ctrl+ Z作为输入。


有趣的是,让我看看这是否可以在Bash中完成。如果是这样,这将是一个解决方案。我对zsh不熟悉。介意解释您的脚本做什么?
trusktr 2013年

@trusktr参见我的编辑。
吉尔斯(Gilles)'所以

谢谢!我将要切换到zsh。我一直在听到很多关于它的好东西。
trusktr

15

您可以通过添加 &后使其。

例如,tail -f /var/log/messages &将立即使任务后台运行。

与往常一样,您可以看到使用该jobs命令作为背景的任务。

当然,这假定您尚未运行命令。


这很有用,但我的意思不是。如果我的应用程序位于前台,则想稍后将其发送到后台,我可以按ctrl+z然后bg在命令行中执行,以使该应用程序在后台运行。但是在按下ctrl+z和执行之间bg,有一个时间表,该应用程序已完全暂停。我不要 如何立即将其发送到后台?
trusktr 2013年

@trusktr就像Gilles所说的。您需要同时通知外壳程序和终端。抱歉,我不知道该怎么做。
prateek61

它没有回答问题。
Luciano Andress Martini 2016年

4

通过在命令后面附加“&”号可以使命令后台化。

sleep 300 &

如果它已经在运行,则唯一的选择就是停止它,然后使其后台运行。


在按ctrl + z和执行bg之间,有一个时间表,该应用程序已完全暂停,这是我不想要的。因此,没有办法立即将其发送到后台吗?
trusktr 2013年

1
不。正如Giles所说,它需要外壳和终端。您需要告知每个。
bahamat 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.