Я написал сценарий, который использую для отправки и развертывания новой службы на нескольких машинах, находящихся под моим контролем, и для выполнения процесса я использую ssh для удаленного запуска процесса.
К сожалению, всякий раз, когда я использую SSH для запуска процесса, кажется, что команда SSH никогда не возвращается, что приводит к зависанию сценария.
Команда указывается как:
ssh $user@$host "/root/command &"
Всякий раз, когда я запускаю простые команды, такие как ps или who, команда SSH немедленно возвращается, однако, когда я пытаюсь запустить свой процесс, она не возвращается.
Я пробовал трюки, такие как упаковка моего процесса в простой сценарий bash, который запускает процесс, а затем завершает работу, однако это также приводит к зависанию команды SSH (даже если сценарий bash отображает сообщение об успешном завершении и завершается нормально).
Есть ли у кого-нибудь представление о том, что вызывает такое поведение, и как я могу вернуть команду SSH, как только процесс будет запущен?
SSH соединяет stdin, stdout и stderr удаленной оболочки с вашим локальным терминалом, поэтому вы можете взаимодействовать с командой, выполняемой на удаленной стороне.
В качестве побочного эффекта он будет продолжать работать до тех пор, пока эти соединения не будут закрыты, что происходит только тогда, когда удаленная команда и все ее дочерние элементы (!) Завершены (потому что дочерние элементы, которые начинается с символа "&", наследуют std * от своих родительский процесс и оставьте его открытым).
Итак, вам нужно использовать что-то вроде
ssh user@host "/script/to/run < /dev/null > /tmp/mylogfile 2>&1 &"
<,> И 2> & 1 перенаправляют stdin / stdout / stderr с вашего терминала. Затем "&" переводит ваш скрипт в фоновый режим. При производстве вы, конечно, перенаправите stdin / err в подходящий файл журнала.
Видеть
http://osdir.com/ml/network.openssh.general/2006-05/msg00017.html
Редактировать:
Только что узнал, что < /dev/null
выше не требуется (но перенаправление stdout / err является). Понятия не имею, почему ...
Вы могли бы попробовать нету. Man nohup для получения более подробной информации.
ssh host "nohup script &"
Если вы хотите сохранить вывод на удаленном компьютере, вот вариант.
ssh user@host 'export REMOTE=myname; nice nohup ./my-restart >
logfile.log 2>&1 &'
Другой альтернативой было бы запустить отдельный screen(1)
, что-то вроде:
ssh -l user host "screen -d -m mycommand"
Это запустит отдельный экран (который фиксирует все взаимодействие внутри него), а затем немедленно вернется, завершив сеанс ssh.
Проявив немного больше изобретательности, вы можете таким образом решить довольно сложные вызовы удаленных команд.
-f Requests ssh to go to background just before command execution.
This is useful if ssh is going to ask for passwords or
passphrases, but the user wants it in the background. This
implies -n. The recommended way to start X11 programs at a
remote site is with something like ssh -f host xterm.
If the ExitOnForwardFailure configuration option is set to “yes”,
then a client started with -f will wait for all remote port for‐
wards to be successfully established before placing itself in the
background.
Я думаю, что правильный путь был бы
ssh user@host exec script.sh &