J'utilise Java pour exécuter un script bash simple sur une machine Linux à distance.
Le script bash nommé "shortoracle.bash" ont ce 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 bref: créer 10 connexion parallèle exécuter des requêtes pour 360 secondes.
De mon programme java i exécutez la commande suivante:
sshconnection.execute("nohup su - oracle -c './shortoracle.bash'",2000);
Le ssh exécute avec succès le script.
Je veux, après un délai d'attente de 2 secondes (la deuxième param) de mettre fin à la connexion ssh, mais pour le script de continuer à fonctionner correctement en arrière-plan (donc le nohup, ce que je pensais), il ne se produit pas:
Au bout de 2 secondes quand je fin à la sshconnection, le programme bash arrête juste travailler:
Seulement 3 des 10 connexions sont ouvertes.
Pas plus inserts qui se passe.
Si je donne la connexion d'un délai plus long, tout va bien, mais je ne veux pas à cet égard raccrochera spécifique, je dois passer avec le programme.
Qu'est-ce que je fais mal ici?
Vous devez ajouter &
après votre commande, à savoir
sshconnection.execute("nohup su - oracle -c './shortoracle.bash' &",2000);
Depuis nohup lui - même autrement se déconnecter lorsque vous fermez la connexion SSH. Avec &
vous exécutez « nohup » lui - même en arrière - plan et donc lui permettre de continuer à fonctionner après la fermeture de la connexion SSH.
Espérons que cela vous aide!