Запустите файл bash на удаленной машине Linux с java и держите его в фоновом режиме - PullRequest
0 голосов
/ 21 ноября 2019

У меня есть сценарий оболочки на удаленной машине Linux, который содержит следующее:

#!/bin/sh
for i in $(seq 1 10);
do
   echo "CREATE TABLE ben$i (id NUMBER NOT NULL);
   ! sleep 30
   select * from ben$i;
   ! sleep 30
   DROP TABLE ben$i;" | sqlplus system/password &
done
wait

Имя этого сценария - ben.sh.

В Java, я хочу выполнитьэтот сценарий и продолжайте выполнение сценария в фоновом режиме.

У меня есть команда для успешного выполнения сценария:

sshshell.execute("su - oracle -c './ben.sh'");

Я хочу, чтобы сценарий по-прежнему выполнялся на удаленной машине Linuxи я хочу закрыть соединение ssh сразу после того, как я выполню команду выше, не вмешиваясь в сценарий.

Я подумал, если я поставлю & в конце этой команды, вот так:

sshshell.execute("su - oracle -c './ben.sh' &");

Но все же java-программа застряла и ожидает завершения сценария

Очень важное примечание: я не хочу использовать Threads ИЛИ какие-либо дополнительные ssh-соединения.

Какие у меня есть варианты?

Ответы [ 2 ]

1 голос
/ 21 ноября 2019

Итак, вы можете использовать команды Nohup или Disown. Система nohup позволит избежать сигналов выхода, распространяющихся на дочерние процессы.

nohup cmd &

Или вы можете использовать Disown для отключения от дочерних процессов.

cmd & disown
1 голос
/ 21 ноября 2019

Используйте nohup и & для запуска сценария в фоновом режиме.

sshshell.execute("nohup su - oracle -c './ben.sh' &");

Nohup - это сокращение от "No Hangups". Nohup - дополнительная командаэто говорит системе Linux не останавливать другую команду после ее запуска. Это означает, что она будет работать до тех пор, пока она не будет выполнена, даже если пользователь, запустивший ее, выйдет из системы. Синтаксис для nohup следующий:

nohup sh your-script.sh &

& в конце перемещает команду в фоновый режим, освобождая терминал, в котором вы работаете.

...