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.sh
la 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/profile
script en susms.sh
script 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
Synology
tan 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/.bashrc
script (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 quejava
el script se ejecute sin problemas.El
Synology
error 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
Synology
que 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 :
root
con el nombre del inicio de sesión con el que se ejecutará el script (en lasSynology
imágenes de ejemplo parece que ha elegido alroot
usuario, por lo tanto, mis referencias de ejemplo~root
)~root/.bashrc
con la ruta al perfil del usuario para precargar las variables de entorno necesarias para permitir que el script encuentrejava
fuente
.bashrc
no cambia la forma en que operan los demonios, ¿verdad?) Sino que pueden causar rotura de producción./etc/profile.d
lugar de~/.bashrc
ser 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/location
está modificando la configuración, y su comportamiento es obvio para los lectores (que no necesitan preocuparse por si cambiará más adelante).