`jobs` 命令不显示任何后台进程

Jac*_*kWM 9 linux bash

当我在办公室使用桌面时,我run.sh在后台启动了4 次脚本。

run.sh parameter1 &
run.sh parameter2 &
run.sh parameter3 &
run.sh parameter4 &
Run Code Online (Sandbox Code Playgroud)

然后我回到家,在我的笔记本电脑上打开一个终端,ssh 到我办公室的桌面。运行时ps -u jack,我看到了启动的进程:

 3562 pts/1    00:00:00 bash
 4540 pts/2    00:00:00 bash
 4643 pts/3    00:00:00 bash
 4748 pts/4    00:00:00 bash
Run Code Online (Sandbox Code Playgroud)

但是当我输入时jobs,我什么也没有。为什么我可以看到这四个正在运行的后台进程?

顺便说一句,我怎样才能将它们带回我当前的终端,以便我可以杀死其中一个,比如说run.sh parameter4 &

小智 18

这是因为jobs显示后台命令从(属于)同一个 shell 开始。在桌面终端和 ssh 终端下运行的 shell 进程是不同的。

http://www.gnu.org/software/bash/manual/html_node/Job-Control-Basics.html

为了能够将您的流程作为来自您可以使用的不同终端的作业进行控制,screen或者tmux基本上是虚拟终端管理器,并且可以将它们重新连接到任意数量的其他终端。

例如,当screen您启动它时,它会打开您的默认 shell,您可以像使用任何其他 shell 一样使用它。然后当你回到家并ssh到你的办公室机器时,你可以运行screen -d -r将虚拟终端与你的办公室桌面终端分离,并将其附加到你的ssh终端,继续工作。您可以screen通过按 Ctrl-A、d 来从其内部分离虚拟终端。

  • 如果你想在“后台”运行东西,可以这么说,然后再恢复它们,那么像 GNU Screen 或 tmux 这样的东西会很有用。这将允许您从任何后续 shell 会话中恢复,而如上所述,您只能将后台作业从同一个 shell 带到前台。 (2认同)
  • @JackWM 您可以使用 `parameter3` 来区分它们。运行`ps -ef | grep parameter3`,这将为您提供包含`parameter3`的进程的pid。您可以根据自己的需要进行调整。我倾向于让事情尽可能简单。如果你只需要确定一个 `pid` 来杀死它,我真的认为不需要 `bg` 和 `fg`,这让生活变得复杂:) (2认同)

小智 8

根据问题的问题陈述,恕我直言,我没有看到任何使用background或 的理由foreground。您所关心的只是找到一个在后台运行的进程,以便您可以杀死它。

运行ps -ef | grep parameter3以查找进程parameter3名称中包含的进程。grep鉴于您没有两个进程名称完全相同,您可以调整以唯一标识一个进程。

一旦你有了它,只要去做kill -9 PID,这个过程就会被杀死。所以不需要将该进程带到前台来杀死它。

希望这可以帮助。

  • 为什么是“kill -9”?首先使用没有信号参数的 kill 开始几乎总是更好。这样,如果以这种方式编程,被杀死的进程可以在终止之前整理。那么如果进程还是不死,可以使用kill -9。 (2认同)