我已经知道按会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 函数:
将此函数绑定到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 &
如果它已经在运行,您唯一的选择就是停止它然后将其置于后台。