给定一个交互式 bash 进程和一个不是从 bash 进程启动的进程,是否有某种方法(程序)可以使该进程成为 shell 的工作?
这听起来似乎不可能,但可能是一个有用的功能。有时我不小心杀死了 bash 进程,并且它的一些作业被重新分配给 init 进程。我想让它们成为另一个 bash 进程的工作,以便更好地管理它们。
谢谢。
答案1
我在学校里被告知这是不可能的。这显然不再是事实,但在单个进程中绕过它是相当复杂的。
评论中提供给您的两个链接解释了您可以选择哪些简单的选项来完成您想要完成的任务。但是,它们要么要求您在启动要移动的命令之前采取行动
https://unix.stackexchange.com/a/8696/329452 https://unix.stackexchange.com/a/49155/329452
或者它们只告诉您如何更改进程正在使用的 tty(这样您可以移动输入和输出,但它不会成为活动进程的子进程)
这些帖子上还有很多答案,但它们基本上都是这些答案的重复。
为了更改进程的父进程,其父进程必须死亡。在过去,这总是会将父级更改为 PID 1。我不确定这种情况何时发生变化,但从 Linux 3.4 开始,获取所有孤儿的进程可以更改:https://unix.stackexchange.com/a/177361/5132。我仍在研究结果。我本以为重大的改变将使 systemd 不再那么单一 - 但是显然,systemd 本身就是一个整体。(该页面大约 90% 的位置)
话虽如此,承担这个角色的流程必须承担整个角色。这不仅仅是为一个进程做的事情。
大多数 UNIX shell 中没有任何代码来允许它们识别刚刚嫁接的新子进程。其中一些比其他 shell 更容易收到此类子进程结束的通知。我预计将这些进程添加到作业控制中不会是常见的 shell 功能。我认为如果需要的话,zsh 的模块将能够添加对 shell 的支持。我实际上还没有寻找不属于 zsh 包一部分的 zsh 模块来执行此操作,也没有寻找其他可以处理它的 shell。