Как использовать кавычку и dollarsign с systemd

Вы корректны, libc openlog() не позволяет Вам указать сокет, но это обычно только было бы полезно при необходимости в отдельном syslogd. (Сокет не является тем же как вещью как файл, который сообщения зарегистрированы к, конечно.)

logger значения по умолчанию к (в большинстве систем я думаю), user.notice, таким образом, если это регистрируется к корректному месту, необходимо сделать что-то вроде этого в C:

#include <syslog.h>
  ...
  openlog("myprog",LOG_PID,LOG_USER);
  syslog(LOG_INFO,"%s","my message...");

Или в жемчуге:

use Sys::Syslog qw(:DEFAULT setlogsock);
setlogsock 'unix';   
# setlogsock('unix','/opt/my_root/dev/log');

openlog("myprog","pid","user");
syslog("info","my message...");

Посмотрите Ваш openlog(3) и Sys::Syslog(3) страницы справочника для получения дополнительной информации о константах.

Если Вы действительно хотите зарегистрироваться к другому сокету, чем /dev/log можно сделать это легко в жемчуге со второй формой setlogsocket() как выше. Вы, возможно, должны использовать недавнее Sys::Syslog пакет, я видел, что он перестал работать с v0.17, когда путь указан.

Это немного tricker в C, Вы должны connect() к AF_UNIX сокет и write() к нему с корректным форматом сообщения. Я рекомендую считать источник для logger (функции myopenlog() и mysyslog()) в недавнем выходе util-linux-2.x версия.

На Linux (glibc) и FreeBSD путь это openlog() использование трудно кодируется (_PATH_LOG от /usr/include/syslog.h), я не знаю ни о каком способе изменить его во время выполнения (кроме chroot, или .so Внедрение DLL).

7
21.12.2014, 18:35
2 ответа

После некоторых исследований я обнаружил, что в порядке использования цитаты в определении файла службы SystemD. Что касается использования переменных оболочков, необходимо использовать фигурные скобки для уточнения, где окончание переменной имени, когда не пространственные символы подключены к самой переменной.

В приведенном выше случае система должна иметь лечение $ Docker_username / Redis как имя переменной вместо $ Docker_username . Добавьте фигурные скобки, то она интерпретируется правильно.

Редактировать : больше информации о том, какой синтаксис в порядке с Systemd можно найти здесь: http://www.freedesktop.org/software/systemd/man/systemd.service.html#Command%20Lines.

в основном большинство оболочек в порядке, с за исключением операторов труб.

8
27.01.2020, 20:17

Acabo de tener problemas para citar y ejecutar la siguiente línea de comando en la clave ExecStartde un archivo de unidad de servicio:

IFS=$'\n'; f=($(ls $HOME/bk.d/DuckieTV*.backup | tail -n +2)); echo "${f[@]}"

Lo citaré usando las reglas de cotización de systemd y luego explicaré lo que aprendí en el proceso. Parece complicado porque esperamos que siga las reglas de cotización de los shells POSIX, pero de hecho es aún más simple. Aquí está la directiva ExecStart, correctamente citada

ExecStart=/bin/bash -c 'IFS=$$\'\\n\'; f=($$(ls ${HOME}/bk.d/DuckieTV*.backup | tail -n +2)); echo \"$${f[@]}\"'

o

ExecStart=/bin/bash -c "IFS=$$\'\\n\'; f=($$(ls ${HOME}/bk.d/DuckieTV*.backup | tail -n +2)); echo \"$${f[@]}\""

Entonces, las reglas de cotización:

  1. Encierre la cadena que se tratará como un único argumento, ya sea entre comillas simples(' ')o comillas dobles(" "). Se tratan de la misma manera, no importa cuál elija, siempre que la cotización de cierre sea la misma que la cotización de apertura
  2. Escanea la cadena de izquierda a derecha, reemplazando ' con \' , " con \" y $ con $$

Si desea que systemd realice la sustitución de variables, no incluya $ , pero systemd no trata $var y ${var} como el mismo. Ambos se reemplazan por el valor de entorno de var , pero la división de palabras será diferente en cada caso :con $var , después de reemplazar el valor de var , las palabras se dividirán en espacios en blanco, mientras que con ${var} no habrá división de palabras. Efectivamente, systemd trata $var como lo haría un shell POSIX, pero trata ${var} como un shell POSIX trataría "$var" .

3
27.01.2020, 20:17

Теги

Похожие вопросы