Как избежать спецификатора systemd для перехода к команде в ExecStart

Я написал следующую службу systemd tcpdumpd.service, чтобы запустить постоянную запись tcpdump.

[Unit]
Description=TCPDumpd
After=multi-user.target network.target

[Service]
Type=simple
ExecStart=/usr/sbin/tcpdump -pni eth0 -s65535 -G 3600 -w '/var/log/tcpdump/trace_%Y-%m-%d_%H:%M:%S.pcap' -z gzip
Restart=on-abort

[Install]
WantedBy=multi-user.target

tcpdump позволяет использовать заполнители strftime, такие как %H для часа, %M для минуты и т. д., чтобы вы могли создавать файлы с отметками времени.

Однако в systemd есть специальные спецификаторы, которые можно использовать в ней, например (%n, %N, %p, %i, %U, %u, %m, %H, %b, %v). Таким образом, любой из спецификаторов которые перекрываются, например, %m и %H передают информацию из systemd и не позволяют передать заполнитель в tcpdump для создания отметки времени.

Кто-нибудь знает, есть ли способ избежать спецификаторов в systemd, чтобы я мог передать %m и %H через tcpdump?


person Ben Sooter    schedule 10.11.2016    source источник


Ответы (2)


Я безуспешно пытался избежать специальных спецификаторов, таких как %%m, \%m.

Но, если вам нужно, чтобы работа была выполнена, вот обходной путь:

Создайте файл tcpdumpd.environment, содержащий определение переменной TCPDUMP_FORMAT.

TCPDUMP_FORMAT=%Y-%m-%d_%H:%M:%S

Измените tcpdumpd.service: добавьте к нему параметр EnvironmentFile= и замените строку формата на ${TCPDUMP_FORMAT}.

[Unit]
Description=TCPDumpd
After=multi-user.target network.target

[Service]
Type=simple
EnvironmentFile=tcpdumpd.environment
ExecStart=/usr/sbin/tcpdump -pni eth0 -s65535 -G 3600 -w '/var/log/tcpdump/trace_${TCPDUMP_FORMAT}.pcap' -z gzip
Restart=on-abort

[Install]
WantedBy=multi-user.target
person alexander    schedule 10.11.2016
comment
Это решение. Нашел этот ответ, который получил меня к вашему точному решению. Спасибо! - person Ben Sooter; 10.11.2016
comment
С systemd версии 215 вы можете использовать Environment="TCPDUMP_FORMAT=%%Y-%%m-%%d_%%H:%%M:%%S" вместо EnvironmentFile. - person Iskren; 22.06.2017

Кто-нибудь знает, есть ли способ избежать спецификаторов в systemd, чтобы я мог передать %m и %H через tcpdump?

Да: %%m и %%H.

См. man systemd.unit:

"%%" | Один знак процента | Используйте «%%» вместо «%», чтобы указать один знак процента.

person Heinrich Hartmann    schedule 17.02.2019