修改 PB 配置时,ProcessBuilder 产生了进程行为

Posted

技术标签:

【中文标题】修改 PB 配置时,ProcessBuilder 产生了进程行为【英文标题】:ProcessBuilder spawned process behaviour when modifying PB config 【发布时间】:2020-01-18 15:59:03 【问题描述】:

我的问题是:

ProcessBuilder 环境变量或工作目录的更改是否对先前生成的进程有影响?在 Debian 9 和 Windows 7 上的简单测试表明对已经创建的进程没有影响,但我想确定这是预期的行为,最好有一些官方文档的链接或一些关于 ProcessBuilder 内部的解释,这使得该声明变得不必要。

详情:

我在并发系统中使用 Process Builder 来生成具有不同环境变量和来自多个线程的工作目录的同一进程的实例。

我目前正在使用 ProcessBuilderControler 类,该类通过同步对 PB 的访问来避免典型的并发问题,以避免在 T1 和 T2 尝试同时生成进程时出现以下问题:

T1 使用值“/dir”设置 PB 的工作目录 T2 将 PB 的工作目录设置为“/dir2” T1 执行 PB 的 start() T2 执行 PB 的 start()

在这种情况下,T1 和 T2 进程会生成以 /dir2 作为工作目录的脚本。

我担心的是,如果即使在进程生成后更改 pb 目录,该进程也会获得最新值。根据我强制描述情况的测试,在 Windows 或 linux 中情况并非如此..

【问题讨论】:

来自the documentation:“修改进程构建器的属性将影响随后由该对象的start() 方法启动的进程,但不会影响之前启动的进程或Java 进程本身。” 【参考方案1】:

不,操作系统的一般限制是您不能从进程外部更改正在运行的进程的环境变量工作目录

也许可以使用调试 API,但 ProcessBuilder 肯定不会这样做。


我目前正在使用 ProcessBuilderControler 类,它通过同步对 PB 的访问来避免典型的并发问题,以避免出现问题

在控制器类中使用ProcessBuilder 时,避免并发问题的正确方法是不使用ProcessBuilder 的共享实例。

这实际上是一个普遍的建议:不要在控制器中使用共享可变对象。

【讨论】:

谢谢。在我的情况下你会怎么做?每次我想启动一个进程时就启动一个新的ProcessBuilder? @DGoiko“正确方式”=“不使用共享实例”=“每次都新建 ProcessBuilder”=“我会做什么”。 --- ProcessBuilder 只是一个 Builder,即帮助收集创建复杂对象所需信息的类 (Process)。没有看到您的任何代码,我不知道您认为使用共享对象会保存什么。为什么你认为创建一个新的(非常短暂的)ProcessBuilder 不是正确的做法? 它应该被使用数百甚至数千次,在大多数情况下,大多数时候都使用 sasme 参数,所以我只是想让它更有效率。 考虑到您的计算机实际启动一个新进程所需的大量处理资源,构建ProcessBuilder 所需的极少代码量不算什么。这是误用性能考虑的一个很好的例子。此外,对于可变ProcessBuilder 的共享访问,您必须同步对它的访问,失去的可能比共享获得的更多。 谢谢!我正在听从你的建议并改变我的方法

以上是关于修改 PB 配置时,ProcessBuilder 产生了进程行为的主要内容,如果未能解决你的问题,请参考以下文章

java ProcessBuilder和RunTime里面的环境变量具体是指啥?啥意思?

java ProcessBuilder和RunTime里面的环境变量具体是指啥?啥意思?

使用 ProcessBuilder 时客户端无法连接 RMI 注册表

GWT + ProcessBuilder

浅析Java.lang.ProcessBuilder类

如何在执行“git fetch -v --progress”时输入密码 “来自java中的ProcessBuilder