我写了一个非常简单的shell脚本来练习命令“ bg
”、“ fg
”和“ jobs
”:
#!/bin/bash
myvar=1
while [ $myvar -le 100000000 ]
do
echo $myvar
myvar=$(( $myvar + 1 ))
done
我使用 SecureCRT 连接 ubuntu 机器。我克隆了几个连接到该机器的选项卡。
当我获取进程 pid 并用于kill -19 pid
挂起它时,我运行jobs
查看它是否已成为后台作业,是的,它是:
imcas@ubuntu:/home/wuchang$ jobs
[1]+ Stopped bash testShell
但奇怪的是,当我jobs
在 SecureCRT 的另一个选项卡中运行命令时,我看不到停止的作业:
imcas@ubuntu:/$ jobs
imcas@ubuntu:/$ jobs
imcas@ubuntu:/$
任何人都可以为我解释一下吗?
答案1
工作是一个空壳概念。作业是 shell 跟踪的 shell 的子进程。在一个终端上运行的 shell 实例对另一个 shell 实例的作业一无所知。当您jobs
在终端仿真器的第二个选项卡中运行的 shell 中运行时,这会列出以下位置的作业那壳。在第二个选项卡中运行的 shell 不知道第一个选项卡中运行的作业的任何信息。
作业是进程,因此您可以这样操纵它们。您需要识别作业的进程 ID。进程ID是一个内核概念;进程 ID 唯一标识给定机器上给定时间的进程。您可以运行ps -t pts/42
来列出终端上运行的进程/dev/pts/42
;tty
在 shell 中运行该命令以查看它在哪个终端上运行。 (这是终端,而不是终端仿真器软件。多选项卡终端仿真器中的选项卡是不相关的终端。)
一旦确定了您感兴趣的进程的进程 ID,您就可以使用该kill
命令向其发送信号。如果进程被挂起,信号 SIGCONT 会告诉进程恢复执行(如果没有挂起,则该信号不执行任何操作)。该进程将在后台执行;如果您想将其带到前台,则需要使用fg
该终端上运行的 shell 中的命令来执行此操作(因为您需要让 shell 放弃在前台)。
1您可以对流程组中的作业吹毛求疵,但这与此无关。