将作业放在后台而不冻结


9

说你这样开始工作

foo

然后希望将其放在背景中。键入Ctrl+ Z,然后bg执行技巧,但会fooCtrl+ Z和之间冻结bg。如何在不先冻结foo的情况下将其放置在后台?


7
用例是什么?为什么该过程冻结很短时间是一个问题?
2014年

Answers:


4

从技术上讲,它foo已经在后台运行。您可以启动第二个终端会话,foo而当您执行其他操作时,第一个终端会话将继续运行。

在X中,这仅涉及启动第二个终端应用程序,或者如果您选择的终端仿真器具有这样的功能,则打开另一个选项卡。

在控制台上,如果您不打算这样做,则需要切换到其他虚拟终端,然后重新登录。

如果你使用一个终端复用器喜欢screen或者tmux你可以在它启动另一个会话。例如,在屏幕上,使用Ctrl+ A紧跟着Ctrl+ 来完成此操作C。要在它们之间切换,请使用Ca Cn和Ca Cp在终端会话之间来回切换。


也就是说,在bash中是不可能的。
user877329 2014年

1
这个答案似乎是基于对后台工作概念的误解。终端具有通常由外壳程序设置的“前台进程组”属性,这使该组中的进程能够从终端读取并接收与SIGINT等tty相关的信号。在终端上运行的所有不在前台进程组中的进程都是后台进程。创建新终端时,即使未查看,原始终端的前台作业仍是该终端上的前台作业。

@ WumpusQ.Wumbley我的回答的重点是,大多数可以运行bash的系统都具有多任务处理功能。在这样的系统上,即使某个流程具有输入焦点,该流程本身 也没有固有的“前景” foo 本身(缺少特定的检查,我想在野外介于稀有和不存在之间)不关心它是否在最顶部的窗口中运行,或者是否有显示其输出的东西。
2014年

1
我的观点是,当问题专门提到“背景”和“工作”这两个词时(这两个词都是技术术语,其含义由POSIX进程组框架定义),以及Ctrl-Z和bg的机制,在流程组上进行操作-您的答案建议完全不使用流程组功能,并且以与实际定义不符的方式使用“背景”一词-您不适合该问题的答案。从“技术上foo已经在后台运行”开始...只是...不。

@ WumpusQ.Wumbley不知何故,我不认为OP会阅读POSIX标准,并认为“嗯,我想使用它,但是我已经开始了,foo所以现在我该怎么办?”。如果您认为此答案(或其他答案)在回答问题时没有用,我鼓励您行使投票特权,并从自己认为正确的角度而不是从正确的角度留下自己回答问题的答案,而不是争论一个留在这个问题的答案。例如,也许您觉得l0b0的答案更好,但我的答案至少可以大致解决OP想要的事情。
2014年

3

&在命令(foo &)之后添加符号会立即使它成为背景。但是我相信,在标准的终端/外壳配置中,一旦前景一现,就无法立即将其背景化。


3

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

我有一个zsh配置,可以连续快速按Ctrl+ Z两次;第一次按下可中止该过程,第二次按下可在后台恢复该过程。我不知道如何将其移植到bash。

如果您在允许插入按键的终端仿真器中运行,则可以插入^Zbg^M(使用^控制字符符号)。例如,对于X11终端仿真器,请在xdotool --window 1234 Ctrl_L+Z b g Return其中1234是终端仿真器的窗口ID的情况下运行。使用Screen,运行screen -S foo -p 12 -X stuff $'\032bg\r'where foo是屏幕会话的名称,12也是窗口ID。


2

如果键入的速度不够快,kill -s SIGSTOP 1023 && kill -s SIGCONT 1023则从另一个外壳运行,假设1023作为目标PID。

免责声明:正如Ruslan可能知道的那样,该顺序实际上重新启动了作业,因此很快bash就没有注意到它。


如何将工作置于后台?
Ruslan 2014年

多快多快?
user877329 2014年
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.