【问题标题】:How to programmatically send List of commands (with parenthesis) from Java to linux terminal? Crontab schedulation related如何以编程方式将命令列表(带括号)从 Java 发送到 linux 终端? crontab 调度相关
【发布时间】:2020-04-20 02:06:23
【问题描述】:

我在将命令列表从 Java 发送到 CMD 时遇到问题。 我的目标是以编程方式从 Java 更新 Crontab 调度脚本。

我觉得问题的发生是因为“;”发送的字符串中“-l”后面的符号作为 CMD 中的命令分隔符。我尝试过直接使用字符串,并使用进程构建器(使用不同的组合,甚至通过拆分每个空格的命令):

String cmd = "(crontab -l; echo '9 * * * * sudo python /home/pi/Desktop/led.py') | sort - | crontab -";
Process p = Runtime.getRuntime().exec(cmd);

String commandArray[] = {"(crontab", "-l,", "\"echo '9 * * * * sudo python /home/pi/Desktop/led.py\")", "|", "sort", "-", "|", "crontab", "-"}
Process p = new ProcessBuilder (commandArray).redirectErrorStream(true).start();

在这两种情况下,我都会得到以下信息:

java.io.IOException: Cannot run program "(crontab": error=2, No such file or directory

但是,当直接在终端运行存储在 String cmd 中的命令时,它可以正常工作。 有没有办法让控制台通过像HERE 这样的子shell 将输入的运行时字符串视为命令列表? 谢谢。

【问题讨论】:

  • 似乎是 bash/sh 脚本,所以您可以选择 /bin/bash 或 /bin/sh 作为命令,然后将这些作为参数传递
  • 嗨,Ahmet,你能举个例子吗?顺便说一句,我设法让它同时运行,方法是将 crontab 命令存储在 .txt 文件中,然后在以下位置运行“crontab -”:cat /home/pi/Desktop/Automation/schedule_commands.txt | crontab -

标签: java cmd cron


【解决方案1】:

好的,Ahmet 在评论中建议尝试将其作为 bash 脚本运行,从而解决了命令读取错误的问题。 原因似乎是因为 Runtime.exec() 不能使用管道“|”。我还设置了从文件运行 crontab 的命令,而不是硬编码预期的 crontab 命令和它看起来像这样:

String[] cronString = {
    "/bin/sh",
    "-c",
    "sudo cat /home/pi/Desktop/Automation/schedule_commands.txt  |  crontab -"
    };
System.out.println(cmd3);
Process p3 = Runtime.getRuntime().exec(cronString);

为澄清起见,schedule_commands.txt 包含:

0 18 * * * sudo python /home/pi/Desktop/led.py
0 * * * * java -classpath /home/pi/Desktop/Automation automation

【讨论】:

  • 赞许乔斯普。
猜你喜欢
  • 1970-01-01
  • 2016-04-03
  • 1970-01-01
  • 2016-04-19
  • 2015-10-01
  • 2020-04-10
  • 1970-01-01
  • 1970-01-01
  • 2019-02-25
相关资源
最近更新 更多