我正在运行一个接收 TCP 和 UDP 数据包的应用程序,因此无法暂停。我最初使用 以后台模式运行了同一应用程序的 3 个进程,使用不同的参数&
。当我只执行 时$fg
,所有三个进程都进入前台。现在我想再次将它们发送到后台但不暂停。我该怎么做?
答案1
首先要说的是:一前台进程,而不是所有三个。fg
将最新进程带入前台。要使Ctrl+进程z,然后bg
更快地输入以不“干扰”相关应用程序(请注意,进程调度程序无论如何都会每秒执行多次此操作),找出前台进程的 PID,然后在第二个终端/SSH 会话中使用
kill -SIGSTOP »pid« ; kill -SIGCONT »pid«
您原来的终端会显示stopped
,但由于您SIGCONT
立即发送了,该过程将继续在后台运行。
答案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
我为此启动了三个后台监听进程。您可能还会看到作业状态为“完成”或“已停止”。
您可以使用以下方式从不同的 shell 有效地将前台作业置于后台史蒂芬·赛德尔的 SIGSTOP/SIGCONT 方法(尽管实际发送的信号Ctrl通过带有-的 shellZ是 SIGTSTP,任何一个信号都可以工作)。
两者之间存在微妙的区别进程和工作当使用前景和背景这两个术语时。只有一个外壳前台工作,可以有多个前台进程(这与终端进程组 ID,当您在管道中启动两个或多个进程时可以观察到)。
在 shell 的控制下运行的进程或管道被称为“作业”,当你使用bg
或fg
命令时,你隐含地指最近的工作——在我的情况下是+
上面带有的工作。这些工作也可以(除其他外)指明确地作为 %1 %2 或 %3 ( 中的数字[]
)。
不合格的fg
命令只会影响一个作业,即最近的作业,因此您可能对当前情况的理解有误。后台作业可能仍然写入终端:
echo foo > /dev/tcp/127.0.0.1/10111
这取决于程序如何处理终端,ncat
对于写入来说,运行良好。但对于读取来说,程序将停止执行,您将看到“已停止”消息。shell 将启动进程并等待它们退出或接收 SIGTTIN 信号(这nohup
是一种解决方法,就像这样disown
)。
您可以背景具体的停止工作
$ bg %3
(就我而言,我会收到错误bash: bg: job 3 already in background
)
否则,如果进程在前台,除非程序捕获 SIGTSTP 并执行某些特殊操作,否则快速Ctrl-Z和不太可能出现问题bg
。在这方面,网络程序没有什么特别之处,传入的连接/数据将由内核缓冲(直到一定程度)。但是,流式连接可能会出现可观察到的暂停。
请参阅“作业控制“bash 手册页的部分以获取更多详细信息。
答案3
最简单的方法是使用屏幕程序。您可以在虚拟终端内启动应用程序,然后使用 Ctrl+A、D 退出屏幕。如果您想恢复会话,请键入screen -x
。如果您有多个进程,您将看到要重新连接的屏幕列表。有关更多详细信息,请阅读屏幕手册页。