Я нашел решение своей проблемы, поэтому делюсь им.
Я определил контрольную группу customssh/limit
, используя службу cgconfig
из libcgroup. Вот выдержка из моего cgconfig.conf
файла:
group customssh/limit {
perm {
admin {
uid=root;
gid=root;
}
task {
uid=myuser;
gid=mygroup;
fperm=775;
}
}
cpu {
cpu.shares=50;
}
memory {
memory.limit_in_bytes="10G";
memory.memsw.limit_in_bytes="10G";
memory.soft_limit_in_bytes="2G";
}
devices {
devices.deny="c 195:* rwm";
}
}
fperm = 775
позволяет пользователям группы mygroup
использовать эту контрольную группу devices.deny="c 195:* rwm";
Я создал файл /etc/profile.d/ssh.sh
, который запускается при каждом входе в систему со следующим содержимым:
# check if the user is in a ssh session
if [[ -n $SSH_CONNECTION ]]; then
# shell PID
SESSIONPID=$$
# attach the shell to the `customssh/limit` cgroup
cgclassify -g memory,cpu,devices:customssh/limit $SESSIONPID
# all processes run by this shell will be affected
fi
find. -maxdepth 3 -name index.html -o -name Config_extra.js |
perl -lne '($dir,$base) = m:(^.*)/(.*$):;
$dirs{$dir}++;
END { foreach (sort keys %dirs) {print if $dirs{$_} == 2} }'
find выводит полный путь к файлам, соответствующим либо index.html
, либо Config_extra.js
. Это передается в perl-скрипт, который подсчитывает, сколько раз просматривается каждый каталог. После того, как все входные данные обработаны, он печатает каталоги, которые были просмотрены дважды.
Это основано на том факте, что команда find
никогда никогда не выводит имя пути менее одного или более двух раз. Один раз, если/когда он соответствует index.html
и/или один раз, если/когда он соответствует Config_extra.js
.
Примерно такой же алгоритм в awk:
find. -maxdepth 3 -name index.html -o -name Config_extra.js |
awk '{
sub("/[^/]+$","",$0);
dirs[$0]++
}
END {
for (i in dirs) {
if (dirs[i] == 2) print i
}
}'
Вы можете использоватьfind -exec
:
find. -maxdepth 3 -name 'index.html' -exec sh -c '
[ -f "${f%/*}/Config_extra.js" ]' find-sh {} \; -printf "%h\n"
Если у вас большое дерево каталогов, использование -exec... +
будет работать лучше:
find. -maxdepth 3 -name 'index.html' -exec sh -c '
for f do
d="${f%/*}"
[ -f "$d/Config_extra.js" ] && printf "%s\n" "$d"
done' find-sh {} +
Альтернативный поиск каталогов:
find. -maxdepth 2 -type d -exec sh -c '
[ -f "$1/index.html" ] && [ -f "$1/Config_extra.js" ]' find-sh {} \; -print
или используя-exec... +
find. -maxdepth 2 -type d -exec sh -c '
for d do
[ -f "$d/index.html" ] && [ -f "$d/Config_extra.js" ] && printf "%s\n" "$d"
done' find-sh {} +
Если вы ищете каталоги, используйте find
, чтобы найти каталоги , а не файлы.
find. -type d -exec sh -c '[ -f "$1/index.html" ] && [ -f "$1/Config_extra.js" ]' sh {} \; -print
или, чтобы быть немного более эффективным, (вызывая sh -c
как можно меньше раз ),
find. -type d -exec sh -c '
for dirpath do
if [ -f "$dirpath/index.html" ] && [ -f "$dirpath/Config_extra.js" ]
then
printf "%s\n" "$dirpath"
fi
done' sh {} +
Любой из них будет находить и выводить пути к каталогам в текущем каталоге, содержащем как index.html
, так и Config_extra.js
, как обычные файлы или как символические ссылки на обычные файлы.
Добавьте дополнительные тесты и ограничения, если вам нужно (-maxdepth 2
, например, можно добавить перед -type
тестом ).
Реализация find
, которая поддерживает конкатенацию {}
с какой-либо другой строкой в аргументах -exec
(, наиболее распространенные реализации поддерживают это ), может использовать
find. -type d \
-exec [ -f "{}/index.html" ] \; \
-exec [ -f "{}/Config_extra.js" ] \; -print
Еще один вариант:
find. -maxdepth 3 \( -name index.html -or -name Config_extra.js \) -printf "%h\n" | uniq -d
Найдите все совпадающие файлы (, имеющие любое имя ), распечатайте соответствующий каталог, затем используйте uniq
для поиска повторяющихся каталогов (, которые должны содержать оба файла ).