cron 不执行带有变量的命令

cron 不执行带有变量的命令

我有一些执行java项目的逻辑;当我键入它时,这一切都在终端控制台中起作用,但在 cron 调度程序中不起作用:

运行第一个微服务并从 POST 请求获取变量:

java -jar /root/parser-0.0.1-SNAPSHOT.jar
value=$(curl -d '{"query":"java-middle", "turnOff":true}' -H "Content-Type: application/json" -X POST http://localhost:8080/explorer)
v2=$(echo ${value} | jq '.id')

测试:

echo $v2
18

18 - 来自数据库的 id,我在下一个请求中使用它:(首先运行新的微服务)

java -jar parsdescription-0.0.1-SNAPSHOT.jar 
value=$(curl -d '{"explorerId":'$v2', "turnOff":true}' -H "Content-Type: application/json" -X POST http://localhost:8080/descriptions) >> /var/log/description3.log 2>&1

所以,卷曲执行正常,数据库确实填充了一些数据并且在价值我得到正确的值。

但是,当我创建 crontab 计划时:

50 09 * * * java -jar /root/parser-0.0.1-SNAPSHOT.jar
51 09 * * * value=$(curl -d '{"query":"java-middle", "turnOff":true}' -H "Content-Type: application/json" -X POST http://localhost:8080/explorer)
52 09 * * * v2=$(echo ${value} | jq '.id')
53 09 * * * java -jar parsdescription-0.0.1-SNAPSHOT.jar 
54 09 * * * value=$(curl -d '{"explorerId":'$v2', "turnOff":true}' -H "Content-Type: application/json" -X POST http://localhost:8080/descriptions) >> /var/log/description3.log 2>&1

然后通常仅执行第一个curl(在数据库中创建新注释)。接下来 - 执行第二个微服务( 53 09 * * * java -jar parsdescription-0.0.1-SNAPSHOT.jar ),但第二个微服务没有执行卷曲命令,并且没有保存任何内容描述3.log文件——他是空的。

为什么它在控制台中有效,但在 crontab 中不起作用?

答案1

每个 cron 作业都是一个唯一的 shell 实例,不与任何其他 cron 作业共享状态,因此

51 09 * * * value=42

仅针对该作业设置value,然后该作业退出并value丢失。相比之下,shell 会话在连续的行中维护状态。您将需要一个运行所有代码的 cron 作业,或者一些其他设计;一个 cron 作业可能看起来像

51 09 * * * /path/to/your/script

然后该文件/path/to/your/script应该是可执行的并包含

#!/bin/bash
java -jar /root/parser-0.0.1-SNAPSHOT.jar
value=$(curl -d '{"query":"java-middle", ...

等等。

如果您需要在不同的 cron 作业之间共享数据,则需要通过某种 IPC(进程间通信)方法(文件系统、数据库等)共享信息。

相关内容