Планировщик Synology .sh Java команда не найдена

9

У меня есть скрипт bash, единственной задачей которого является выполнение файла JAR.

sms.sh

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

Используя NAS-устройство Synology, я поставил задачу.

Настройка задач запускается пользователем root

Добавление команды для выполнения скрипта bash. Добавление вывода журнала.

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

Выполнение моего нового задания.

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

Проверяя журнал, чтобы увидеть следующую ошибку:

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

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

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

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

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

Кто-нибудь с таким же странным случаем? Есть обходные пути / идеи?

Я старался

  • Перезагрузка моего NAS
  • Удалить / установить пакет Java8

но никто не работал.

piguy
источник
4
Учитывая вашу проблему, это, вероятно, проблема с env (JAVA_HOME, PATH), неправильно установленным при выполнении задания. Вы должны либо использовать абсолютный путь к исполняемому файлу Java, либо создать исходный файл, который сделает это за вас.
NoDataFound
@NoDataFound Что вы подразумеваете под абсолютным путем? Не /volume1/(...)/file.jar путь? Спасибо за помощь и время
Пигуй
3
Сначала найдите исполняемый файл Java. Затем вызовите его, используя /whatever/path/to/java/is/java /volume1/homes/jar(это не относится к синологии)
NoDataFound
1
Вероятно, следует добавить, что любой пользователь, выполняющий команду, в конечном итоге, вероятно, не является пользователем, с которым OP входит в систему (если он не уверен, что это так), и поэтому имеет другой 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таким 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
markp-Fuso
источник
Пожалуйста, не поощряйте конфигурационные файлы, написанные для интерактивного использования, использовать в неинтерактивных контекстах - это приводит к тому, что люди думают, что сделанные ими изменения безвредны (потому что .bashrcэто не меняет работу демонов, верно?), Но вместо этого может вызвать поломка производства.
Чарльз Даффи
1
Намного лучше найти реальное местоположение и просто жестко закодировать соответствующее обновление PATH в самом скрипте или в файле конфигурации специального назначения в источниках скрипта. Это также работает в ситуациях, когда это не будет - е / е, когда, /etc/profile.dа не ~/.bashrcуместно.
Чарльз Даффи
жесткое кодирование трудно переносимо, особенно в смешанных ОС / версиях среды; что касается использования интерактивных файлов конфигурации / ресурсов по сравнению со специально созданными файлами ресурсов / конфигурации ... это скорее вопрос личного выбора, основанный на написании / поддержке разработчиками среды; У меня не было проблем с нулем / нулем в течение последних 20 лет ... в производственных средах ... с использованием общего файла ресурсов / конфигурации для всего сценария env, ymmv
markp-fuso
1
Точки в интерактивных файлах пользователя также не переносимы (особенно если учесть, как дистрибутивы перебалансируют, какой контент и какие файлы выполняются - некоторые делают вещи традиционным способом и используют .profile, некоторые используют .bash_profile, некоторые используют /etc/profile.d, некоторые задают переменные среды из PAM и т. Д.) , Так или иначе, вы делаете что-то непереносимое. По крайней мере , жестко прописывать PATH=$PATH:/whatever/specific/locationявляется внесение изменений в настройки, и его поведение очевидно для читателей (которые не нужно беспокоиться о том, будет ли это изменить позже).
Чарльз Даффи