是否可以在 bash 中将进程添加到作业列表(例如反转“disown”)?

是否可以在 bash 中将进程添加到作业列表(例如反转“disown”)?

如果我disown在工作后bash改变了主意,我能以某种方式撤销它吗?

如果是这样,更进一步,是否可以将任意进程置于作业控制之下(可接受的限制是我拥有该进程)?

最后,这将使以下工作流程成为可能:

  • 将作业置于后台(^z后跟bg
  • 获取它的 pid (jobs -p %+获取它的<pid>
  • 打开一个screentmux会话,附加到它并使用它执行以下步骤
  • 用于reptyr抢夺工作 ( reptyr <pid>)
  • 添加<pid>到 shell 的作业控制(这有可能吗?
  • 停止工作 ( ^Z)

除了最后两步之外,我可以做所有事情。使用 停止作业^Z不起作用,因为该进程不在 shell 的作业列表中。

我的研究表明不可能自己的(相反disown)一个 pid 但希望我错了......

答案1

一般来说,shell 不可能“采用”一个作业。对于 shell 来说,工作意味着以下几件事:

  • 将作业标识符与进程 ID 相关联。
  • 显示其状态(运行、暂停、死亡)。
  • 当状态发生变化时通知用户。
  • 当终端消失时发送 SIGHUP 信号。
  • 控制作业是否“拥有”终端(是否是前台进程组)。

其中大多数不需要 shell 和作业之间有任何特殊关联,但也有一些需要:

  • 为了在状态更改时通知用户,shell 依赖于接收SIGCLD信号。该信号由内核发送给作业初始进程的父进程。
  • 为了控制对终端的访问,shell 需要与作业位于同一会话中。

一个进程不可能采用另一个进程,也不可能将进程附加到现有会话。因此,为了支持采用,shell 必须管理部分状态。普通的 shell 还没有实现这一点。

在特殊情况下,如果该作业最初由该 shell 启动,然后被否认,则不会出现这些问题。但是,没有一个常见的 shell 实现了允许它们在最初启动作业时添加作业的异常。

在您的场景中,通常最方便的做法是在 screen 或 tmux 会话中启动作业,如果您想暂停或恢复作业,则可以使用 PID。

相关内容