システム単位でログファイル名の一部として日付出力を使用しようとしています。ここの例:
[Unit]
Description=TCS minetest server unit
[Service]
Type=simple
ExecStart=/home/tcs/minetest/bin/minetestserver --worldname world --logfile /home/tcs/logs/debug_$$(date +%%Y_%%m_%%d).txt
ExecReload=/bin/kill -HUP $MAINPID
User=tcs
[Install]
WantedBy=multi-user.target
しかし、ログファイルを取得します。
ls /home/tcs/logs/
'debug_$(date'
現在の日付をログファイル名として使用するには?
答え1
このタイプの構文は直接サポートされません。system.service のマニュアルページ:
構文はシェル構文に触発されましたが、次の段落で説明するメタ文字と拡張のみを理解し、変数は異なる方法で拡張されます。特に、"<"、"<<"、"">"、および">>"を使用したリダイレクト、"|"を使用したパイプ、"&"を使用したバックグラウンドでのプログラム実行、およびその他のシェル構文要素はサポートされていません。
「次の段落」には、主にデフォルトの環境変数置換、パス検索、およびいくつかのCエスケープが含まれます。
通常、プロセスをセットアップするために独自のシェルスクリプトを作成し、そのスクリプトをsystemdサービスのオプションとして指定することで、ExecStart
これらの制限を解決できます。
場合によっては、日付の置き換えをシェルに明示的に渡すことで機能させることができます。
ExecStart=/bin/bash -c '/home/tcs/minetest/bin/minetestserver --worldname world --logfile /home/tcs/logs/debug_$(date +%Y_%m_%d).txt'
答え2
動的部分を環境ファイルに作成し、後で変数を使用できます。このような:
[Unit]
Description=TCS minetest server unit
[Service]
Type=simple
EnvironmentFile=-/dev/shm/tcs.env
ExecStartPre=sh -c 'echo date=$(date +%%Y_%%m_%%d) > /dev/shm/tcs.env'
ExecStart=/home/tcs/minetest/bin/minetestserver --worldname world --logfile /home/tcs/logs/debug_${date}.txt
ExecStartPost=rm /dev/shm/tcs.env
ExecReload=/bin/kill -HUP $MAINPID
User=tcs
[Install]
WantedBy=multi-user.target
何度もExecStart
使用できるsh -c
。ExecStartPre
>>