как запустить команду в фоновом режиме с помощью ssh и отключить сеанс
Вопрос
В настоящее время я пытаюсь подключиться к удаленному компьютеру по 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;'
Решение
В некоторых ситуациях вы хотите выполнить/запустить некоторые сценарии на удаленном компьютере/сервере (который автоматически завершится) и отключиться от сервера.
например:Сценарий, работающий на ящике, который при выполнении
- берет модель и копирует ее на удаленный сервер
- создает сценарий для запуска моделирования с моделью и отправляет его на сервер
- запускает скрипт на сервере и отключается
- Обязанность запущенного таким образом сценария — запустить симуляцию на сервере и после завершения (на выполнение уйдут несколько дней) скопировать результаты обратно клиенту.
Я бы использовал следующую команду:
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 действительно выполняются на упомянутом экране / вкладке.