Для проекта я использую удаленную машину для запуска двоичного файла и передачи вывода на сервер журнала через netcat.
Пример:
ssh <user>@<host> -p <port> -o IdentitiesOnly=yes -o PreferredAuthentications=publickey -i key nohup <some long running command> | nc <log_host> <log_port> &
Я хочу, чтобы соединение ssh завершалось, как только команды переходят в фоновый режим.
Процесс успешно переходит в фоновый режим (я считаю), но я не могу понять, как прервать соединение ssh.
Я тоже пробовал использовать экран, но это было после того, как я много возился с этим способом, и, честно говоря, я очень устал и очень запутался, и у меня возникли проблемы с выяснением различных проблем с ним. Я считаю, что вторая пара глаз очень важна для достижения прогресса на этом этапе.
Просто для заметки, я пробовал более простую тестовую команду, и она тоже не работает. ssh
ждет все три секунды, вместо того, чтобы разветвлять фоновую команду и немедленно завершать ее.
ssh <user>@<host> "nohup sleep 3 && echo test | tee ~/test.log & exit"
Даже с вашим вариантом более простая команда ждет, пока команда не будет завершена. Я проверил это, запустив «watch -n .5 cat test.log» на отдельном ssh-соединении, изменив время сна на 10 и добавив свой вариант. Файл не изменяется до тех пор, пока не завершится ssh-соединение.
Извините, я неправильно понял, что вы хотели. Смотрите мой ответ ниже.
Я думаю, что это проблема с ssh
, ожидающим ввода-вывода со стандартного вывода и стандартной ошибки.
Попробуйте перенаправить весь вывод на /dev/null
:
ssh user@host "(nohup sleep 3 && echo test | tee ~/test.log) >/dev/null 2>&1 &"
Вау, это работает! Не думал об этом, спасибо <3
У меня работает более простая тестовая команда! Глядя на вашу исходную команду, у меня была такая проблема с долгими выполняемыми командами, и проблема оказалась тайм-аутом соединения. Я исправил это, поставив опцию
ServerAliveInterval
дляssh
, поэтомуssh -o ServerAliveInterval=30 "command"
.