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

StackOverflow https://stackoverflow.com/questions/1628204

  •  06-07-2019
  •  | 
  •  

Вопрос

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

ssh -x $username@$node 'rm -rf statuslist
                        mkdir statuslist
                        chmod u+x ~/monitor/concat.sh
                        chmod u+x ~/monitor/script.sh
                        nohup ./monitor/concat.sh &
                        exit;'
Это было полезно?

Решение

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

например:Сценарий, работающий на ящике, который при выполнении

  1. берет модель и копирует ее на удаленный сервер
  2. создает сценарий для запуска моделирования с моделью и отправляет его на сервер
  3. запускает скрипт на сервере и отключается
  4. Обязанность запущенного таким образом сценария — запустить симуляцию на сервере и после завершения (на выполнение уйдут несколько дней) скопировать результаты обратно клиенту.

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

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

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

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/recementable"'

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

Другие советы

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

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

ssh -t $username@$node screen -dm -S testing ./monitor/concat.sh

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

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

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

screen -r testing

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

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

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

screen -dmS name sh my-script.sh

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

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

#!/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 user@server "/usr/local/bin/screen -x $theScreenSessionName -p $theTabNumber -X stuff \" 
$theStuff
\""

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

Обратите внимание на пробелы после -X материал \ " это посылается, чтобы преодолеть сбой опции вещи. Пробел и $ theStuff в следующей строке добавляются клавишами Enter (^ M). НЕ ПРОПУСТИТЕ ЭМ!

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top