Я наконец-то нашел, как решить эту проблему.
Вам нужно отредактировать /usr/portage/profiles/base/use.stable.mask
и закомментировать следующие строки:
python_targets_python3_5
python_single_target_python3_5
И вот:
sudo emerge --ask dev-python/google-api-python-client
These are the packages that would be merged, in order:
Calculating dependencies... done!
[ebuild R ] dev-python/six-1.10.0 PYTHON_TARGETS="python3_5*"
[ebuild R ] dev-python/setuptools-20.6.7 PYTHON_TARGETS="python3_5*"
[ebuild R ] dev-python/certifi-2015.11.20 PYTHON_TARGETS="python3_5*"
[ebuild U ~] dev-python/pyasn1-0.1.9 [0.1.8] PYTHON_TARGETS="python3_5%*"
[ebuild N ~] dev-python/httplib2-0.9.2-r1 PYTHON_TARGETS="python2_7 python3_4 python3_5 -pypy -pypy3"
[ebuild R ] dev-python/pbr-1.10.0 PYTHON_TARGETS="python3_5*"
[ebuild N ] dev-python/simplejson-3.8.1 PYTHON_TARGETS="python2_7 python3_4 python3_5 (-pypy) (-pypy3)"
[ebuild N ] dev-python/uritemplate-0.6 PYTHON_TARGETS="python2_7 python3_4 python3_5 (-pypy) (-pypy3)"
[ebuild N ~] dev-python/pyasn1-modules-0.0.8 PYTHON_TARGETS="python2_7 python3_4 python3_5 -pypy -pypy3"
[ebuild N ] dev-python/linecache2-1.0.0 USE="{-test}" PYTHON_TARGETS="python2_7 python3_4 python3_5 (-pypy) (-pypy3)"
[ebuild N ] dev-python/traceback2-1.4.0 PYTHON_TARGETS="python2_7 python3_4 python3_5 (-pypy) (-pypy3)"
[ebuild N ] dev-python/rsa-3.2.3-r1 USE="{-test}" PYTHON_TARGETS="python2_7 python3_4 python3_5 (-pypy)"
[ebuild N ] dev-python/oauth2client-2.0.1 USE="{-test}" PYTHON_TARGETS="python2_7 python3_4 python3_5 (-pypy)"
[ebuild N ] dev-python/google-api-python-client-1.5.0 USE="{-test}" PYTHON_TARGETS="python2_7 python3_4 (-pypy)"
UPDATE: Эти изменения будут перезаписаны обновлениями системы, поэтому вам нужно обновить /etc/portage/profile/use.stable.mask
следующими строками:
-python_targets_python3_5
-python_single_target_python3_5
Спасибо jansegre с Reddit.
Корпус
while true ; do cat > $(( $RANDOM * $RANDOM )).file & done;
Вы, вероятно, достигнете предела максимального процесса, если не root. Если это так, используйте один процесс perl для открытия файлов. Вы можете понизить maxfiles с помощью sysctl, хотя я не знаю эту переменную с руки -.
Это сделает это (примерно за 40 секунд в моей системе):
#!/bin/bash
[ "$BASHPID" = "$$" ] || { echo "Must run in a new process group"; exit 1; }>&2
cnt0() { cnt0=$#; }
cnt1() { cnt1=$#; }
tmpd=
trap 'rm -rf "$tmpd"; exit 1' INT HUP QUIT EXIT
tmpd=$(mktemp -d)
mkfifo "$tmpd/fifo"
exec 4<>"$tmpd/fifo"
rm -rf "$tmpd"
trap - INT HUP QUIT EXIT
open_all()
{
cnt0 /proc/self/fd/*;
while exec {fd}</dev/null; do :; done;
cnt1 /proc/self/fd/*;
nopened=$((cnt1-cnt0));
echo $nopened >&4;
cat /proc/sys/fs/file-nr
if ((nopened)); then
sleep 10000000
fi
}
( open_all )&
while :; do
if read nopened <&4 && ((nopened)); then
( open_all )&
continue
fi
break
done
kill -TERM -$$
Он работает, открывая /dev/null
в подоболочке столько раз, сколько возможно (он должен работать примерно 1000 -4000 раз в зависимости от вашегоulimit -n
). Если хотя бы один файловый дескриптор был открыт, родитель уведомляется через конвейер, а подоболочка приостанавливается с помощью sleep
. Родительский процесс отвечает на успешное выделение fd -в дочернем процессе, продолжая процесс в другой подоболочке до тех пор, пока одна из подоболочек не выйдет из строя.
/proc/sys/fs/file-nr
вызывается cat
на каждой итерации, чтобы вы знали, как продолжается процесс.
В конце процесса вы должны получить что-то вроде:
...
778192 0 786806
779248 0 786806
780272 0 786806
781264 0 786806
782256 0 786806
783280 0 786806
784304 0 786806
785328 0 786806
786352 0 786806
./open_all: line 35: cannot redirect standard input from /dev/null: Too many open files in system
./open_all: line 18: fd: Too many open files in system
Terminated
Одна интересная вещь, которую я узнал из этого, заключается в том, что дублированные файловые дескрипторы (из dup или fork )не учитываются при достижении предела (порождение процесса из родительского процесса с большим количеством файловых дескрипторов не увеличивает количество ).