Этого я и ожидал. Чтобы прослушивать привилегированный порт, процесс должен быть запущен с привилегиями root. Но как только пользователь подключен, мы хотим, чтобы этот процесс выполнялся с привилегиями подключенного пользователя.Если серверный процесс просто сбросит свои привилегии, он не сможет обслужить запрос от другого пользователя. Существует также проблема, заключающаяся в том, что сервер должен обрабатывать несколько подключений одновременно. Итак, что происходит, так это то, что сервер (, работающий как root ), прослушивает сокет до тех пор, пока пользователь не подключится, а затем, чтобы позволить ему обрабатывать другие запросы и работать с правильным уровнем привилегий, он разветвляется, создавая 2 экземпляра.. Один экземпляр возвращается к прослушиванию соединений, другой переключается на менее привилегированного пользователя. Оба имеют копию дескриптора, ссылающегося на соединение сокета.
Если один из процессов закроет сокет, то, в отличие от двух процессов, обращающихся к одному и тому же файлу, соединение будет потеряно.
РЕДАКТИРОВАТЬ:
судя по комментариям к этому вопросу, лучше полностью использовать широкий функционал команды find
и вообще пропустить конвейер (также указать find
не спускаться в каталог, который он собирается запросить rm
удалить):
find. -type d -name target -prune -exec rm -r {} +
Должно сработать.
Приносим извинения за неудовлетворительный ответ. Ваш отзыв был очень информативным.
Оригинальный ответ:
Немного погуглив -fu to список всех подкаталогов и канал в rm:
find. -type d | grep -E '/target$' | xargs rm -r
Должно работать. Прежде чем удалять папки, проверьте, дает ли find. -type d | grep -E '/target$'
ожидаемый результат! Лучше спастись, чем сожалеть.
Если вы знаете, что у вас не будет более нескольких тысяч этих target
каталогов, вы можете установить параметры оболочки globstar
и dotglob
в bash
с помощью
shopt -s globstar dotglob
, а затем используйте
rm -rf./**/target/
Это приведет к удалению любого каталога с именем target
в текущем каталоге или ниже него. Косая черта в конце имеет решающее значение, поскольку в противном случае шаблон может соответствовать вещам, которые не являются каталогами.
Шаблон **
активируется установкой параметра оболочки globstar
и «рекурсивно» сопоставляется с подкаталогами. Поскольку dotglob
также установлен, это найдет каталоги с именем target
в скрытых подкаталогах, а также (точно так же, как find
сделал бы ).
В macOS по умолчаниюbash
слишком стар для поддержки опции оболочки globstar
, поэтому вы можете установить самую последнюю bash
с помощью Homebrew или переключиться на zsh
(, который в настоящее время является оболочкой по умолчанию для новых учетных записей пользователей macOS ).
С помощью zsh
эту операцию можно выполнить с помощью
rm -rf./**/target(/D)
Где (/D)
означает «соответствовать только каталогам и включать скрытые каталоги». Глоб **
включен по умолчанию в zsh
.
Сfind
:
find. -depth -type d -name target -exec rm -rf {} +
Это найдет все target
каталоги, расположенные в текущем каталоге или ниже, а затем вызовет rm -rf
как можно больше из них за раз, чтобы удалить их. Опция -depth
заставляет find
выполнять глубинный -первый поиск (мы хотим, чтобы это не пыталось искать каталоги, которые мы только что удалили ).
Эту команду вы бы использовали, если бы использовали sh
в качестве оболочки (, которая не имеет **
), или если у вас много тысяч таких каталогов.
Даже если у вас есть большое количество каталогов target
, вы все равно сможете удалить их один за другим с помощью
for dirpath in./**/target/; do
rm -rf "$dirpath"
done
, хотя это будет медленнее, чем использование find
, так как вы вызываете rm
один раз для каждого каталога.