Tengo un script bash cuya única tarea es ejecutar un archivo jar.
sms.sh
java -jar /volume1/homes/jar/smssender.jar
Con mi Synology NAS configuré una tarea.
Agregar el comando para ejecutar el script bash. Agregar salida de registro.
Ejecutando mi nueva tarea.
Verificando el registro para ver el siguiente error:
/volume1/homes/jar/sms.sh: línea 1: java: comando no encontrado
Comprobación de la versión / instalación de Java:
Comprobación de la ejecución del script sh manualmente (en funcionamiento):
¿Alguien con este mismo caso extraño? ¿Alguna solución / ideas?
Lo intenté
- Reiniciar mi NAS
- Desinstalar / instalar el paquete Java8
Pero ninguno funcionó.






/whatever/path/to/java/is/java /volume1/homes/jar(esto no es específico de la sinología)Respuestas:
Cuando el planificador de tareas de Synology ejecuta el script,
sms.shla configuración de la RUTA se toma del script/etc/crontab. Que no contiene la ruta de Java.El entorno de shell de inicio de sesión predeterminado se define int
/etc/profile. Al final hay una sección para agregar la ruta de Java.Como ya se indicó en los comentarios ya dados, no se sugiere una secuencia de comandos de perfil destinada a un shell interactivo. Puede imitar el comportamiento del
/etc/profilescript en susms.shscript para establecer CLASSPATH PATH JAVA_HOME LANG.Los puntos planteados sobre la codificación de la ruta en su secuencia de comandos y la portabilidad reducida resultante podrían tener una precedencia amante en este caso específico.
fuente
No estoy familiarizado con
Synologytan fwiw ...El script de shell funciona cuando se ejecuta en la línea de comando porque la sesión de inicio de sesión particular ya ha cargado un conjunto de variables de entorno (por ejemplo, al iniciar sesión en el
.profile/.bashrcscript (s) en el directorio de inicio se obtiene y se cargan las diversas variables de entorno específicas de Java -PATH, JAVA_HOME, CLASSPATH, etc.) que permiten quejavael script se ejecute sin problemas.El
Synologyerror de trabajo fallido indica que las variables de entorno específicas de Java no se han cargado y, por lo tanto, el trabajo / script no se puede localizarjava.Suponiendo
Synologyque no tiene una configuración / indicador de configuración que estipule la carga previa del perfil de inicio de sesión, la solución 'fácil' sería editar el script (sms.sh) y hacer que obtenga el archivo de recursos apropiado antes de realizar cualquier operación (por ejemplo, llamarjava). Un simple ejemplo:NOTAS :
rootcon el nombre del inicio de sesión con el que se ejecutará el script (en lasSynologyimágenes de ejemplo parece que ha elegido alrootusuario, por lo tanto, mis referencias de ejemplo~root)~root/.bashrccon la ruta al perfil del usuario para precargar las variables de entorno necesarias para permitir que el script encuentrejavafuente
.bashrcno cambia la forma en que operan los demonios, ¿verdad?) Sino que pueden causar rotura de producción./etc/profile.dlugar de~/.bashrcser relevante..profile, otros usan.bash_profile, algunos usan/etc/profile.d, algunas configuran variables de entorno de PAM, etc.) . De una forma u otra, estás haciendo algo no portátil. Al menos el hardcodingPATH=$PATH:/whatever/specific/locationestá modificando la configuración, y su comportamiento es obvio para los lectores (que no necesitan preocuparse por si cambiará más adelante).