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

通常、最初のカールのみが実行されます(データベースに新しいコメントを作成します)。次 - 2番目のマイクロサービスは実行されますが(53 09 * * * java -jar parsdescription-0.0.1-SNAPSHOT.jar)2番目のマイクロサービスは実行されません。カールコマンドを発行し、何も保存されませんでした説明3.logファイル - 空です。

コンソールでは動作しますが、crontabでは動作しないのはなぜですか?

ベストアンサー1

各クローン操作は一意のシェルインスタンスであり、他のクローン操作と状態を共有しません。

51 09 * * * value=42

このジョブに対してのみ設定すると、valueジョブは終了してvalue失われます。対照的に、シェルセッションは連続した行で状態を維持します。すべてのコードを実行するクローン操作が必要な場合、または次のような他のデザインが必要な場合があります。

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)方式(ファイルシステム、データベースなど)を介して情報を共有する必要があります。

おすすめ記事