如何在后台启动两个进程并将第二个作业带到前台?

如何在后台启动两个进程并将第二个作业带到前台?

这两个过程:

cat /dev/tty > /dev/null &
cat /dev/zero > /dev/null &

必须在后台运行,但我无法将第二项工作带到前台。

答案1

如果这是两个普通作业,则 aa plainfg会将第二个作业带到前台(如果这是最近暂停的后台作业或最近启动的后台作业(没有其他作业被暂停))。

然而,根据第一个作业(从 读取)的性质/dev/tty,一旦它尝试从 TTY 读取,它就会停止。fg因此将把回到前台。

考虑到没有其他作业,这里的解决方案是使用%-或。%2


当将作业放入后台时(无论是通过使用结尾的 启动作业&,还是通过使用 暂停前台作业Ctrl+Z然后发出命令 )bg,该作业都会被赋予“作业 ID”或“作业规范”。此作业 ID 通常用 表示,%N其中N是某个十进制数。

您可以将作业 ID 与多个命令一起使用,例如waitkill和。例如,该命令可用于使用其作业 ID 向后台作业发送信号。fgbgkill

默认情况下,该fg命令适用于“当前作业”。当前作业的作业 ID 可通过%+或获得%%。当前作业是最近启动的后台作业,或者,如果有暂停的作业,则为最近暂停的作业。

要将任意后台作业移动到前台,请使用其作业 ID:

$ sleep 1000 &
[1] 37327
$ sleep 500 &
[2] 83532
$ jobs
[1]-  Running                 sleep 1000 &
[2]+  Running                 sleep 500 &
$ fg %1
sleep 1000

输出+中的jobs表示“当前作业”(这是通过简单调用 切换到的作业fg)。

POSIX 标准特殊作业 ID:

  • %%,目前的工作。
  • %+,同上。
  • %-,上一份工作。
  • %N, 工作编号N
  • %string,命令以 开头的作业string
  • %?string,其命令包含 的作业string

答案2

你尝试过fg命令吗?

fg %2

答案3

while$!包含进程 ID最上面的最近在后台启动的作业的进程,很难得到它工作以万无一失的方式进行 ID。

它不一定是最大的作业 ID,因为作业 ID 会被重复使用。它不一定是您可能引用的作业%%%+(或fg没有参数的情况下会采取行动),因为挂起的作业优先(就像在您的情况下,第一个作业可能会被挂起,因为它会尝试从 tty 读取而不是在前台)或者最近开始的作业可能已经死亡(在这种情况下%+将引用列表中的下一个作业)。

因此,您需要jobs首先运行以了解您想要的作业的作业编号fg(使用 use ),或者如果名称中fg %thatnumber没有其他作业,请运行:zero

fg %\?zero

有了zsh,您可以使用:

fg_most_recent() {
  local job=${(k)jobstates[(R)*:$!=*]}
  ((job)) && fg %$job
}

也就是说,获取其值与模式匹配的关联数组k的ey (看起来像是给出了直接启动的作业中所有进程的状态)。$jobstates*:$!=*$jobstatesrunning:+:20162=running:20163=runningzsh

相关内容