Итак, я в конце концов решил проблему, вот ответ для тех, кто столкнется с той же проблемой. Ошибка была на самом деле довольно глупой, но я заметил ее только после того, как узнал, как работает ведение журнала в пустоте, каким-то образом только системный журнал (, но не журнал postgres )показывал ошибку, которая читалась SSL is not supported in this build
, поэтому Я начал копать таким образом и в конце концов понял, что флаг -l
в команде выполнения службы заставляет использовать SSL, который мне не нужен. Итак, окончательный файл запуска, с которым у меня все заработало, это:
# /etc/sv/postgresql/run:
#!/bin/sh
exec chpst -u postgres:postgres /usr/local/pgsql/bin/postgres -D '/var/lib/postgresql/data' 2>&1
Также логирование для сервиса включается созданием папки /etc/sv/postgresql/log
и созданием в ней файла(/etc/sv/postgresql/log/run
)с содержимым:
#!/bin/sh
exec logger -p daemon.info -t postgres
Также установите демон системного журнала, чтобы на самом деле сохранять журналы (например. носки -пустота)
Насколько мне известно, универсального инструмента для изменения строки конфигурации не существует. Я полагаю, что создать такой инструмент будет сложно, потому что существует так много разных синтаксисов конфигурационных файлов.
Если вы хотите изменить определенное значение в определенном файле конфигурации, вы можете написать специальный инструмент для этой конкретной задачи.
вот два примера использования sed и awk, которые помогут вам начать работу
простая команда sed для замены значения ключа на простой key value
синтаксис
$ sed 's/^key2 value2$/key2 newvalue2/' config
пример
$ cat config
key1 value1
key2 value2
key3 value3
$ sed 's/^key2 value2$/key2 newvalue2/' config
key1 value1
key2 newvalue2
key3 value3
но будьте осторожны :если есть еще key2 value2
строк (возможно в других разделах конфигурационного файла )тогда все будут заменены. это трудно предотвратить в sed (возможно, но сложно )и проще в awk. см. ниже команду awk, которая учитывает разделы.
объяснение:
эта команда sed делает примерно следующее:
for every line:
if line is "key2 value2":
print "key2 newvalue2"
эта команда sed s/pattern/replace/
означает :в каждой строке ищите pattern
и, если найдено, замените на replace
. pattern
может быть обычной строкой или regex (регулярным выражением ).
^
и &
в регулярном выражении называются якорями и означают начало строки и конец строки соответственно. без якорей этот шаблон key2 value2
также соответствовал бы этой строке xkey2 value2x
, и результаты были бы xkey2 newvalue2x
.
вот несколько примеров того, как мы можем изменить поведение с помощью шаблона.
также работает с синтаксисом key=value
$ sed 's/^key2=value2$/key2=newvalue2/' config
чтобы просто сопоставить ключ независимо от старого значения
$ sed 's/^key2=.*/key2=newvalue2/' config
для удаления возможного знака комментария
$ sed 's/^#\?key2 value2$/key2 newvalue2/' config
чтобы увидеть, что что-то было изменено, если вы перенаправляете вывод, вы также можете распечатать в stderr
$ sed 's/^#\?key2 value2$/key2 newvalue2/ w /dev/stderr' config > newconfig
с правильным регулярным выражением можно сделать гораздо больше. но это был бы еще один ответ на другой вопрос.
вот скрипт awk, который также может обрабатывать разделы конфигурации
/^\[section2\]$/ {
print
insection2=1
next
}
insection2 && /^#?key2=value2$/ {
print "key2=newvalue2"
next
}
/^\[.*\]$/ {
insection2=0
}
1
используйте так
$ awk -f configer.awk config
пример
$ cat config
[section1]
key1=value1
key2=value2
[section2]
key1=value1
key2=value2
[section3]
key1=value1
key2=value2
$ awk -f configer.awk config
[section1]
key1=value1
key2=value2
[section2]
key1=value1
key2=newvalue2
[section3]
key1=value1
key2=value2
вы также можете добавить подробный вывод в stderr, чтобы вы могли видеть, что изменилось, если вы перенаправляете вывод
insection2 && /^#?key2=value2$/ {
print "key2=newvalue2"
print "changed line "NR > "/dev/stderr"
next
}
краткое объяснение скрипта awk
первое правило ищет заголовок секции [config2]
. он установит для флага insection2
значение true
второе правило ищет строку key2=value2
. но только если флаг insection2
истинен. затем он напечатает строку с новым значением.
третье правило ищет любой другой заголовок раздела. он сбросит флаг insection2
в false.
последнее правило (единственное1
)является "правилом по умолчанию". он просто напечатает строку без изменений.
в псевдокоде
for every line:
if line is [section2]:
note that we are in section2
else if we are in section2 and line is key2=value2:
print modified line
else if line is any other section header:
note that we are no longer in section2
else
print line unchanged