У меня есть скрипт bash, единственной задачей которого является выполнение файла JAR.
sms.sh
java -jar /volume1/homes/jar/smssender.jar
Используя NAS-устройство Synology, я поставил задачу.
Добавление команды для выполнения скрипта bash. Добавление вывода журнала.
Выполнение моего нового задания.
Проверяя журнал, чтобы увидеть следующую ошибку:
/volume1/homes/jar/sms.sh: строка 1: java: команда не найдена
Проверка версии / установки Java:
Проверка выполнения скрипта sh вручную (работает):
Кто-нибудь с таким же странным случаем? Есть обходные пути / идеи?
Я старался
- Перезагрузка моего NAS
- Удалить / установить пакет Java8
но никто не работал.
/whatever/path/to/java/is/java /volume1/homes/jar
(это не относится к синологии)Ответы:
Когда планировщик задач Synology выполняет сценарий,
sms.sh
параметр PATH берется из сценария/etc/crontab
. Который не содержит путь Java.Среда оболочки входа по умолчанию определяется как int
/etc/profile
. В конце есть раздел для добавления пути Java.Как уже указывалось в уже предоставленных комментариях, поиск сценария профиля, предназначенного для интерактивной оболочки, не предлагается. Вы можете имитировать поведение
/etc/profile
скрипта в вашемsms.sh
скрипте, чтобы установить CLASSPATH PATH JAVA_HOME LANG.Поднятые вопросы о жестком кодировании пути в вашем скрипте и результирующей уменьшенной переносимости могут иметь любовный приоритет в этом конкретном случае.
источник
Я не знаком с
Synology
таким fwiw ...Сценарий оболочки работает при выполнении в командной строке, потому что конкретный сеанс входа в систему уже загрузил набор переменных среды (например, при входе в
.profile/.bashrc
сценарий (ы) в домашнем каталоге получены источники и загружены различные специфичные для Java переменные среды) -PATH, JAVA_HOME, CLASSPATH
и т. д.), позволяющиеjava
запускать скрипт без проблем.Synology
Ошибка невыполненного задания указывает на то, что специфичные для Java переменные среды не были загружены, и, следовательно, задание / сценарий не удается найтиjava
.Предполагая,
Synology
что не имеет параметра / флага конфигурации, который предусматривает предварительную загрузку профиля входа в систему, «простым» решением было бы отредактировать скрипт (sms.sh
) и получить исходный файл соответствующего ресурса перед выполнением каких-либо операций (например, вызоваjava
). Простой пример:ЗАМЕЧАНИЯ :
root
имя логина, под которым должен запускаться скрипт (в примерахSynology
изображений, кажется, вы выбралиroot
пользователя, отсюда и мои примеры~root
)~root/.bashrc
путь к профилю пользователя, чтобы предварительно загрузить переменные среды, необходимые сценарию для поискаjava
источник
.bashrc
это не меняет работу демонов, верно?), Но вместо этого может вызвать поломка производства./etc/profile.d
а не~/.bashrc
уместно..profile
, некоторые используют.bash_profile
, некоторые используют/etc/profile.d
, некоторые задают переменные среды из PAM и т. Д.) , Так или иначе, вы делаете что-то непереносимое. По крайней мере , жестко прописыватьPATH=$PATH:/whatever/specific/location
является внесение изменений в настройки, и его поведение очевидно для читателей (которые не нужно беспокоиться о том, будет ли это изменить позже).