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.
Menambahkan perintah untuk menjalankan skrip bash. Menambahkan output log.
Melaksanakan Tugas baru saya.
Memeriksa log untuk melihat kesalahan berikut:
/volume1/homes/jar/sms.sh: baris 1: java: perintah tidak ditemukan
Memeriksa versi Java / instalasi:
Memeriksa eksekusi skrip sh secara manual (berfungsi):
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.
/whatever/path/to/java/is/java /volume1/homes/jar
(ini tidak khusus untuk synology)Jawaban:
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.Seperti yang sudah dinyatakan dalam komentar yang sudah diberikan, sumber skrip profil yang dimaksudkan untuk shell interaktif tidak disarankan. Anda mungkin meniru perilaku
/etc/profile
skrip dalamsms.sh
skrip 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.
sumber
Saya tidak akrab dengan
Synology
begitu ...Script shell berfungsi ketika dieksekusi pada baris perintah karena sesi login tertentu telah memuat seperangkat variabel lingkungan (misalnya, saat masuk dalam
.profile/.bashrc
skrip di direktori home bersumber dan berbagai variabel lingkungan spesifik java dimuat -PATH, JAVA_HOME, CLASSPATH
, dll) yang memungkinkanjava
dan skrip berjalan tanpa masalah.Synology
Kesalahan pekerjaan yang gagal menunjukkan bahwa variabel lingkungan java-spesifik belum dimuat dan oleh karena itu pekerjaan / skrip tidak dapat menemukanjava
.Dengan asumsi
Synology
tidak 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, panggilanjava
). Contoh sederhana:CATATAN :
root
dengan nama login tempat skrip dijalankan (dalam contohSynology
gambar tampaknya Anda telah memilihroot
pengguna maka contoh referensi saya~root
)~root/.bashrc
dengan jalur ke profil pengguna untuk memuat variabel lingkungan yang diperlukan agar skrip dapat ditemukanjava
sumber
.bashrc
tidak mengubah cara kerja daemon, kan?) Tetapi malah dapat menyebabkan kerusakan produksi./etc/profile.d
bukan~/.bashrc
relevan..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 hardcodingPATH=$PATH:/whatever/specific/location
adalah mengubah ke pengaturan, dan perilakunya jelas bagi pembaca (yang tidak perlu khawatir tentang apakah itu akan berubah nanti).