1

JavaプログラムをLinuxボックスで1日1回実行する必要があります。そこで、1行だけの単純なファイルを作成しました。

java -jar /opt/location/my_jar.jar

1日に1回実行されると仮定して、etc/cron.dailyに配置します。しかし、それはまったく実行されません。両方に.sh拡張子を付けるか、単に拡張子のないファイル名を付けてみました。それでも、運はありません。

私はそれをグーグルで検索しました、そして私はかなりの矛盾する情報を得ています。誰か助けてもらえますか?

編集:

SatishとMithrandirの回答に基づいて、現在の場所を要約しています。

1.viを使用してrun_conversionsスクリプトを作成し、Windowsの行末文字の問題を解決しました。これで、スクリプトは

#!/bin/sh
/usr/bin/java -jar /opt/location/my_jar.jar

2./etc/cron.hourlyに入れます。

3. / var / log / cronでログを確認すると、run_conversionsが開始され、run_conversionsが1時間ごとに終了していることがわかります。ここまでは順調ですね。

4.しかし、jarファイルが実行されていないようです。これは、正しく実行されている場合はデータベースを更新する必要があり、データベースが更新されていないためです。

5.奇妙なことがあります:cron.hourlyを手動で実行しているが、

run-parts /etc/cron.hourly

jarファイルが適切にヒットし、データベースが更新されています。

要約すると、run-partsを実行すると、機能します。単独で1時間ごとに実行するためにそれを残すとき、それはしません。

何か案は?

編集2:

Satish、Mithrandir、vahidからのアドバイスに従い、run_conversions_locを次のように変更しました。

#!/bin/bash
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bexport SHELL=/bin/bash
/usr/bin/java -jar /opt/tf/conversions/aff_networks2.jar > /opt/tf/conversions/runconversions.txt

cron.hourlyからスクリプトを削除し、次の行をcrontabに追加しました。

*/10 * * * * /opt/tf/conversions/run_conversions_loc

スクリプトは10分ごとに実行され、次のようにcronログに登録されます。

Feb 24 09:30:01 backsome CROND[7933]: (root) CMD (/opt/tf/conversions/run_conversions_loc)

これまでのところ、それはよさそうだ。ただし、データベース(更新する必要がある)は更新されません。

さらに詳しく調べると、jarファイルaff_networks2.jarはftr.properties、ローカルディレクトリ(同じディレクトリ)でファイルを探しています。ファイルはこのディレクトリにあります。しかし、それは正しく読まれていません。出力ファイルrunco​​nversions.txtで、プロパティファイルから読み取る必要のある値がnullであるため、これを知っています。

全体像を完成させるための2つのこと:

  1. 変換ディレクトリ内のすべてに777の権限があります。このような拡張アクセス許可を与えることは推奨されないことは知っていますが、それが問題ではないことを確認したかったのです(少なくとも試してみてください)。

  2. シェルからスクリプトを実行して実行すると、実行./run_conversions_loc、プロパティファイルが検索され、データベースが更新されます。rootとしてシェルにログインし、関連するすべてのファイルをrootとして作成し、crontabでスクリプトを呼び出すための行をrootとしてインストールしました。

cronがプロパティファイルを読み取らない理由はありますか?

4

3 に答える 3

2

そのおそらくあなたの環境変数

スクリプトの実行時に現在ログインしているユーザーとして機能しますか?

もしそうなら

走る:

env|egrep "(^PATH=|^SHELL=)"|awk '{print "export "$1}'

次に、出力を取得してスクリプトの先頭に配置し、2分後に別のcronを試して、機能するかどうかを確認します。

2013年2月24日のEddyのコメントに応じて回答を更新しました。

crontabのクラッシュコースを提供したいと思います。

  1. crontabの設定は、グローバル/ etc / crontabを介して、またはユーザーの下でcrontab -e(特定のユーザーのcronを編集するため)またはcrontab -l(リスト-各ユーザーの/ var / spool / cronに保存されます)として行うことができます。

/ etc/crontabで問題ない10分ごとの実行を試みているようです。

現在のシェルのクラスパス全体を指定することを提案した理由は、ほとんどの場合、スクリプトがcrontabのPATH(/ etcの最上部にある)の一部として使用できないunixコマンドを使用しようとしているためです。 / crontabファイル自体)

パスの問題をデバッグするには、通常、crontabがタスクを実行しているユーザーのメールボックスを次のように監視することをお勧めします。したがって、tail -100 / var / spool / mail / rootと、そのcronタスクに関連するメッセージを探します。誰かが提案したように、cronはそれ自体をログに記録します-

あなたの問題はここの道ではないと思います。

java jarファイルを実行しようとしていますが、jarファイルにはその変換フォルダー内の他のファイルが必要であり、実行するとすでにそのフォルダー内にある可能性があります。

したがって、スクリプトで実行できます

cd /opt/tf/conversions/;
 /usr/bin/java -jar aff_networks2.jar > /opt/tf/conversions/runconversions.txt

しかし、これは非常に小さなスクリプトであるため、すべてをcronエントリとして配置し、シェルスクリプトを完全にバイパスすることでこのようなものを回避できます。

*/10 *    * * *   root cd /opt/tf/conversions/; /usr/bin/java -jar aff_networks2.jar > /opt/tf/conversions/runconversions.txt

これがこの問題の解決に役立つことを願っています

于 2013-02-21T16:58:56.120 に答える
2

例を挙げた解決策:

コマンドラインでコマンドを手動で実行します。

[root@04 cron.daily]# /usr/bin/java -jar /root/HelloWorld.jar
Hello World #1

/にスクリプトを作成し、etc/cron.daily/test.sh実行権限を与えましょう。

#!/bin/bash
/usr/bin/java -jar /root/HelloWorld.jar

注:dos2unix dos文字の問題またはエラーがある場合に実行してください/bin/bash^M: bad interpreter: No such file or directory

[root@04 cron.daily]# unix2dos test.sh
unix2dos: converting file test.sh to DOS format ...

テストして、出来上がり!

[root@04 cron.daily]# run-parts /etc/cron.daily
/etc/cron.daily/ldiscan:

kcore: Value too large for defined data type
/etc/cron.daily/test.sh:

Hello World #1
于 2013-02-22T17:09:18.660 に答える
0

ファイルを次のように変更します。

#!/bin/sh
/usr/bin/java -jar /opt/location/my_jar.jar

/usr/bin/javaコマンドが実際にインストールされている場所であるかどうかを確認します( which java)。ファイルのアクセス許可を実行可能に変更します。

chmod +x /opt/location/my_jar.jar
于 2013-02-21T16:47:56.623 に答える