【问题标题】:servlet multiple exec commandsservlet 多个 exec 命令
【发布时间】:2014-03-07 12:17:58
【问题描述】:

我正在编写一个 servlet 来运行终端命令,我必须在同一个终端上一个接一个地运行三个命令。 当我使用如下所示的 exec 时,我能够获得单个命令的结果,

Runtime rt = Runtime.getRuntime();
process proc = rt.exec("zsh");

但是当我尝试跑步时,

Runtime rt = Runtime.getRuntime();
Process proc = rt.exec("zsh", "source ./myenv/bin/activate", "python runner.py");

它显示如下警告(不执行),

The method exec(String, String[], File) in the type Runtime is not applicable for the arguments (String, String, String).

我也尝试过运行三个不同的 exec 命令,但它们不会以相同的顺序在同一个终端上发生,我应该怎么做才能使上述三个命令在同一个终端上按顺序运行并给我输出在第三个命令之后?

我打算运行的三个命令是, 1.zsh 2. 来源 ./myenv/bin/activate 3. python runner.py 这三个必须以相同的顺序一个接一个地执行。

【问题讨论】:

  • 能否创建一个包含三个命令的脚本并执行?
  • 它不可执行,它会给出上述警告。

标签: java python servlets terminal


【解决方案1】:

exec 采用 String[] 而不是 varargs 列表,因此您需要运行:

Process proc = rt.exec(new String[] {"zsh", "source ./myenv/bin/activate", 
    "python runner.py"}, null, new File("parentdirectoryofmyenv"));

如图所示,您还需要包含进程的工作目录,否则它将无法找到“./myenv”。

编辑:

进一步简化。我假设“source ./myenv/bin/activate”正在为进程设置环境。这可以按如下方式完成:

Process proc = rt.exec(
     new String[] {"python", "runner.py"}, 
     new String[] {"ENV1=VAL1", "ENV2=VAL2"}, 
     new File("parentdirectoryofrunnerpy"));

【讨论】:

  • 仍然收到错误,“zsh:无法打开输入文件:源 ./myenv/bin/activate”..当我从终端执行命令时,它们似乎工作正常。
  • 您可能在错误的工作目录中运行它。我已经更新了答案以显示如何添加工作目录。
  • 不!我刚刚从我的 servlet 执行 pwd 来确认它。
  • 我也尝试了新的 EDIT,但仍然存在相同的错误。
  • 您现在遇到的错误是什么。如果您已删除 ./myenv/bin/activate 的使用,则不会出现相同的错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-04
  • 1970-01-01
  • 2019-01-27
  • 1970-01-01
  • 1970-01-01
  • 2018-03-07
  • 1970-01-01
相关资源
最近更新 更多