Ответ, похоже, заключался в том, чтобы поместить следующее в мой сценарий init.d, который я поместил непосредственно перед вызовом start-stop-daemon в do_start:
ulimit -r ## (where ## is a sufficiently high number; 99 works)
Я смог определить это, выполнив системные вызовы ulimit -a внутри команды bash внутри моего кода:
bash -c "ulimit -a"
Часть bash необходима, потому что ulimit -a является встроенной оболочкой. ulimit -a on / bin / sh возвращает различную информацию, не связанную с приоритетом реального времени. По какой-то причине я обнаружил, что мой приоритет в реальном времени был ограничен до 0 (без приоритета в реальном времени), когда моя служба запускается при загрузке. Когда я запускаю его со службой или вызывая сценарий init.d, он наследует мои разрешения, которые позволяют устанавливать приоритет в реальном времени. Но когда система вызывает его через систему обратной совместимости Upstart / SystemV, она не получает таких повышенных привилегий. Я полагаю, это может относиться к сообщениям, которые я видел, в которых говорится, что Upstart не читает /etc/security/limits.conf, где вы должны установить общесистемные разрешения приоритета в реальном времени для непривилегированных пользователей.
Если кто-нибудь может проверить или объяснить, почему это решение работает, я хотел бы его услышать.
Основные проблемы здесь связаны с использованием сокращенных обозначений \w
и \s
. Если редактор представляет собой традиционную реализациюvi
(оригинальных исходников Билла Джоя ), то можно дополнительно установить параметр magic
, который установлен по умолчанию в большинстве современных реализаций vi
.. Это делается с помощью :set magic
.
vi
не понимает \w
и \s
и аналогичную сокращенную запись для различных классов символов, как vim
.
Чтобы выполнить замену в vi
, используйте
:%s/^\(group[ ][ ]*\)[0-9A-Za-z_]/\1Test/
Согласно документации vim
, \w
соответствует [0-9A-Za-z_]
, а \s
является пробелом или табуляцией (в [ ]
выше есть пробел и табуляция ).
Шаблон E+
, где E
— некоторое выражение, может быть заменен на EE*
.
\1
в замещающей части подстановки должно работать вvi
(любойvi
). Если это не так, попробуйтеnvi
("новый vi
" )или посмотрите, сможете ли вы установить vim
.
Исходный vi
(, упакованный как traditional-vi
по крайней мере в некоторых системах BSD ), должен иметь свои «специальные символы» (, за исключением экранированных ^
и $
), например \*
и \.
. ] и т. д. Кроме того, вы можете установить параметр magic
с помощью :set magic
(. Обычно это значение по умолчанию в современных vi
реализациях ).
Вышеуказанная замена заменит все вхождения (, например)
group 1
с
group Test
Еще один способ сделать то же самое, что и вы:
:g/^group/s/[0-9A-Za-z_]$/Test/
или просто
:g/^group/s/.$/Test/
если вам не нужно быть слишком осторожным с последним символом в строке.
Если вы хотите заменить последнее слово (, а не только последний символ )в строке:
:g/^group/s/[^ ]*$/Test/
В традиционном vi
без установленного параметра magic
это, возможно, придется написать
:g/^group/s/\[^ ]\*$/Test/