关于任务的一些信息:我们在 Linux(Astra,再次是 OS)中工作。有壳。一个程序从其下启动,该 shell 是该程序的父级。 shell 源已关闭、未知且无法更改。在这个程序内部,调用了一个 bash 脚本,该程序本身是该脚本的父级。脚本决定需要重新启动程序,但是如果您愚蠢地执行此操作(终止该进程并创建一个新进程),则原始 shell 将无法直接查看它启动的程序,并且其进一步的操作将无法预测。重新启动 shell 是一种可行但不是理想的解决方案(除非我找到更好的方法,否则我会坚持使用这个解决方案)。除其他外,还需要shell来处理程序工作的结果,因此单独运行该程序也不是最好的选择。
问题出现了:有没有办法将衍生的或已经运行的进程绑定到另一个父进程?有没有针对 bash 的解决方案,或者最好尝试用 C 做一些事情?
无论是通过 bash 命令还是 POSIX/Linux API,都无法轻松地启动具有不同父 PPID 的进程或在进程运行时更改它。
然而,如果你将你的程序分成一个主进程和一个监视进程,例如使用
fork(),那么你就不需要更改 ppid。监视进程应该循环执行以下操作:
然后,您的 bash 脚本就可以在适当的时候轻松执行,
kill -USR1 {№ основного процесса}不会出现任何问题。附言
原则上,“为了可靠性和装饰性”,您可以创建从主进程到监视器的管道。监视器不会读取它,它只会在重新启动或终止时关闭它,并且主进程的单独服务线程会写入它(不会持续很长时间,直到它因预期而挂起)。在这样的设计中,如果监视器突然不合时宜地死亡(由于错误或由“shell”主动导致),主进程将收到 SIGPIPE 并终止。
像这样构建应用程序架构:
从 shell 运行该程序。
该程序生成一对 pty/pts。
然后进行双分叉并启动主管(重启程序)
Supervisor 在 pty 上运行代码的主要部分
主管将 pts 编号写入文件
zero fork 将 pts 输出连接到 stdout/stdin
当外壳关闭时,该程序仍保留在后台。
重新启动时,查看已保存的 pts,如果它还活着,则连接到它。