У меня есть 2 компьютера, localpc
и remoteserver
.
Мне нужно localpc
выполнить несколько команд remoteserver
. Одна из вещей, которую нужно сделать, - запустить скрипт резервного копирования, который выполняется в течение нескольких часов. Я хотел бы, чтобы команда включала localpc
«огонь», а затем работала полностью независимо от того remoteserver
, чего localpc
никогда не было.
Это то, что я сделал до сих пор:
remoteserver
Содержит имеет скрипт:
/root/backup.sh
localpc
запланировано запустить это:
ssh root@remoteserver 'nohup /root/backup.sh' &
Я делаю это правильно? Есть лучший способ сделать это? Будут ли у меня проблемы с этим?
ssh
scripting
nohup
background-process
LVLAaron
источник
источник
Ответы:
Вы, вероятно, должны использовать
screen
на удаленном хосте реальную отдельную команду:источник
Близко, но не совсем.
Независимо от любого терминала
Вам необходимо закрыть все файловые дескрипторы, которые подключены к сокету ssh, потому что сеанс ssh не закроется, пока какой-то удаленный процесс имеет открытый сокет. Если вас не интересует вывод скрипта (предположительно, потому что сам скрипт заботится о записи в файл журнала), перенаправьте его
/dev/null
(но учтите, что это скроет ошибки, такие как невозможность запуска скрипта).Использование
nohup
здесь не имеет никакого полезного эффекта.nohup
организует, чтобы программа, с которой она работает, не получала сигнал HUP, если управляющий терминал программы исчезает, но здесь, во-первых, нет терминала, так что ничто не собирается отправлять сигнал SIGHUP процессу на ровном месте. Кроме того,nohup
перенаправляет стандартный вывод и стандартную ошибку (но не стандартный ввод) в файл, но только если они подключены к терминалу, чего, опять же, нет.Отсоединение от терминала
Используйте
nohup
для отсоединения скрипта от его управляющего терминала, чтобы он не получал SIGHUP, когда терминал исчезает.nohup
также перенаправляет стандартный вывод скрипта и стандартную ошибку в файл, который называется,nohup.out
если они подключены к терминалу; Вы должны позаботиться о стандартном вводе самостоятельно.Ведение удаленного терминала
Если вы хотите, чтобы команда работала в удаленном терминале, но не была подключена к сеансу SSH, запустите ее в терминальном мультиплексоре, таком как Screen или Tmux .
Позже вы можете снова подключиться к терминалу, на котором запущен скрипт, вызвав
screen -S backup -rd
от имени пользователя root на этом компьютере.Автоматизация одной удаленной команды
Для немного лучшей безопасности не открывайте прямые удаленные root-логины слишком широко. Создайте пару ключей специального назначения и дайте ей принудительную команду
/root/.ssh/authorized_keys
. Содержимое файла открытого ключаAAAA…== wibble@example.com
: добавить разделенный запятыми список параметров, в том числеcommand="…"
указывающий, что ключ может использоваться только для выполнения этой конкретной команды. Не забудьте сохранить параметры и ключ все в одной строке.источник
-f
опцию, чтобы получить ssh в 'background' (т.е. завершать, закрывать соединения) на локальной стороне. Это будет работать в сочетании с&
.nohup
в этом случае не является обязательным, но вы можете использоватьsetsid
вместо этого.Стандартный рецепт для запуска удаленной команды из удаленного входа, такого как SSH, следующий:
Если
command
это сценарий оболочки, который заботится о ведении журнала в сам файл, то вы можете изменить егоcommand.log
на/dev/null
. Как только вы начнете это, выйдите из системы прямо сейчас.Вам нужно все на этой линии.
nohup
говорит оболочке не беспокоить процесс, если сеанс входа в систему отключен.</dev/null
говорит, что никогда не ждать ввода>command.log
говорит ему отправлять любые сообщения в этот именованный файл журнала2>&1
говорит ему отправлять любые сообщения stderr в один и тот же файл журнала. В некоторых случаях лучше иметь два файла, второй для сбора сообщений об ошибках и первый для сбора сообщений о нормальной активности. Это может упростить проверку того, что все работает правильно.&
говорит ему отключить этот процесс и запускать его в фоновом режиме как процесс демона.источник
Эта тема была очень полезной, но мое решение должно было быть немного другим.
Мне не нравится экранное решение, потому что оно оставляет запущенный экранный процесс, который мне не нужен. Перенаправления и nohups используются следующим образом:
не работали на меня при использовании с командой ssh.
Я создал скрипт-обертку на удаленной машине, который запускает сам скрипт. Скрипт-обёртка устанавливает перенаправление и nohup. Что-то вроде этого:
Затем на моем клиентском компьютере я запускаю (не замечаю перенаправления):
Команда ssh немедленно возвращается, соединение разрывается и скрипт остается запущенным.
источник
Как говорит Нильс , это проблема безопасности, позволяющая root войти в систему через ssh. И я советую не запускать какую-либо существенную работу на машине без журнала. Если что-то пойдет не так, вам хотелось бы, чтобы у вас были сообщения об устранении неполадок. Есть и другие ответы, показывающие, как это сделать. Но вот как я рекомендую выполнить то, что вы просили. Это все встроено в sh (1). Нет необходимости для экрана GNU (хотя я думаю, что это умное решение). Добавьте эту строку в вашу команду:
>&- 2>&- <&- &
.>&-
означает закрыть стандартный вывод.2>&-
означает закрыть stderr.<&-
означает закрыть стандартный&
означает работать в фоновом режиме, напримеристочник
Вы должны включить удаленную команду в фоновом режиме
remoteserver
. То, как вы это сделаете, создаст фоновую команду sshlocalpc
.Кроме того, плохая идея разрешить root-ssh.
Так что настройте
remoteserver
: строку sudoers, которая будет запускаться/root/backup.sh
пользователем rootbackup
.Вы можете создать этого пользователя без «хорошего» пароля.
Поместите команду
sudo /root/backup.sh &
как команду в~backup/.ssh/authorized_keys
- вместе с открытым ключом отlocalpc
(кто бы ни запускал этот скрипт).источник
источник