java - 如何以编程方式将命令列表(带括号)从 Java 发送到 Linux 终端? crontab调度相关

标签 java cmd cron

我在将命令列表从 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/

相关文章:

java - Hibernate 结果列表转换以获取行

JavaFX 表格 View : Do I HAVE to wrap my fields in Simple<Object/Integer/String>Property?

php - Magento - cron 作业脚本正在运行,但 Magento 订单确认电子邮件未发送

linux - 脚本在 Bash 和 cron 执行时产生不同的结果

python - Ubuntu 16,使用 Crontab 运行 Python 脚本

java - 创建文档对象

Javafx 在哪里将标签绑定(bind)到 StringProperty

powershell - 如何在PowerShell中 “grep”并显示周围的行/上下文?

windows - 使用 BATCH (cmd) 获取 DNS 解析时间

java - 使用 CMD 脚本安装 Java