Планувальник Synology .sh java не знайдено


9

У мене є bash-скрипт, єдине завдання - виконати файл jar.

sms.sh

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

За допомогою моєї Synology NAS я створив завдання.

Налаштування завдань запускається під корінь

Додавання команди для виконання скрипту bash. Додавання вихідного журналу.

введіть тут опис зображення

Виконання мого нового завдання.

введіть тут опис зображення

Перевірка журналу, щоб побачити таку помилку:

/volume1/homes/jar/sms.sh: рядок 1: java: команда не знайдена

Перевірка версії / установки Java:

введіть тут опис зображення

Перевірка виконання скрипту sh вручну (робочий):

введіть тут опис зображення

Хтось із цим самим дивним випадком? Будь-які обходи / ідеї?

я намагався

  • Перезавантаження мого NAS
  • Видаліть / встановіть пакет Java8

але жоден не працював.


4
Зважаючи на вашу проблему, ймовірно, проблема з env (JAVA_HOME, PATH) неправильно встановлена ​​під час виконання завдання. Вам слід використовувати абсолютний шлях до виконуваного файлу Java, або джерело файлу, який робить це для вас.
NoDataFound

@NoDataFound Що ви маєте на увазі під абсолютним шляхом? Isnt /volume1/(...)/file.jar шлях? Дякую за допомогу та час
piguy

3
Спочатку знайдіть виконуваний файл Java. Потім виклик його за допомогою /whatever/path/to/java/is/java /volume1/homes/jar(це не стосується синології)
NoDataFound

1
Ми, мабуть, слід додати тут, що будь-який користувач виконує команду, зрештою, це, мабуть, не той користувач, з яким входить ОП (якщо він не впевнений, що це так), а отже, має інший PATH.
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

Як уже було сказано у вже наданих коментарях, не пропонується сценарій профілю, який призначений для інтерактивної оболонки. Ви можете імітувати поведінку /etc/profileсценарію у своєму sms.shсценарії, щоб встановити CLASSPATH PATH JAVA_HOME LANG.

Підняті точки щодо жорсткого кодування шляху у вашому сценарії та зменшення переносимості, що виникає в результаті, можуть мати перевагу для коханця в цьому конкретному випадку.


Ваша відповідь мені дуже допомогла і є правильною, але я пропустив клацання по телефону і дав користувачеві 100 балів нижче. Мені дуже шкода
piguy

@piguy Це в прямому ефірі. ;-)
SubOptimal

-1

Я не знайомий з Synologyтакою вигадкою ...

Сценарій оболонки працює, коли виконується в командному рядку, оскільки конкретний сеанс входу вже завантажив набір змінних оточуючих середовищ (наприклад, після входу в .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це не змінює поводження демонів, правда?), Але може натомість викликати обрив виробництва.
Чарльз Даффі

1
Набагато краще знайти реальне місце розташування та просто ввести жорсткий код відповідного оновлення PATH у самому сценарії або у спеціальному файлі конфігурації джерел сценарію. Це також працює в ситуаціях, коли це не буде - f / e, коли, /etc/profile.dа не ~/.bashrcдоречно.
Чарльз Даффі

жорстке кодування навряд чи є портативним, особливо в змішаних ОС / версіях; що стосується використання інтерактивних файлів конфігурацій / ресурсів проти спеціально вбудованих файлів ресурсів / конфігурацій ... це більше питання особистого вибору, заснованого на написанні / підтримці середовища розробника. Протягом останніх 20 років у мене не було проблем з нулем ... у виробничих умовах ... використовуючи загальний ресурсний / конфігураційний файл у цілому сценарії env, ymmv
markp-fuso

1
Розміщення в інтерактивних файлах користувача також не є портативним (особливо з урахуванням того, як дистрибутивує дистрибутив, який вміст виконується за допомогою яких файлів - деякі роблять речі традиційним способом і використовують .profile, деякі використовують .bash_profile, деякі використовують/etc/profile.d , деякі налаштування змінних середовища з PAM тощо) . Так чи інакше, ти робиш щось непредставимое. Принаймні жорстке кодування PATH=$PATH:/whatever/specific/locationє внесення змін до настройки, і його поведінка очевидно для читачів (які не потрібно турбуватися про те, чи буде це змінити пізніше).
Чарльз Даффі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.