Вы корректны, 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).
После некоторых исследований я обнаружил, что в порядке использования цитаты в определении файла службы SystemD. Что касается использования переменных оболочков, необходимо использовать фигурные скобки для уточнения, где окончание переменной имени, когда не пространственные символы подключены к самой переменной.
В приведенном выше случае система должна иметь лечение $ Docker_username / Redis
как имя переменной вместо $ Docker_username
. Добавьте фигурные скобки, то она интерпретируется правильно.
Редактировать : больше информации о том, какой синтаксис в порядке с Systemd можно найти здесь: http://www.freedesktop.org/software/systemd/man/systemd.service.html#Command%20Lines.
в основном большинство оболочек в порядке, с за исключением операторов труб.
Acabo de tener problemas para citar y ejecutar la siguiente línea de comando en la clave ExecStart
de 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:
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" .