如果我disown
在工作后bash
改变了主意,我能以某种方式撤销它吗?
如果是这样,更进一步,是否可以将任意进程置于作业控制之下(可接受的限制是我拥有该进程)?
最后,这将使以下工作流程成为可能:
- 将作业置于后台(
^z
后跟bg
) - 获取它的 pid (
jobs -p %+
获取它的<pid>
) - 打开一个
screen
或tmux
会话,附加到它并使用它执行以下步骤 - 用于
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。