2016-11-10 4 views
2

私は以下のsystemdサービスtcpdumpd.serviceを書いて、永続的なtcpdump記録を開始しました。systemdをエスケープする方法ExecStartのコマンドに渡す指定子

[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が、時間%のHのようにstrftime-プレースホルダを可能分間%Mというように、あなたがタイムスタンプのファイルを作成できるように。

しかし、systemdには、(%n、%N、%p、%i、%U、%u、%m、%H、%b、%v)のような特殊な指定子があります。重複する指定子は、%mや%Hのように、systemdからの情報を渡し、プレースホルダをtcpdumpに渡してタイムスタンプを作ることを許可しません。

私は%mと%Hをtcpdumpに渡すことができるように、systemdの指定子をエスケープする方法があるかどうか知りませんか?

答えて

5

%%m\%mなどの特別な指定子を逃げようとしました。

しかし、あなたは仕事が行われる必要がある場合は、ここでの回避策は次のとおりです。

はTCPDUMP_FORMAT変数の定義を含むファイルtcpdumpd.environmentを作成します。

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 
+0

これが解決策です。あなたの正確な解決策に私を得た[この回答](http://stackoverflow.com/questions/28881758/how-can-i-use-spaces-in-systemd-command-line-arguments?rq=1)ありがとう! –

+1

'systemd'バージョン215では' EnvironmentFile'の代わりに 'Environment =" TCPDUMP_FORMAT = %% Y - %% m - %% d _ %% H:%% M:%% S "'を使用できます。 –

関連する問題