На пути должен использовать equery
depends
функция для получения списка вещей, которые зависят от пакета.
# equery depends perl
Если Вы хотите восстановить всех их, попробуйте что-то как:
# emerge -a --oneshot `equery depends perl|awk '{print " ="$1}'`
У Вас будут проблемы со что, если Вам установят пакеты, которые были удалены из дерева перевозки, таким образом, синхронизирующее и мировое обновление заранее является хорошей идеей.
Для этого конкретного случая Вы могли бы также хотеть посмотреть на app-admin/perl-cleaner
- это имеет определенные функции для восстановления модулей жемчуга.
Необходимо, вероятно, использовать screen
на удаленном хосте, чтобы иметь реальную отдельную команду:
ssh root@remoteserver screen -d -m ./script
Близко, но не точно.
ssh root@remoteserver '/root/backup.sh </dev/null >/var/log/root-backup.log 2>&1 &'
Необходимо закрыть все дескрипторы файлов, которые подключены к сокету ssh, потому что ssh сессия не закроется, пока некоторый удаленный процесс имеет открытый сокет. Если Вы не интересуетесь выводом сценария (по-видимому, потому что сам сценарий заботится о записи в файл журнала), перенаправьте его к /dev/null
(но обратите внимание, что это скроет ошибки, такие как неспособность запустить сценарий).
Используя nohup
не имеет никакого полезного действия здесь. nohup
устраивает программу, которую это запускает для не получения Сигнала HUP, если терминал управления программы исчезает, но здесь во-первых нет никакого терминала, таким образом, ничто не собирается отправить SIGHUP в процесс внезапно. Кроме того, nohup
стандартный вывод перенаправлений и стандартная погрешность (но не стандартный вход) в файл, но только если они подключены к терминалу, который, снова, они не.
aaron@localpc$ ssh root@remoteserver
root@remoteserver# nohup /root/backup.sh </dev/null &
nohup: appending output to `nohup.out'
[1] 12345
root@remoteserver# exit
aaron@localpc$
Использовать nohup
отсоединять сценарий от его терминала управления так, чтобы это не получало SIGHUP, когда терминал исчезает. nohup
также перенаправляет стандартный вывод сценария и стандартную погрешность в названный файл nohup.out
если они подключены к терминалу; необходимо заботиться о стандарте, вводит себя.
Если Вы хотите поддерживать команду в рабочем состоянии в удаленном терминале, но не иметь присоединенный к сессии SSH, выполнить его в оконечном мультиплексоре, таком как Screen или Tmux.
ssh root@remoteserver 'screen -S backup -d -m /root/backup.sh'
Можно позже снова соединиться с терминалом, куда сценарий работает путем вызова screen -S backup -rd
как базируются на той машине.
Для немного лучшей безопасности не открывайте прямые удаленные корневые логины слишком широко. Создайте пару ключей специального назначения и дайте ей принудительную команду в /root/.ssh/authorized_keys
. Содержание файла с открытым ключом AAAA…== wibble@example.com
; добавьте разделенный запятыми список опций включая command="…"
который указывает, что ключ может только использоваться для выполнения этой определенной команды. Обязательно сохраните опции и ключ всеми на одной строке.
command="/root/backup.sh </dev/null >/dev/null 2>/dev/null &",no-port-forwarding,no-agent-forwarding,no-x11-forwarding,no-pty,no-user-rc AAAA…== wibble@example.com
-f
опция получить ssh к 'фону' (т.е. оконечные, близкие соединения) на локальной стороне. Это будет работать в сочетании с &
. nohup
является дополнительным в этом случае, но Вы могли бы рассмотреть использование setsid
вместо этого.
– Alexios
01.02.2012, 11:36
Вы должны фон удаленная команда на remoteserver
. Путем Вы делаете это будет фон ssh-команда на localpc
.
Кроме этого это - плохая идея позволить корень-ssh.
Так устанавливают на remoteserver
: sudoers строка, которая будет работать /root/backup.sh
как базируются пользователем backup
.
Вы могли создать того пользователя без "хорошего" пароля.
Поместите команду sudo /root/backup.sh &
как управляют в ~backup/.ssh/authorized_keys
— вместе с открытым ключом от localpc
(кто бы ни инициировал тот сценарий).
Стандартный рецепт для выполнения удаленной команды от удаленного входа в систему как SSH следующий:
nohup command </dev/null >command.log 2>&1 &
Если command
сценарий оболочки, который заботится о входе в сам файл, затем Вы могли измениться command.log
кому: /dev/null
. После того как Вы запускаете это, выходите из системы сразу же.
Вам нужно все на той строке.
nohup
говорит оболочке не нарушать процесс, если сессия входа в систему разъединяется.
</dev/null
говорит этому никогда не ожидать входа
>command.log
говорит этому отправлять любые сообщения в этот именованный файл журнала
2>&1
говорит этому отправлять любые сообщения stderr в тот же файл журнала. В некоторых случаях лучше иметь два файла, второй для сбора сообщений об ошибках и первого для сбора нормальных сообщений действия. Это может помочь проверить, что все работало правильно.
&
говорит этому отсоединять этот процесс и выполнять его в фоновом режиме как процесс демона.
#screen -d -m -S BACKUP ssh root@remoteserver /root/backup.sh
Этот поток был очень полезен, но мое решение должно было несколько отличаться.
Мне не нравится экранное решение, потому что оно оставляет экранное выполнение процесса, в котором я не нуждаюсь. Перенаправления и nohups используются как это:
ssh root@remoteserver '/root/backup.sh </dev/null >/var/log/root-backup.log 2>&1 &'
НЕ работали на меня при использовании с командой ssh.
Я создал сценарий обертки на удаленной машине, которая запускает фактический скрипт. Сценарий обертки устанавливает перенаправление и nohup. Что-то вроде этого:
backupwrapper.sh:
nohup backup.sh > /dev/null 2>&1 &
Затем на моей клиентской машине я работаю (не заметьте перенаправление):
# ssh remotemachine "backupwrapper.sh"
#
Команда ssh сразу возвращается, соединение завершается, и сценарий оставляют, работая.
Как Nils говорит, это - угроза безопасности, чтобы позволить корню регистрироваться на пути ssh. И я отговариваю от выполнения любого существенного задания на машине без журнала. Если что-нибудь пойдет не так, как надо, то Вам жаль, что у Вас не было некоторых сообщений поиска и устранения неисправностей. Существуют другие ответы, показывающие Вам, как сделать это. Но вот то, как я рекомендую выполнить, что Вы попросили. Это все встроено в sh (1). Никакая потребность в экране GNU (хотя я думаю, что это - умное решение). Добавьте эту строку к своей команде: >&- 2>&- <&- &
. >&-
средства близко stdout. 2>&-
средства близко stderr. <&-
средства близко stdin. &
средства, выполненные в фоновом режиме, например.
$ ssh myhost 'sleep 30 >&- 2>&- <&- &'
# ssh returns right away, and your sleep job is running remotely
$