我正在运行一个接收TCP和UDP数据包的应用程序,因此无法将其挂起。我在后台模式下使用最初运行了具有相同参数的同一应用程序的3个进程&
。当我仅这样做时$fg
,这三个过程就成为了前台。现在,我想再次将它们发送到后台,但不要暂停。我怎样才能做到这一点?
我正在运行一个接收TCP和UDP数据包的应用程序,因此无法将其挂起。我在后台模式下使用最初运行了具有相同参数的同一应用程序的3个进程&
。当我仅这样做时$fg
,这三个过程就成为了前台。现在,我想再次将它们发送到后台,但不要暂停。我怎样才能做到这一点?
Answers:
首先,第一件事是前台只有一个进程,而不是全部三个。fg
将最新的流程置于前台。要使过程Ctrl+ z,然后键入bg
更快的速度,以免“打扰”有问题的应用程序(请注意,过程调度器每秒将多次执行此操作),在前台找到过程的PID,然后在第二个终端/ SSH会话,使用
kill -SIGSTOP »pid« ; kill -SIGCONT »pid«
您的原始终端会说stopped
,但由于您是立即发送的SIGCONT
,因此该过程将继续在后台运行。
如果您确实有前台工作,那么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的控制下,正在运行的进程或管道称为“作业”,当您使用bg
或fg
命令时,您隐式地引用了最近的作业-在我的情况下+
,是上面的。这些作业(除其他事项外)还可以显式地称为%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- Z和bg
。在这方面,网络程序没有什么特别的,进入的连接/数据将由内核进行缓冲(直到一定程度)。流连接可能会有明显的暂停。
有关更多详细信息,请参见bash手册页的“ 作业控制 ”部分。
最简单的方法是使用屏幕程序。您可以在虚拟终端中启动应用程序,然后使用Ctrl + A,D退出屏幕。如果要恢复会话,请输入screen -x
。如果您有多个过程,将显示要重新连接的屏幕列表。有关更多详细信息,请阅读屏幕手册页。