Я нашел кое-что, что мне подходит. Это решение может быть плохой идеей для тех, кто заботится о безопасности, например как предотвращение взаимодействия контейнера с хостом. Я действительно не понимаю всех последствий своего решения. Я запускаю только свой собственный код внутри LXC с тестами Jenkins, поэтому для меня это не проблема.
Я нашел здесь: https://libvirt.org/drvlxc.html#fsmounts :
Следующие специальные средства монтирования устанавливаются libvirt
/ proc / sys хост "/ proc / sys "bind-mount-only read-only
Я до сих пор не понимаю, почему внутри сетевого пространства имен по умолчанию внутри LXC я могу установить sysctl
, но внутри других сетевых пространств имен я не могу.
Я добавил явное монтирование / proc / sys
в XML конфигурации контейнера:
...
Это позволило мне установить sysctl
как внутри контейнера LXC по умолчанию, так и в дополнительных пространствах имен. {{{ 1}} Я боялся, что настройки внутри LXC также повлияют на хост, но это не так.
Теперь все сетевые пространства имен (хост, LXC по умолчанию, LXC custom) имеют независимую запись (от root) sysctl
без необходимости перемонтировать каждый раз. Или, по крайней мере, то, что сообщает запрос sysctl
.
Если код уже работает, но выполняется слишком медленно, следующий шаг - начать профилирование. При написании сценариев shell можно использовать time
(попробуйте help time
, чтобы посмотреть его справочную страницу), чтобы увидеть, сколько времени занимает выполнение каждой команды.
Я думаю, что bc
должна быть очень быстрой; sed
против одной строки также должен быть очень быстрым; и grep
тоже должен быть довольно быстрым, поэтому я решил попробовать профилировать эти две команды xrandr
на своей системе. Мне просто нужны были некоторые быстрые оценки, поэтому я попробовал выполнить команды по отдельности (вместо того, чтобы, скажем, обернуть их в сценарий, чтобы запустить их десятки раз для получения среднего значения):
$ time xrandr --prop --verbose >/dev/null
real 0m0.428s
user 0m0.004s
sys 0m0.004s
$ time xrandr --output LVDS1 --brightness 0.9
real 0m0.117s
user 0m0.000s
sys 0m0.008s
$
Если вы получите похожие результаты, возможно, ваш запрос занимает больше всего времени.
Ну, во-первых, вы запускаете три отдельные внешние программы, когда достаточно было бы одной. Вы могли бы сделать весь разбор и арифметику в awk
, например:
xrandr --output LVDS-1 --brightness $(xrandr --prop --verbose |
awk "/Brightness:/{print \$2 $1 0.1; exit}")
exit
в сценарии awk гарантирует, что ему не нужно разбирать весь вывод xrandr --prop --verbose
и он выходит после первого совпадения для Brightness:
. Затем, поскольку команда awk
заключена в двойные кавычки, $1
расширяется до аргумента, переданного скрипту, а \$2
относится ко второму полю в awk
, поскольку оно экранировано.
Вы также можете попробовать использовать более быструю оболочку. Если по умолчанию используется bash
, попробуйте запустить сценарий с dash
.