Я скопировал фрагмент Bash в фоновую команду ssh, выполненную удаленно:
ssh user@remote <<CMD
some process <&- >log 2>error &
CMD
Что делает <&-
?
Я думаю, что это так же, как< /dev/null
Мое следующее понимание , что три основные файловые дескрипторы ( stdin
, stdout
, stderr
) должны быть закрыты , чтобы предотвратить:
- Работа на заднем плане и сценарий выхода - как-то конфликтует?
- Когда терминал закрывается, все процессы, которые принимают стандартный ввод от терминала, закрываются?
bash
shell
io-redirection
Эрик Фрэнсис
источник
источник
ssh -nNT user@remote 'command'
создаст неинтерактивный сеанс SSH. Добавьте&
к фону это, добавьтеnohup
к,command
чтобы держать это работающим, если Ваше соединение умирает.man ssh
предполагает, что -N полностью отключает запуск удаленной команды, и быстрый тест поддерживает это.Ответы:
<&-
это не совсем то же самое, что< /dev/null
.<&-
закрывает fd 0, тогда как< /dev/null
перенаправляет его с устройства/dev/null
, которое никогда не предоставляет никаких данных и всегда дает EOF при чтении. Разница в основном заключается в том, что приread(2)
вызове из закрытого FD (<&-
случай) произойдет ошибка с EBADF, тогда как при вызове из FD с нулевым перенаправлением не будет прочитано ни одного байта (условие конца файла). Если ваша программа никогда не читает со стандартного ввода, различие не имеет значения.Закрытие FD - хорошая практика, если вы что-то делаете в фоновом режиме, поскольку фоновый процесс зависнет, если он попытается что-то прочитать из TTY. Этот пример не полностью обрабатывает все, что должен; в идеале должен быть вызов
nohup
илиsetsid
вызов где-то, чтобы полностью отделить фоновый процесс.источник
nohup
в дополнение к закрытию файловых дескрипторов?setsid some process <&- >path/to/log 2>path/to/error
. Более быстрый метод что-то вродеnohup some process &
.nohup
здесь не имеет смысла.nohup
предотвратить процесс от полученияHUP
сигнала, когда его терминал управления закрыт. Но у вас не было терминала в этом случае.Смотрите
man bash
:источник
[n]<&word
и слово содержит более одной цифры.man bash
неверно?bash
решает реализовать его разумным способом (для некоторого подходящего определения «нормального»). Другие оболочки могут или не могут сделать это.bash
, а неposix-shell
.<&-
закрыть стандартный ввод.Общий вид, определяемый POSIX , является:
Его назначение сделать дескриптор файла
n
- это копия дескриптора файла, обозначенная какword
. Standard in предполагается, еслиn
опущен, а еслиword
есть-
, дескриптор файлаn
будет закрыт.Это не то же самое, что
</dev/null
, когда, в случае</dev/null
, стандартный ввод все еще открыт, и был перенаправлен в другое место.Вам необходимо закрыть все файловые дескрипторы процессов, которые были присоединены к сокету ssh, иначе сессия ssh не может быть закрыта.
Вы можете запустить команду на удаленной машине, не подключая ее к сеансу ssh, используя screen или tmux :
источник