cron não executa comando com variável

1

Eu tenho alguma lógica para executar projetos java; tudo funciona no console do terminal quando eu digito, mas não no agendador do cron:

execute o primeiro microsserviço e obtenha a variável da solicitação 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')

teste:

echo $v2
18

18 - id do banco de dados, e eu uso na próxima requisição: (primeiro execute um novo microservice)

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

Então, curl executado como normal, o banco de dados preencheu alguns dados e, em valor , obtive o valor correto.

Mas, quando eu crio um cronograma de 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

Em seguida, execute normalmente apenas a primeira onda (no banco de dados criado nova nota). No próximo microsserviço executado (53 09 * * * java -jar parsdescription-0.0.1-SNAPSHOT.jar), mas nada não será executado no segundo comando curl , e nada será salvo em description3 arquivo .log - ele está vazio.

Por que isso funcionou no console, mas não está funcionando no crontab?

    
por Valentyn Hruzytskyi 05.09.2018 / 15:34

1 resposta

5

Cada tarefa cron é uma instância de shell única que não compartilha o estado com nenhum outro trabalho agendado, então

51 09 * * * value=42

define value apenas para esse trabalho, que então sai e value é perdido. Uma sessão de shell, por outro lado, mantém o estado em linhas sucessivas. Você precisará de uma única tarefa cron que execute todo esse código ou algum outro design; um único trabalho cron pode ser parecido com

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

e, em seguida, o arquivo /path/to/your/script deve ser executável e conter

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

e assim por diante.

Se você precisar compartilhar dados entre diferentes tarefas agendadas, as informações precisarão ser compartilhadas por meio de algum método IPC (comunicação entre processos) (o sistema de arquivos, um banco de dados etc.).

    
por 05.09.2018 / 15:45