java - 如何从 Java 执行命令 R CMD Rserve
问题描述
我正在尝试使用 Runtime exec 函数从我的 java 后端启动 Rserve。我通常可以执行像 killall 这样的 linux 命令来停止进程,但我无法启动它。您可以使用此命令从命令行启动 Rserve
R CMD Rserve
并且工作正常。但是从java:
Process pr = Runtime.getRuntime().exec("R CMD Rserve")
它不工作。那我怎么能从java中使用这个命令呢?
解决方案
exec
与“当我在 shell 中键入它时它起作用”不同。毕竟,当您在“命令行”上键入它时,“命令行”本身就是一个应用程序。通常是/bin/bash
,但是有很多很多的shell。
shell 不只是把你输入的内容逐字逐句扔到操作系统上,然后转到“这里”。运行这个'。它会接收您输入的内容并对其进行按摩。对其应用转换。然后,被按摩的东西被扔到操作系统上,并带有“这里,运行它”。
Java 是类似的,因为它接受你写的东西,按摩它,然后把它扔给操作系统。
这些按摩完全不同。
例如 /bin/bash 会变成*.txt
运行的结果ls *.txt
。Java 不这样做,所以如果你尝试exec("/bin/ls *.txt")
在 java 中运行,它就不起作用。ls 试图找到一个字面上称为 的文件*.txt
,并报告它找不到它。
诀窍是了解 bash 对您的输入所做的所有许多事情,并且不依赖这些. java 对按摩的实际作用是依赖于操作系统的,所以也不要依赖它。因此,一些规则:
始终使用绝对路径。不要跑
R CMD Rserve
。/usr/local/share/R/bin/R CMD RServe
例如,运行。我不知道在哪里R
,但它是您系统某处的可执行文件。找到绝对路径;bash 所做的按摩之一是 apply$PATH
。Java 可能应用路径,也可能不应用路径,谁知道你的路径设置是什么,以及 java 进程是否与你的 bash 具有相同的 PATH 设置;它可能不会,所以,绝对不要依赖它,并且总是,总是,写一个绝对路径。注意 bash 内部结构,永远不要使用它们。
ls
并且ps
通常是内部人员;根据定义,java 不能运行它们。如果您必须依赖 bashism,则必须实际运行 bash。不是exec("ls")
,是exec("/bin/bash", "-c", "ls")
。永远不要依赖 java 的空间分割能力。永远不要使用
exec(cmd)
,永远不要使用Runtime.getRuntime().exec
。考虑这些被禁止的方法。制作 aProcessBuilder
,并且始终是List<String>
变体(列表中的第一个条目是命令的绝对路径,其余是命令行参数。
这让你:
// to stop
List<String> args = List.of("/bin/bash", "-c", "killall -9 RServe");
ProcessBuilder pb = new ProcessBuilder(args);
// if you need to read what bash produces, config that here.
pb.start();
// to start
List<String> args = List.of("/abs/path/to/R", "CMD", "RServe");
ProcessBuilder pb = new ProcessBuilder(args);
// if you need to read what bash produces, config that here.
pb.start();
当然,kill -9
除非您的 java 进程是启动它的进程,否则您将无法做到这一点,因此很可能无法从 java 执行此操作——您只是没有权限。
推荐阅读
- ruby - 使用 RVM 在 OSX 10.15.2 Catalina 中安装 Ruby 2.3.8 时出错;未找到 OpenSSL
- javascript - 材质 UI 垂直滑块。如何在垂直材质UI Slider(React)中更改导轨的厚度
- android - 无法将图像拖到卡片视图之外
- firebase - firebase 中的自定义域:无法在我的 .com.bd 域中获取 TXT 记录类型
- java - 如何从设备本身发送 Firebase 推送通知?
- c# - 如何将 JSON 嵌套字符串解析为 C#
- java - 在 onclicklistener 内以编程方式将子项添加到空的线性布局失败
- python - 自动完成(智能感知)在 VSCode 中对 Python 不起作用
- spring - 如何在集成测试中使用 RestTemplate 来验证 Wiremock 故障?
- docker - 使用 Docker 组合的主机名反向代理