Подтвердить что ты не робот

Как запустить команду в фоновом режиме с помощью ssh и отсоединить сеанс

В настоящее время я пытаюсь выполнить ssh на удаленную машину и запускать script, а затем оставить node с запуском script. Ниже приведен мой script. Однако, когда он запускается, script успешно запускается на компьютере, но сеанс ssh зависает. В чем проблема?

ssh -x [email protected]$node 'rm -rf statuslist
                        mkdir statuslist
                        chmod u+x ~/monitor/concat.sh
                        chmod u+x ~/monitor/script.sh
                        nohup ./monitor/concat.sh &
                        exit;'
4b9b3361

Ответ 1

Есть несколько ситуаций, когда вы хотите выполнить/запустить некоторые сценарии на удаленном компьютере/сервере (который будет автоматически завершен) и отключиться от сервера.

например: A script работает на поле, которое при выполнении

  • берет модель и копирует ее на удаленный сервер
  • создает script для запуска моделирования с помощью модели и нажатия на сервер
  • запускает script на сервере и отключает
  • Обязанность script таким образом запущена - запустить симуляцию на сервере и после ее завершения (потребуется несколько дней) скопировать результаты обратно клиенту.

Я бы использовал следующую команду:

ssh remoteserver 'nohup /path/to/script `</dev/null` >nohup.out 2>&1 &'

@CKeven, вы можете поместить все эти команды на один script, направить его на удаленный сервер и начать его следующим образом:

echo '#!/bin/bash  
rm -rf statuslist  
mkdir statuslist  
chmod u+x ~/monitor/concat.sh  
chmod u+x ~/monitor/script.sh  
nohup ./monitor/concat.sh &  
' > script.sh

chmod u+x script.sh

rsync -azvp script.sh remotehost:/tmp

ssh remotehost '/tmp/script.sh `</dev/null` >nohup.out 2>&1 &'

Надеюсь, что это сработает; -)

Изменить: Вы также можете использовать ssh user @host 'screen -S SessionName -d -m "/path/to/executable" '

Создает отдельный сеанс экрана и запускает в нем целевую команду

Ответ 2

Что вы думаете об использовании screen для этого? Вы можете запустить screen через ssh, чтобы запустить команду (concat.sh), а затем вы сможете вернуться на сеанс экрана, если хотите ее контролировать (может быть удобно, в зависимости от того, что делает concat).

Чтобы быть более конкретным, попробуйте следующее:

ssh -t [email protected]$node screen -dm -S testing ./monitor/concat.sh

Вы должны найти, что приглашение немедленно возвращается, а на удаленном компьютере - concat.sh. Я объясню некоторые варианты:

  • ssh -t делает TTY. экран нуждается в этом.
  • screen -dm заставляет его запускаться в режиме "отсоединения". Это как "фон" для ваших целей. Тестирование
  • -S дает вашему сеансу сеанса имя. Это необязательно, но рекомендуется.

Теперь, как только вы это сделаете, вы можете перейти на удаленную машину и запустить ее:

screen -r testing

Это приложит вас к сеансу экрана, который содержит вашу программу. Оттуда вы можете контролировать его, убивать, видеть его выход и т.д. Ctrl-A, затем d отделит вас от сеанса экрана. screen -ls отобразит все запущенные сеансы.

Ответ 3

Это может быть стандартный поток ввода. Попробуйте ssh -n ... или ssh -f ....

Ответ 4

Для меня только это сработало:

screen -dmS name sh my-script.sh

Это, конечно, зависит от экрана и позволяет вам прикрепить позже, если вы когда-нибудь захотите stdin или stdout. Экран завершается, когда my- script.sh заканчивается.

Ответ 5

Ниже приведено гораздо более общее решение, требующее некоторых усилий для поиска, и это действительно работает для меня:

#!/usr/bin/bash
theScreenSessionName="test"
theTabNumber="1"
theStuff="date; hostname; cd /usr/local; pwd; /usr/local/bin/top"

echo "this is a test"

ssh -f [email protected] "/usr/local/bin/screen -x $theScreenSessionName -p $theTabNumber -X stuff \" 
$theStuff
\""

Он отправляет $theStuff список команд на вкладку No $theTabNumber сеанса экрана $theScreenSessionName, предварительно созданное на "сервере" от имени "пользователя".

Помните о завершающем пробеле после -X stuff\ "который отправляется для преодоления ошибки" stuff". Пробелы и $TheStuff в следующей строке добавляются клавишами 'Enter' (^ M). НЕ ПРОПУСТИТЕ EM!

В начальном терминале отображается эхо-сообщение "это тестовое сообщение", а команды $TheStuff действительно выполняются внутри указанного экрана/вкладки.