Estoy usando Java para ejecutar un simple script bash en un equipo Linux remoto.
La escritura del golpe llamado "shortoracle.bash" tiene este script:
#!/bin/sh
runsql() {
i="$1"
end=$((SECONDS+360))
SECONDS=0
while (( SECONDS < end )); do
echo "INSERT into table_$i (col1) values (CURRENT_TIMESTAMP);" | sqlplus username/password
sleep 1
done
}
for i in $(seq 1 10); do
echo "DROP TABLE table_$i;" | sqlplus username/password
echo "CREATE TABLE table_$i (col1 TIMESTAMP WITH TIME ZONE);" | sqlplus username/password
runsql $i &
done
wait
En pocas palabras: crear una conexión en paralelo 10 que ejecutar consultas durante 360 segundos.
Desde mi programa Java que ejecute el siguiente comando:
sshconnection.execute("nohup su - oracle -c './shortoracle.bash'",2000);
El ssh ejecuta el script con éxito.
Quiero, después de un tiempo de espera de 2 segundos (el segundo parámetro) para terminar la conexión ssh, pero para el script continúe funcionando correctamente en el fondo (por lo tanto el nohup, o eso creía yo), que no está sucediendo:
Después de 2 segundos cuando terminar el sshconnection, el programa bash simplemente deja de funcionar:
Sólo 3 de las 10 conexiones están abiertas.
No hay más insertos sucediendo.
Si me dan la conexión de un tiempo de espera más largo, todo va bien, pero yo no quiero que colgará en esta conexión específica, lo que necesito para seguir adelante con el programa.
¿Qué estoy haciendo mal aquí?
Usted debe agregar &
después de su mando, es decir,
sshconnection.execute("nohup su - oracle -c './shortoracle.bash' &",2000);
Desde nohup sí de lo contrario se desconecte cuando se cierra la conexión SSH. Con &
ejecuta 'nohup' en sí en el fondo y, por tanto, permitir que continúe funcionando después de cerrar la conexión SSH.
¡Espero que esto te ayude!