私はDebianをたくさんインストールしています。これを行うには、完全に自動化されたpreseed.cfgがあります。プレシードの最後に、TFTPサーバーからpostinstall.shスクリプトをダウンロードして実行し、追加のカスタマイズを行います。
私はGNOMEからLXQTEに切り替えて、GDMの代わりにSDDMを使用しています。ただし、SDDMは私のハードウェアに対してあまりにも早く起動しようとします。これを回避するために、私はsystemctl edit sddm
を使用して以下を追加しています:
[Service]
ExecStartPre=/bin/sleep 5
これはうまく機能します。postinstall.shスクリプトに追加して、このプロセスを自動化したいと思います。ただし、bashスクリプトを使用してファイルの内容をsystemctl edit
に渡す方法がわかりません。これどうやってするの?
$SYSTEMD_EDITOR
環境変数 実行時にエディタ以外の別のコマンドを使用するにはsystemctl edit
。
たとえば、SYSTEMD_EDITOR='cp /path/to/source.file'
は問題なく動作するようです(醜くても、最後の引数がsystemdによって追加されることを期待しています!)
特定のケースでは、以下を使用できます。
$ { echo "[Service]";
echo "ExecStartPre=/bin/sleep 5";
} >~/tmp/sddm-override.conf
$ Sudo env SYSTEMD_EDITOR="cp $HOME/tmp/sddm-override.conf" systemctl edit sddm
しかし、すべてsystemctl edit
は実際にオーバーライドファイルを作成します(この場合、override.conf
) 下 /etc/systemd/system/<service>.service.d/
ディレクトリが存在しない場合に作成されます...したがって、それを直接行うことも完全に受け入れられるアプローチです。 (詳細については、 systemd.unitのmanページ の「ドロップイン」と「オーバーライド」の説明を参照してください。)
したがって、あなたの場合、これは適切な解決策です:
$ Sudo mkdir -p /etc/systemd/system/sddm.service.d/
$ { echo "[Service]";
echo "ExecStartPre=/bin/sleep 5";
} | Sudo tee /etc/systemd/system/sddm.service.d/10-startup-delay.conf
$ Sudo systemctl daemon-reload
期待される内容のファイルをユニットの「ドロップイン」ディレクトリにドロップします。その場合、それが達成しようとしていることにちなんで適切に名前を付けることもできます。
UPDATED:@GracefulRestartが指摘するように、systemctl daemon-reload
ドロップインを直接追加した後。
スクリプトでsystemctl edit
を使用する方法をまだ見つけていないため、systemctl edit sddm
コマンドをシミュレートし、/のサービスユニットとして/ etc/systemd/systemディレクトリにオーバーライドを配置するのがベストプラクティスです。 usr/lib/systemd/systemは、パッケージのアップグレード時に変更される可能性があります。
UNIT='sddm.service'
DIR="/etc/systemd/system/${UNIT}.d"
mkdir $DIR
echo -e "[Service]\nExecStartPre=/bin/sleep 5" > ${DIR}/override.conf
systemctl daemon-reload
これは、systemctl edit sddm
が行っていることとほぼ同じです。
edit
サブコマンドに systemctl(8)
が使用するエディターを _SYSTEMD_EDITOR
_ で変更できます。変数。これは基本的に、最終引数が常にsystemctl(8)
で作成された一時ファイルであるコマンドを構築します。一時ファイルは、一度書き込まれると、次に_override.conf
_に移動されます。
このため、_SYSTEMD_EDITOR
_として tee(1)
を使用し、必要なテキストをシェルからsystemctl(8)
コマンド全体にリダイレクトできます。 stdin。たとえば、 Here-Document のリダイレクト:
_SYSTEMD_EDITOR=tee systemctl edit sddm <<EOF
[Service]
ExecStartPre=/bin/sleep 5
EOF
_
これにより、「単語」間のコンテンツEOF
を含むドロップインファイル_/etc/systemd/system/ssdm.service.d/override.conf
_が作成されます。
内部では、edit
サブコマンドは次のようになります。
_# Create drop-in directory for service
mkdir -p /etc/systemd/system/ssdm.service.d
# Create empty temporary file
touch /etc/systemd/system/ssdm.service.d/.
# Pass temporary file as last argument of SYSTEMD_EDITOR
tee /etc/systemd/system/sddm.service.d/.\#override.conf846580011dbe64db/.\#override.conf846580011dbe64db<<EOF
[Service]
ExecStartPre=/bin/sleep 5
EOF
# Rename temporary file
mv /etc/systemd/system/sddm.service.d/{.\#override.conf846580011dbe64db,override.conf}
_
ユニットが編集された後、systemd設定は自動的にリロードされます( _daemon-reload
_ と同等の方法で)。
私はで与えられた答えを2番目にしたいと思いますが、-teeを使用してこのようにしています
env SYSTEMD_EDITOR=tee Sudo -E systemctl edit --system [your_unit_name] < [your_content_file]
このようにすると、ファイルからではなくstdinを介してコンテンツをフィードできます。これは、スクリプトからsystemctlを呼び出すときに役立ちます。