Synology Scheduler .sh javaコマンドが見つかりません


9

jarファイルを実行するだけのタスクであるbashスクリプトがあります。

sms.sh

java -jar /volume1/homes/jar/smssender.jar

Synology NASを使用して、タスクを設定しました。

ルートによって実行されるタスクセットアップ

bashスクリプトを実行するコマンドを追加します。ログ出力を追加します。

ここに画像の説明を入力してください

新しいタスクを実行しています。

ここに画像の説明を入力してください

ログをチェックして、次のエラーを確認します。

/volume1/homes/jar/sms.sh:1行目:java:コマンドが見つかりません

Javaバージョン/インストールの確認:

ここに画像の説明を入力してください

shスクリプトの実行を手動で確認する(動作中):

ここに画像の説明を入力してください

これと同じ奇妙なケースを持つ誰か?回避策/アイデアはありますか?

私は試した

  • NASを再起動する
  • Java8パッケージのアンインストール/インストール

しかし、どれもうまくいきませんでした。


4
あなたの問題を考えると、ジョブの実行時に正しく設定されていないenv(JAVA_HOME、PATH)の問題である可能性があります。Java実行可能ファイルへの絶対パスを使用するか、それを行うファイルを入手する必要があります。
NoDataFound

@NoDataFound絶対パスとはどういう意味ですか?/volume1/(...)/file.jarがパスではありませんか?ヘルプと時間をありがとう
piguy

3
まず、Java実行可能ファイルを見つけます。次に、これを使用して呼び出します/whatever/path/to/java/is/java /volume1/homes/jar(これは
synologyに

1
おそらくここで、コマンドを実行しているユーザーは、最終的にはOPがログインしているユーザーではないため(確かにそうでない場合)、異なるPATHを持つことになるでしょう。
BadZen

(また、これは本当に話題になっていますか?)
BadZen

回答:


5

Synologyタスクスケジューラがスクリプトを実行するとsms.sh、PATH設定がスクリプトから取得されます/etc/crontab。Javaパスが含まれていません。

デフォルトのログインシェル環境はintで定義されてい/etc/profileます。最後に、Javaパスを追加するセクションがあります。

PATH=$PATH:/var/packages/Java8/target/j2sdk-image/bin # Synology Java runtime enviroment
PATH=$PATH:/var/packages/Java8/target/j2sdk-image/jre/bin # Synology Java runtime enviroment
JAVA_HOME=/var/packages/Java8/target/j2sdk-image/jre # Synology Java runtime enviroment
CLASSPATH=.:/var/packages/Java8/target/j2sdk-image/jre/lib # Synology Java runtime enviroment
LANG=en_US.utf8 # Synology Java runtime enviroment
export CLASSPATH PATH JAVA_HOME LANG # Synology Java runtime enviroment

すでに与えられたコメントですでに述べられているように、対話型シェル用のプロファイルスクリプトを調達することはお勧めしません。/etc/profileスクリプトのスクリプトの動作を模倣して、sms.shCLASSPATH PATH JAVA_HOME LANGを設定する場合があります。

スクリプト内のパスをハードコーディングすることについての提起されたポイントと、その結果としての移植性の低下は、この特定のケースではかなり優先される可能性があります。


あなたの答えは私を大いに助けて正解でしたが、私は私の電話を誤ってクリックし、ユーザーに100ポイントを与えました。申し訳ありません
piguy

@piguyライブです。;-)
準最適

-1

あまり知らないSynologyので...

特定のログインセッションが環境変数のセットを既にロードしているため、シェルスクリプトはコマンドラインで実行されたときに機能します(たとえば、.profile/.bashrcホームディレクトリのスクリプトにログインすると、さまざまなjava固有の環境変数がロードされます) - PATH, JAVA_HOME, CLASSPATHなど)javaスクリプトを問題なく実行できます。

失敗したSynologyジョブのエラーは、Java固有の環境変数がロードされていないため、ジョブ/スクリプトが見つからないことを示していますjava

Synologyログインのプロファイルをプリロードすることを規定する構成設定/フラグがないと仮定すると、「簡単な」解決策は、スクリプトを編集して(sms.sh)、操作を実行する前に適切なリソースファイルをソースさせることです(たとえばを呼び出すjava)。簡単な例:

$cat sms.sh
#!/usr/bin/bash

. ~root/.bashrc      # load the root account profile before continuing ...

java ...

  • rootスクリプトを実行するログインの名前に置き換えます(サンプルSynology画像では、rootユーザーを選択したように見えるため、私の例を参照しています)~root
  • ~root/.bashrcスクリプトが検索できるようにするために必要な環境変数をプリロードするために、ユーザーのプロファイルへのパスに置き換えますjava

インタラクティブな使用のために作成された構成ファイルを非インタラクティブなコンテキストで使用することを奨励しないでください-それは人々が彼らが行っている変更が無害であると考える状況を引き起こします(.bashrcデーモンがどのように動作するかを変更しないので?)生産の破損。
Charles Duffy

1
実際の場所を見つけて、スクリプト自体、またはスクリプトがソースとする専用の構成ファイルに適切なPATH更新をハードコードする方がはるかに優れています。それはまた、状況に働くところこれはしません- F / E、/etc/profile.dというよりも~/.bashrc関連性があります。
Charles Duffy

ハードコーディングは、特にOSとバージョンが混在する環境では移植性がほとんどありません。インタラクティブなconfig / resourceファイルと特別に構築されたresource / configファイルの使用については...開発者が環境を作成/維持していることに基づく個人的な選択の問題です。過去20年間、問題は発生していません/実稼働環境では...スクリプト環境全体、ymmv全体で共通のresource / configファイルを使用しています
markp-fuso

1
ユーザーのインタラクティブファイルに点を打つことも移植可能ではありません(特に、ディストリビューションがどのファイルによってどのコンテンツを実行するかを再調整します-一部は従来の方法で使用し.profile、一部はを使用し.bash_profile、一部は使用し/etc/profile.d、一部はPAMから環境変数を設定します)。 。どういうわけか、あなたは移植性のない何かをしています。少なくともハードコーディングPATH=$PATH:/whatever/specific/locationは設定を修正しており、その動作は読者に明らかです(読者は後で変更されるかどうかについて心配する必要はありません)。
Charles Duffy
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.