我在将命令列表从 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 中存储的命令时,它工作正常。 有没有办法让控制台将输入的运行时字符串视为通过子 shell 的命令列表,如 HERE ? 谢谢。
最佳答案
好的,命令读取错误的问题已由 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
关于java - 如何以编程方式将命令列表(带括号)从 Java 发送到 Linux 终端? crontab调度相关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61304071/