找不到 Synology Scheduler .sh java 命令
Synology Scheduler .sh java command not found
我有一个 bash 脚本,唯一的任务就是执行一个 jar 文件。
sms.sh
java -jar /volume1/homes/jar/smssender.jar
我使用我的 Synology NAS 设置了一个任务。
添加执行bash脚本的命令。添加日志输出。
正在执行我的新任务。
查看日志发现如下错误:
/volume1/homes/jar/sms.sh: line 1: java: command not found
正在检查 Java version/installation:
手动检查 sh 脚本的执行(工作):
有人遇到过同样的奇怪情况吗?有 workarounds/ideas 吗?
我试过了
- 正在重启我的 NAS
- 卸载/安装Java8个包
但 none 有效。
我不熟悉 Synology
所以 fwiw ...
shell 脚本在命令行执行时有效,因为特定的登录会话已经加载了一组环境变量(例如,在登录 .profile/.bashrc
脚本时获取主目录并加载各种 java 特定的环境变量 - PATH, JAVA_HOME, CLASSPATH
等)允许 java
和脚本 运行 没有问题。
失败的 Synology
作业错误表明尚未加载 java-特定环境变量,因此 job/script 无法定位 java
。
假设 Synology
没有规定预加载登录配置文件的配置 setting/flag,'easy' 解决方案是编辑脚本 (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
所需的环境变量
当 Synology 任务计划程序执行脚本 sms.sh
时,PATH 设置取自脚本 /etc/crontab
。其中不包含 Java 路径。
默认登录 shell 环境定义为 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
正如已经给出的评论中所述,不建议采购用于交互式 shell 的配置文件脚本。您可以在 sms.sh
脚本中模仿 /etc/profile
脚本的行为来设置 CLASSPATH PATH JAVA_HOME LANG.
关于在脚本中对路径进行硬编码以及由此导致的可移植性降低的问题在这种特定情况下可能具有优先权。
我有一个 bash 脚本,唯一的任务就是执行一个 jar 文件。
sms.sh
java -jar /volume1/homes/jar/smssender.jar
我使用我的 Synology NAS 设置了一个任务。
添加执行bash脚本的命令。添加日志输出。
正在执行我的新任务。
查看日志发现如下错误:
/volume1/homes/jar/sms.sh: line 1: java: command not found
正在检查 Java version/installation:
手动检查 sh 脚本的执行(工作):
有人遇到过同样的奇怪情况吗?有 workarounds/ideas 吗?
我试过了
- 正在重启我的 NAS
- 卸载/安装Java8个包
但 none 有效。
我不熟悉 Synology
所以 fwiw ...
shell 脚本在命令行执行时有效,因为特定的登录会话已经加载了一组环境变量(例如,在登录 .profile/.bashrc
脚本时获取主目录并加载各种 java 特定的环境变量 - PATH, JAVA_HOME, CLASSPATH
等)允许 java
和脚本 运行 没有问题。
失败的 Synology
作业错误表明尚未加载 java-特定环境变量,因此 job/script 无法定位 java
。
假设 Synology
没有规定预加载登录配置文件的配置 setting/flag,'easy' 解决方案是编辑脚本 (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
所需的环境变量
当 Synology 任务计划程序执行脚本 sms.sh
时,PATH 设置取自脚本 /etc/crontab
。其中不包含 Java 路径。
默认登录 shell 环境定义为 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
正如已经给出的评论中所述,不建议采购用于交互式 shell 的配置文件脚本。您可以在 sms.sh
脚本中模仿 /etc/profile
脚本的行为来设置 CLASSPATH PATH JAVA_HOME LANG.
关于在脚本中对路径进行硬编码以及由此导致的可移植性降低的问题在这种特定情况下可能具有优先权。