Synology Scheduler .sh java 명령을 찾을 수 없습니다


9

나는 bash 스크립트를 가지고 있는데 단지 유일한 작업은 jar 파일을 실행하는 것입니다.

sms.sh

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

Synology NAS를 사용하여 작업을 설정했습니다.

루트로 실행되는 작업 설정

bash 스크립트를 실행하기위한 명령 추가 로그 출력 추가

여기에 이미지 설명을 입력하십시오

새 작업을 실행 중입니다.

여기에 이미지 설명을 입력하십시오

로그를 확인하여 다음 오류를 확인하십시오.

/volume1/homes/jar/sms.sh : line 1 : java : 명령을 찾을 수 없음

Java 버전 / 설치 확인 :

여기에 이미지 설명을 입력하십시오

sh 스크립트의 수동 실행 확인 (작동 중) :

여기에 이미지 설명을 입력하십시오

이 이상한 사건을 가진 사람이 있습니까? 해결 방법 / 아이디어?

나는 시도했다

  • 내 NAS 재부팅
  • Java8 패키지 제거 / 설치

그러나 아무도 효과가 없었습니다.


4
문제가 발생하면 작업이 실행될 때 env (JAVA_HOME, PATH)가 올바르게 설정되지 않은 문제 일 수 있습니다. Java 실행 파일의 절대 경로를 사용하거나 파일을 소스로 지정해야합니다.
NoDataFound

@NoDataFound 절대 경로 란 무엇입니까? /volume1/(...)/file.jar이 경로가 아닙니까? 도움과 시간을 주셔서 감사합니다
piguy

3
먼저 자바 실행 파일을 찾으십시오. 다음을 사용하여 호출하십시오 /whatever/path/to/java/is/java /volume1/homes/jar(
동시 학에 국한

1
우리는 아마도 명령을 실행하는 모든 사용자가 결국 OP가 로그인 한 사용자가 아니며 (그렇지 않은 경우) 다른 경로를 가지고 있음을 여기에 추가해야합니다.
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

이미 언급 한 바와 같이 대화식 쉘을위한 프로파일 스크립트를 소싱하는 것은 권장되지 않습니다. CLASSPATH PATH JAVA_HOME LANG를 설정 /etc/profile하기 위해 스크립트에서 스크립트 의 동작을 모방 할 수 있습니다 sms.sh.

스크립트에서 경로를 하드 코딩하고 이식성이 줄어든 점이이 특정 경우에 우선 순위가 높습니다.


귀하의 답변이 많은 도움이되었고 정확했지만 전화를 클릭하지 못하고 사용자에게 100 포인트를 줄였습니다. 정말 죄송합니다
piguy

@piguy 라이브입니다. ;-)
SubOptimal

-1

나는 Synology너무 fwiw에 익숙하지 않습니다 ...

쉘 스크립트는 특정 로그인 세션에 이미 환경 변수 세트가로드되어 있기 때문에 명령 행에서 실행될 때 작동합니다 (예 : .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 / 전자, /etc/profile.d대신 ~/.bashrc관련이있다.
Charles Duffy

하드 코딩은 특히 혼합 OS / 버전 환경에서 휴대하기가 어렵습니다. 대화 형 구성 / 자원 파일과 특수하게 구축 된 자원 / 구성 파일을 사용하는 것과 관련하여 ... 개발자 (들)가 환경을 작성 / 유지 관리하는 것에 따라 개인적인 선택 문제가 더 있습니다. 지난 20 년 동안 ... 프로덕션 환경에서 ... 전체 스크립팅 환경 인 ymmv
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.