Nie znaleziono komendy Synology Scheduler .sh java

9

Mam skrypt bash, którego jedynym zadaniem jest wykonanie pliku jar.

sms.sh

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

Za pomocą serwera Synology NAS skonfigurowałem zadanie.

Konfiguracja zadania uruchamiana przez root

Dodanie polecenia do wykonania skryptu bash. Dodawanie danych wyjściowych dziennika.

wprowadź opis zdjęcia tutaj

Wykonuję moje nowe zadanie.

wprowadź opis zdjęcia tutaj

Sprawdzanie dziennika, aby zobaczyć następujący błąd:

/volume1/homes/jar/sms.sh: linia 1: java: nie znaleziono polecenia

Sprawdzanie wersji / instalacji Java:

wprowadź opis zdjęcia tutaj

Ręczne sprawdzanie wykonania skryptu sh (działającego):

wprowadź opis zdjęcia tutaj

Ktoś z tą samą dziwną sprawą? Wszelkie obejścia / pomysły?

próbowałem

  • Ponowne uruchamianie mojego serwera NAS
  • Odinstaluj / zainstaluj pakiet Java8

ale żaden nie działał.

piguy
źródło
4
Biorąc pod uwagę twój problem, prawdopodobnie jest to problem z env (JAVA_HOME, PATH) niepoprawnie ustawionym podczas wykonywania zadania. Powinieneś albo użyć bezwzględnej ścieżki do pliku wykonywalnego Java, albo źródłowy plik, który to robi.
NoDataFound
@NoDataFound Co masz na myśli ze ścieżką bezwzględną? Czy ścieżka /volume1/(...)/file.jar nie jest ścieżką? Dziękujemy za pomoc i czas
piguy
3
Najpierw znajdź plik wykonywalny Java. Następnie /whatever/path/to/java/is/java /volume1/homes/jarwywołaj go za pomocą (nie jest to specyficzne dla synologii)
NoDataFound
1
Powinniśmy prawdopodobnie dodać tutaj, że niezależnie od tego, który użytkownik uruchomi polecenie, prawdopodobnie nie jest to użytkownik, z którym loguje się OP (chyba że jest tego pewien), a zatem ma inną ŚCIEŻKĘ.
BadZen
(Również: czy to jest naprawdę na ten temat?)
BadZen

Odpowiedzi:

5

Gdy program planujący zadania Synology wykonuje skrypt, sms.shustawienie PATH jest pobierane ze skryptu /etc/crontab. Który nie zawiera ścieżki Java.

Domyślne środowisko powłoki logowania jest zdefiniowane jako int /etc/profile . Na końcu znajduje się sekcja umożliwiająca dodanie ścieżki 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

Jak już wspomniano w podanych wcześniej komentarzach, nie jest sugerowany skrypt profilowy przeznaczony dla powłoki interaktywnej. Możesz naśladować zachowanie/etc/profile skryptu w sms.shskrypcie, aby ustawić ścieżkę CLASSPATH PATH JAVA_HOME LANG.

Podniesione kwestie dotyczące twardego zakodowania ścieżki w skrypcie i wynikająca z tego zmniejszona przenośność mogą mieć pierwszeństwo w tym konkretnym przypadku.

SubOptimal
źródło
Twoja odpowiedź bardzo mi pomogła i jest poprawna, ale kliknąłem telefon i podałem użytkownikowi 100 punktów poniżej. Naprawdę przepraszam
piguy
@piguy To jest na żywo. ;-)
SubOptimal
-1

Nie jestem zaznajomiony z Synology tym fwiw ...

Skrypt powłoki działa po uruchomieniu w wierszu poleceń, ponieważ konkretna sesja logowania załadowała już zestaw zmiennych środowiskowych (np. Po zalogowaniu się do .profile/.bashrcskryptu (ów) w katalogu osobistym jest pobierany i ładowane są różne zmienne środowiskowe specyficzne dla java - PATH, JAVA_HOME, CLASSPATHitp.), które pozwalają javai skrypt działa bez problemu.

SynologyBłąd zadania zakończonego niepowodzeniem wskazuje, że zmienne środowiskowe specyficzne dla języka Java nie zostały załadowane i dlatego zadanie / skrypt nie może zlokalizować java.

Zakładając, Synologyże nie ma ustawienia / flagi konfiguracji, która przewiduje wstępne ładowanie profilu logowania, „łatwym” rozwiązaniem byłoby edytowanie skryptu ( sms.sh) i uzyskanie odpowiedniego pliku zasobów przed wykonaniem jakichkolwiek operacji (np. Wywołania java). Prosty przykład:

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

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

java ...

UWAGI :

  • zamień rootna nazwę logowania, pod którą skrypt ma zostać uruchomiony (w przykładowych Synologyobrazach wygląda na to, że wybrałeś rootużytkownika, stąd moje przykładowe referencje ~root)
  • zastąp ~root/.bashrcścieżką do profilu użytkownika, aby wstępnie załadować zmienne środowiskowe potrzebne do znalezienia skryptujava
markp-fuso
źródło
Proszę nie zachęcać plików konfiguracyjnych napisanych do użytku interaktywnego do używania w nieinteraktywnych kontekstach - prowadzi to do sytuacji, w których ludzie uważają, że wprowadzane przez nich zmiany są nieszkodliwe (ponieważ .bashrcnie zmienia to, w jaki sposób działają demony, prawda?), Ale zamiast tego mogą powodować przerwanie produkcji.
Charles Duffy
1
Znacznie lepiej jest znaleźć prawdziwą lokalizację i po prostu zakodować odpowiednią aktualizację PATH w samym skrypcie lub w pliku konfiguracyjnym dedykowanego źródła skryptu. Działa to również w sytuacjach, w których to nie będzie - f / e, kiedy /etc/profile.draczej niż ~/.bashrcjest to istotne.
Charles Duffy
hardcoding jest mało przenośny, szczególnie w mieszanych środowiskach OS / wersji; jeśli chodzi o używanie interaktywnych plików konfiguracji / zasobów w porównaniu ze specjalnie zbudowanymi plikami zasobów / konfiguracji ... jest to raczej kwestia osobistego wyboru w oparciu o programistów piszących / utrzymujących środowisko; W ciągu ostatnich 20 lat nie miałem problemów z zerami / zero ... w środowiskach produkcyjnych ... przy użyciu wspólnego pliku zasobów / konfiguracji w całym środowisku skryptowym, ymmv
markp-fuso
1
Wrzucanie do plików interaktywnych użytkownika również nie jest przenośne (szczególnie biorąc pod uwagę, w jaki sposób destabilizuje, która zawartość jest wykonywana przez które pliki - niektórzy robią to w tradycyjny sposób i .profileużywają .bash_profile, inni używają /etc/profile.d, inni ustawiają zmienne środowiskowe z PAM itp.) . Tak czy inaczej, robisz coś, czego nie można przenieść. Przynajmniej hardcoding PATH=$PATH:/whatever/specific/locationjest zmieniająca się do ustawień, a jego zachowanie jest oczywiste dla czytelników (którzy nie muszą się martwić o to, czy będzie to zmienić później).
Charles Duffy