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

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

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

如何让应用程序直接进入后台而不停止它?

答案1

将应用程序从前台发送到后台需要终端和 shell 的配合。终端不能单独完成,因为shell必须设置前台进程组。 shell 无法单独完成此操作,因为终端必须处理按键(shell 不在前台,因此它无法接收按键)。

一个最接近的方法是将应用程序快速发送到后台。毕竟,应用程序与其他应用程序共享 CPU 时间,百分之几秒的暂停应该没什么影响。 (它适用于实时应用程序,因此请确保在后台启动这些应用程序。)我使用Ctrl+的 shell 绑定Z将最后一个前台作业发送到后台。这样,按Ctrl+ Z Ctrl+Z就会以最短的暂停时间将作业发送到后台。

这是我的 zsh 绑定,它也是“background” 命令行不为空时的半输入命令

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 函数:

    • 如果长度为输入缓冲器为0,则将当前工作(最后暂停或开始的作业)在背景, 和重新显示提示。
    • 否则,压入输入缓冲区到堆栈上并显示新的提示。一旦用户输入命令或使用Ctrl+取消命令C,推送的缓冲区就会被带回以进行进一步编辑。
  • 将此函数绑定到Ctrl+ Z

如果您只想要后台行为而不管命令行是否为空:

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

我不知道你是否可以在 bash 中做同样的事情。它应该和 一样简单bind -x '"\C-z": bg',只是 bash 将 tty 停止字符保留在适当的位置,因此它永远不会将Ctrl+Z作为输入。

答案2

&您可以通过在任务后添加 来将任务置于后台。

例如,tail -f /var/log/messages &将立即将任务置于后台。

与往常一样,您可以查看使用该命令在后台执行的任务jobs

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

答案3

通过在命令后附加一个 & 符号来完成命令的后台处理。

sleep 300 &

如果它已经在运行,您唯一的选择就是停止它然后将其置于后台。

相关内容