Я написал скрипт, который я использую для отправки и развертывания новой службы на нескольких машинах, находящихся под моим контролем, и для выполнения процесса я использую ssh для удаленного запуска процесса. К сожалению, всякий раз, когда я использую SSH для запуска процесса, команда SSH никогда не возвращается, в результате чего скрипт останавливается.
Команда указывается как: ssh $ user @ $ host "/ root / command &". Всякий раз, когда я запускаю простые команды, такие как ps или who, команда SSH возвращается немедленно, однако, когда я пытаюсь запустить процесс, она не возвращается. Я пробовал такие хитрости, как завершение процесса в простой сценарий bash, который запускает процесс и затем завершается, однако при этом также зависает команда SSH (даже если сценарий bash отображает сообщение об успешном завершении и завершается нормально).
Кто-нибудь знает, что вызывает такое поведение, и как я могу получить команду SSH, чтобы вернуться, как только процесс был запущен?
Спасибо за ваши идеи!
Ответы:
SSH соединяет stdin, stdout и stderr удаленной оболочки с вашим локальным терминалом, чтобы вы могли взаимодействовать с командой, которая выполняется на удаленной стороне.
Как побочный эффект, он будет продолжать работать до тех пор, пока эти соединения не будут закрыты, что происходит только тогда, когда удаленная команда и все ее дочерние элементы (!) Завершены (потому что дочерние элементы, которые запускаются символом «&», наследуют std * от своих родительский процесс и держать его открытым).
Так что вам нужно использовать что-то вроде
<,> И 2> & 1 перенаправляют stdin / stdout / stderr из вашего терминала. «&» Затем заставляет ваш скрипт перейти на задний план. В процессе производства вы, конечно, перенаправляете stdin / err в подходящий лог-файл.
Видеть
http://osdir.com/ml/network.openssh.general/2006-05/msg00017.html
Редактировать:
Только что выяснил, что
< /dev/null
выше не является необходимым (но перенаправление stdout / err есть ). Понятия не имею, почему ...источник
+1
! Работает для меня. И вы также можете распечатать вывод,ssh user@host "/script/to/run > /tmp/ssh.stdout 2>&1 && cat /tmp/ssh.stdout && rm -f /tmp/ssh.stdout"
Вы можете попробовать nohup . Man nohup для более подробной информации.
Если вы хотите сохранить вывод на удаленном компьютере, вот вариант .
источник
Другой альтернативой было бы запустить отдельный
screen(1)
, что-то вроде:Это запустит отдельный экран (который фиксирует все взаимодействия внутри него), а затем сразу же вернется, завершив сеанс ssh.
С немного большей изобретательностью вы можете решать довольно сложные удаленные вызовы команд таким образом.
источник
источник
Я думаю, что правильный путь будет
источник