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

sta*_*fry 7 bash process jobs reptyr disown

如果我找到disown一份工作bash并改变主意,我可以以某种方式撤消它吗?

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

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

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

除了最后两步,我什么都能做。停止作业^Z不起作用,因为该进程不在 shell 的作业列表中。

我的研究表明不可能拥有(反向disown)一个 pid 但希望我错了......

Gil*_*il' 3

一般来说,shell 不可能\xe2\x80\x9cadopt\xe2\x80\x9d 作业。对于 shell 来说,工作意味着以下几件事:

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

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

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

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

\n\n

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

\n\n

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

\n