Penjadwal Synology .sh perintah java tidak ditemukan

9

Saya punya skrip bash yang hanya tugas menjalankan file jar.

sms.sh

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

Menggunakan Synology NAS saya, saya mengatur tugas.

Pengaturan Tugas dijalankan oleh root

Menambahkan perintah untuk menjalankan skrip bash. Menambahkan output log.

masukkan deskripsi gambar di sini

Melaksanakan Tugas baru saya.

masukkan deskripsi gambar di sini

Memeriksa log untuk melihat kesalahan berikut:

/volume1/homes/jar/sms.sh: baris 1: java: perintah tidak ditemukan

Memeriksa versi Java / instalasi:

masukkan deskripsi gambar di sini

Memeriksa eksekusi skrip sh secara manual (berfungsi):

masukkan deskripsi gambar di sini

Adakah yang memiliki kasus aneh yang sama? Ada solusi / ide?

Saya mencoba

  • Reboot NAS saya
  • Hapus instalan / instal paket Java8

tapi tidak ada yang berhasil.

Piguy
sumber
4
Mengingat masalah Anda, itu mungkin masalah dengan env (JAVA_HOME, PATH) yang tidak ditetapkan dengan benar ketika pekerjaan dijalankan. Anda harus menggunakan path absolut ke java executable, baik sumber file melakukan itu untuk Anda.
NoDataFound
@NoDataFound Apa maksud Anda dengan path absolut? Bukankah /volume1/(...)/file.jar path? Terima kasih atas bantuan dan waktu
piguy
3
Pertama, temukan java executable. Kemudian, aktifkan menggunakan /whatever/path/to/java/is/java /volume1/homes/jar(ini tidak khusus untuk synology)
NoDataFound
1
Kita mungkin harus menambahkan di sini bahwa pengguna apa pun yang menjalankan perintah pada akhirnya mungkin bukan pengguna yang masuk dengan OP (kecuali dia yakin itu), dan karena itu memiliki PATH yang berbeda.
BadZen
(Juga: apakah ini benar-benar sesuai topik?)
BadZen

Jawaban:

5

Ketika penjadwal tugas Synology mengeksekusi skrip sms.sh, pengaturan PATH diambil dari skrip /etc/crontab. Yang tidak mengandung jalur Java.

Lingkungan shell login default didefinisikan int /etc/profile. Pada akhirnya ada bagian untuk menambahkan path 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

Seperti yang sudah dinyatakan dalam komentar yang sudah diberikan, sumber skrip profil yang dimaksudkan untuk shell interaktif tidak disarankan. Anda mungkin meniru perilaku /etc/profileskrip dalam sms.shskrip Anda untuk mengatur CLASSPATH PATH JAVA_HOME LANG.

Poin yang diangkat tentang hardcoding lintasan di skrip Anda dan portabilitas yang berkurang mungkin memiliki prioritas yang lebih tinggi dari kekasih dalam kasus khusus ini.

SubOptimal
sumber
Jawaban Anda banyak membantu saya dan benar, tetapi saya salah menulis di ponsel saya dan memberikan 100 poin kepada pengguna. Saya benar-benar minta maaf
piguy
@piguy Itu langsung. ;-)
SubOptimal
-1

Saya tidak akrab dengan Synologybegitu ...

Script shell berfungsi ketika dieksekusi pada baris perintah karena sesi login tertentu telah memuat seperangkat variabel lingkungan (misalnya, saat masuk dalam .profile/.bashrcskrip di direktori home bersumber dan berbagai variabel lingkungan spesifik java dimuat - PATH, JAVA_HOME, CLASSPATH, dll) yang memungkinkan javadan skrip berjalan tanpa masalah.

SynologyKesalahan pekerjaan yang gagal menunjukkan bahwa variabel lingkungan java-spesifik belum dimuat dan oleh karena itu pekerjaan / skrip tidak dapat menemukan java.

Dengan asumsi Synologytidak memiliki pengaturan konfigurasi / flag yang menyatakan untuk memuat profil login sebelumnya, solusi 'mudah' adalah mengedit skrip ( sms.sh) dan minta sumber file sumber daya yang sesuai sebelum melakukan operasi apa pun (misalnya, panggilan java). Contoh sederhana:

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

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

java ...

CATATAN :

  • ganti rootdengan nama login tempat skrip dijalankan (dalam contoh Synologygambar tampaknya Anda telah memilih rootpengguna maka contoh referensi saya ~root)
  • ganti ~root/.bashrcdengan jalur ke profil pengguna untuk memuat variabel lingkungan yang diperlukan agar skrip dapat ditemukanjava
markp-fuso
sumber
Tolong jangan mendorong file konfigurasi yang ditulis untuk penggunaan interaktif agar digunakan dalam konteks noninteraktif - itu mengarah sehingga situasi di mana orang berpikir bahwa perubahan yang mereka buat tidak berbahaya (karena .bashrctidak mengubah cara kerja daemon, kan?) Tetapi malah dapat menyebabkan kerusakan produksi.
Charles Duffy
1
Jauh lebih baik untuk menemukan lokasi sebenarnya dan hanya meng-hardcode pembaruan PATH yang sesuai dalam skrip itu sendiri, atau dalam file konfigurasi tujuan khusus sumber skrip. Itu juga berfungsi dalam situasi di mana ini tidak akan - f / e, ketika /etc/profile.dbukan ~/.bashrcrelevan.
Charles Duffy
Hardcoding sulit dibawa-bawa, terutama di lingkungan OS / versi campuran; seperti untuk menggunakan file konfigurasi / sumber daya interaktif vs file sumber daya / konfigurasi yang dibuat secara khusus ... itu lebih merupakan masalah pilihan pribadi berdasarkan pada pengembang yang menulis / memelihara lingkungan; Saya tidak punya / nol masalah selama 20 tahun terakhir ... dalam lingkungan produksi ... menggunakan file sumber daya / konfigurasi bersama di seluruh skrip env, ymmv
markp-fuso
1
Mengotori dalam file interaktif pengguna juga tidak portabel (terutama mengingat bagaimana distro menyeimbangkan kembali konten mana yang dilakukan oleh file mana - beberapa melakukan hal-hal dengan cara tradisional dan menggunakan .profile, beberapa menggunakan .bash_profile, beberapa menggunakan /etc/profile.d, beberapa pengaturan variabel lingkungan dari PAM, dll) . Dengan satu atau lain cara, Anda melakukan sesuatu yang tidak dapat diangkut. Setidaknya hardcoding PATH=$PATH:/whatever/specific/locationadalah mengubah ke pengaturan, dan perilakunya jelas bagi pembaca (yang tidak perlu khawatir tentang apakah itu akan berubah nanti).
Charles Duffy