是否可以将前台进程置于后台而不挂起(control + z)?


11

我正在运行一个接收TCP和UDP数据包的应用程序,因此无法将其挂起。我在后台模式下使用最初运行了具有相同参数的同一应用程序的3个进程&。当我仅这样做时$fg,这三个过程就成为了前台。现在,我想再次将它们发送到后台,但不要暂停。我怎样才能做到这一点?


下面是有关移动正在运行的进程到一个新的屏幕实例的ServerFault主题- > serverfault.com/questions/55880/...
艾伦·巴伯

Answers:


10

首先,第一件事是前台只有一个进程,而不是全部三个。fg将最新的流程置于前台。要使过程Ctrl+ z,然后键入bg更快的速度,以免“打扰”有问题的应用程序(请注意,过程调度器每秒将多次执行此操作),在前台找到过程的PID,然后在第二个终端/ SSH会话,使用

kill -SIGSTOP »pid« ; kill -SIGCONT »pid«

您的原始终端会说stopped,但由于您是立即发送的SIGCONT,因此该过程将继续在后台运行。


1
@stefen:您的解决方案令人信服。假设如果我们暂停进程,那么建立的套接字连接不会中断(调度程序切换并不会断开套接字连接就可以肯定),这不会以任何方式伤害我的进程。将调试并更新。非常感谢。如果
rahul.deshmukhpatil

2

如果您确实有前台工作,那么bash正在等待它完成,这或多或少是前台工作定义。如果bash仍然可以控制终端,请检查发生了什么jobs -l,例如:

$ ncat -kl -p 10111 &
[1] 13404
$ ncat -kl -p 10222 &
[2] 13405
$ ncat -kl -p 10333 &
[3] 13406
$ jobs -l
[1]  13404 Running                 ncat -kl -p 10111 &
[2]- 13405 Running                 ncat -kl -p 10222 &
[3]+ 13406 Running                 ncat -kl -p 10333 &

ncat为此,我启动了三个后台监听过程。您可能还会看到“完成”或“已停止”的工作状态。

您可以使用Stefan Seidel的SIGSTOP / SIGCONT方法有效地从另一个外壳程序中后台执行前台作业(尽管使用- 发出的外壳程序实际发出信号是SIGTSTP,但任何一个信号都可以工作)。CtrlZ

使用术语“前台”和“后台”时,流程作业之间存在细微的区别。只有一个Shell 前台作业,可以有多个前台进程(这与终端进程组ID相关,并且在管道中启动两个或多个进程时可以观察到)。

在Shell的控制下,正在运行的进程或管道称为“作业”,当您使用bgfg命令时,您隐式地引用了最近的作业-在我的情况下+,是上面的。这些作业(除其他事项外)还可以显式地称为%1%2或%3(中的数字[])。

不合格的fg命令只会影响一项最新的工作,因此您可能无法正确理解当前情况。后台作业可能仍会写入终端:

  echo foo > /dev/tcp/127.0.0.1/10111

这取决于程序如何处理终端,是否ncat可以正常工作。为了进行阅读,程序将停止执行,并且您将看到“ Stopped”消息。Shell将启动进程,并等待它们退出或接收SIGTTIN信号(这nohup是解决此问题的一种方法disown)。

您可以后台特定停止的作业用

$ bg %3

(就我而言,我会得到错误bash: bg: job 3 already in background

否则,如果一个进程的前景,除非程序捕获SIGTSTP和做一些特别的东西,它不可能有一个快速的问题Ctrl- Zbg。在这方面,网络程序没有什么特别的,进入的连接/数据将由内核进行缓冲(直到一定程度)。流连接可能会有明显的暂停。

有关更多详细信息,请参见bash手册页的“ 作业控制 ”部分。


1

最简单的方法是使用屏幕程序。您可以在虚拟终端中启动应用程序,然后使用Ctrl + A,D退出屏幕。如果要恢复会话,请输入screen -x。如果您有多个过程,将显示要重新连接的屏幕列表。有关更多详细信息,请阅读屏幕手册页


5
我认为他正在“事后”寻求解决方案,即流程正在运行。
Stefan Seidel
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.