Как запустить команду в фоновом режиме с помощью 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;'
Ответы
Ответ 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 действительно выполняются внутри указанного экрана/вкладки.