Không tìm thấy lệnh Synology .sh java


9

Tôi có một tập lệnh bash chỉ có nhiệm vụ là thực thi một tệp jar.

tin nhắn

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

Sử dụng NAS Synology của tôi, tôi thiết lập một nhiệm vụ.

Cài đặt tác vụ chạy bằng root

Thêm lệnh để thực thi tập lệnh bash. Thêm đầu ra đăng nhập.

nhập mô tả hình ảnh ở đây

Thực hiện nhiệm vụ mới của tôi.

nhập mô tả hình ảnh ở đây

Kiểm tra nhật ký để xem lỗi sau:

/volume1/homes/jar/sms.sh: dòng 1: java: không tìm thấy lệnh

Kiểm tra phiên bản / cài đặt Java:

nhập mô tả hình ảnh ở đây

Kiểm tra thực thi tập lệnh sh bằng tay (làm việc):

nhập mô tả hình ảnh ở đây

Bất cứ ai có trường hợp kỳ lạ tương tự? Bất kỳ cách giải quyết / ý tưởng?

Tôi đã thử

  • Khởi động lại NAS của tôi
  • Gỡ cài đặt / cài đặt gói Java8

nhưng không ai làm việc


4
Với vấn đề của bạn, có lẽ đó là một vấn đề với env (JAVA_HOME, PATH) không được đặt chính xác khi công việc được thực thi. Bạn nên sử dụng đường dẫn tuyệt đối để thực thi java, hoặc là nguồn một tệp làm điều đó cho bạn.
NoDataFound

@NoDataFound Ý bạn là gì với đường dẫn tuyệt đối? Có phải /volume1/(...)/file.jar là đường dẫn không? Cảm ơn bạn đã giúp đỡ và thời gian
piguy

3
Đầu tiên, tìm java thực thi. Sau đó, gọi nó bằng cách sử dụng /whatever/path/to/java/is/java /volume1/homes/jar(điều này không đặc trưng cho từ đồng nghĩa)
NoDataFound

1
Có lẽ chúng ta nên thêm vào đây rằng bất cứ người dùng nào đang chạy lệnh cuối cùng có lẽ không phải là người dùng mà OP đang đăng nhập (trừ khi anh ta chắc chắn là như vậy), và do đó có một PATH khác.
BadZen

(Ngoài ra: đây có thực sự là chủ đề không?)
BadZen

Câu trả lời:


5

Khi bộ lập lịch tác vụ Synology thực thi tập lệnh sms.sh, cài đặt PATH được lấy từ tập lệnh/etc/crontab . Mà không chứa đường dẫn Java.

Môi trường shell đăng nhập mặc định được định nghĩa int /etc/profile. Cuối cùng, có một phần để thêm đường dẫn 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

Như đã nêu trong các bình luận đã được cung cấp, cung cấp một kịch bản hồ sơ có nghĩa là một vỏ tương tác không được đề xuất. Bạn có thể bắt chước hành vi của /etc/profiletập lệnh trong sms.shtập lệnh của mình để đặt CLASSPATH PATH JAVA_HOME LANG.

Các điểm nêu lên về việc mã hóa đường dẫn trong tập lệnh của bạn và kết quả giảm tính di động có thể có quyền ưu tiên người yêu trong trường hợp cụ thể này.


Câu trả lời của bạn đã giúp tôi rất nhiều và đúng nhưng tôi đã bỏ lỡ trên điện thoại của mình và cho 100 điểm cho người dùng. Tôi thực sự xin lỗi
piguy

@piguy Đó là sống. ;-)
Tối thiểu

-1

Tôi không quen thuộc Synologylắm nên ...

Tập lệnh shell hoạt động khi được thực thi tại dòng lệnh vì phiên đăng nhập cụ thể đã tải một tập hợp các biến môi trường (ví dụ: khi đăng nhập .profile/.bashrc(các) tập lệnh trong thư mục chính có nguồn gốc và các biến môi trường dành riêng cho java khác nhau được tải - PATH, JAVA_HOME, CLASSPATH, v.v.) cho phép javavà tập lệnh chạy mà không gặp sự cố.

SynologyLỗi công việc không thành công chỉ ra rằng các biến môi trường dành riêng cho java chưa được tải và do đó, công việc / tập lệnh không thể xác định được java.

Giả sử Synologykhông có cài đặt / cờ cấu hình quy định để tải trước hồ sơ đăng nhập, giải pháp 'dễ dàng' sẽ là chỉnh sửa tập lệnh ( sms.sh) và lấy nguồn tài nguyên phù hợp trước khi thực hiện bất kỳ thao tác nào (ví dụ: gọi điện java). Một ví dụ đơn giản:

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

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

java ...

GHI CHÚ :

  • thay thế rootbằng tên đăng nhập theo đó tập lệnh sẽ được chạy (trong các Synologyhình ảnh ví dụ xuất hiện bạn đã chọn rootngười dùng do đó tham chiếu ví dụ của tôi~root )
  • thay thế ~root/.bashrcbằng đường dẫn đến hồ sơ người dùng để tải trước các biến môi trường cần thiết để cho phép tập lệnh tìmjava

Vui lòng không khuyến khích các tệp cấu hình được viết để sử dụng tương tác được sử dụng trong bối cảnh không tương tác - nó dẫn đến tình huống mọi người nghĩ rằng các thay đổi họ đang thực hiện là vô hại (vì .bashrckhông thay đổi cách hoạt động của daemon, phải không?) sản xuất vỡ.
Charles Duffy

1
Tốt hơn nhiều để tìm vị trí thực và chỉ cần mã hóa một bản cập nhật PATH thích hợp trong chính tập lệnh hoặc trong tệp cấu hình dành riêng cho mục đích của các tập lệnh. Điều đó cũng hoạt động trong các tình huống mà điều này sẽ không - f / e, khi /etc/profile.dchứ không phải ~/.bashrclà có liên quan.
Charles Duffy

mã hóa cứng hầu như không di động, đặc biệt là trong môi trường hệ điều hành / phiên bản hỗn hợp; đối với việc sử dụng các tệp cấu hình / tài nguyên tương tác so với các tệp tài nguyên / cấu hình được xây dựng đặc biệt ... đó là vấn đề lựa chọn cá nhân dựa trên việc viết / duy trì môi trường của nhà phát triển; Tôi đã không có vấn đề / không trong 20 năm qua ... trong môi trường sản xuất ... sử dụng tệp tài nguyên / cấu hình chung trên toàn bộ tập lệnh env, ymmv
-fuso

1
Việc chấm điểm trong các tệp tương tác của người dùng cũng không khả dụng (đặc biệt là cách phân phối lại nội dung được thực hiện bởi các tệp nào - một số thực hiện theo cách truyền thống và sử dụng .profile, một số sử dụng .bash_profile, một số sử dụng /etc/profile.d, một số biến môi trường từ PAM, v.v.) . Bằng cách này hay cách khác, bạn đang làm một cái gì đó không thể truy cập được. Ít nhất mã hóa cứng PATH=$PATH:/whatever/specific/locationđang sửa đổi cài đặt và hành vi của nó là rõ ràng đối với độc giả (những người không cần phải lo lắng về việc liệu nó sẽ thay đổi sau này).
Charles Duffy
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.