Как запустить команду в фоновом режиме с помощью SSH и отсоединить сеанс - PullRequest
20 голосов
/ 27 октября 2009

В настоящее время я пытаюсь подключиться по 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;'

Ответы [ 5 ]

24 голосов
/ 17 февраля 2010

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

Например: скрипт, запущенный на блоке, который при запуске

  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 &'

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

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

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

21 голосов
/ 27 октября 2009

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

Чтобы быть более точным, попробуйте это:

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

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

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

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

screen -r testing

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

4 голосов
/ 27 октября 2009

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

0 голосов
/ 10 октября 2014

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

#!/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 действительно выполняются на упомянутом экране / вкладке.

0 голосов
/ 02 декабря 2013

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

screen -dmS name sh my-script.sh

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

...