systemctlを使用してbashスクリプトを介して編集しますか?

systemctlを使用してbashスクリプトを介して編集しますか?

私はDebianを頻繁にインストールします。これには完全に自動化されたpreseed.cfgがあります。プロビジョニングが完了したら、TFTPサーバーからpostinstall.shスクリプトをダウンロードして実行し、いくつかの追加のカスタマイズを実行します。

GNOMEからLXQTEに切り替えて、GDMの代わりにSDDMを使用しています。しかし、SDDMは私のハードウェアと比較して早すぎる起動を試みます。この問題を解決するために、systemctl edit sddm以下を追加しました。

[Service]
ExecStartPre=/bin/sleep 5

これは非常にうまく機能するので、postinstall.shスクリプトに追加してこのプロセスを自動化したいと思います。しかし、systemctl editbashスクリプトを介してファイルの内容を渡す方法がわかりません。どうすればいいですか?

答え1

上書きできます$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ディレクトリの下にオーバーレイファイル(この場合はname override.conf)を作成し/etc/systemd/system/<service>.service.d/、存在しない場合はオーバーレイファイルを作成することです。したがって、直接的な方法で行うことも完全に許容されます。 (「挿入」と「上書き」の参照を参照してください。systemd.unitのマニュアルページ詳細については。 )

したがって、あなたの場合、これは適切なソリューションになります。

$ 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

これにより、デバイスの「ドロップ」ディレクトリに期待される内容を含むファイルが配置されます。その場合は、実行する操作に応じて適切に名前を付けることもできます。

修正する:@GracefulRestartが指摘したように、systemctl daemon-reloadプラグインを直接追加した後にこれを行う必要があります。

答え2

systemctl editスクリプトでこれを使用する方法がわからなかったため、systemctl edit sddm/usr/lib/systemd/systemのサービス単位が変更される可能性があるため、コマンドをエミュレートして/etc/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これは実行中の作業とほぼ同じでなければなりません。

答え3

どのエディタを変更できますか?systemctl(8)その目的editサブコマンドとSYSTEMD_EDITOR変えるこれは本質的に最終引数が常にsystemctl(8)作成された一時ファイルであり、一度作成されたらoverride.conf

このため、私たちは利用可能ですtee(1)次に、SYSTEMD_EDITORシェルから必要なテキストをsystemctl(8)標準入力の完全なコマンドにリダイレクトします。たとえば、リダイレクトここのドキュメント:

SYSTEMD_EDITOR=tee systemctl edit sddm <<EOF
[Service]
ExecStartPre=/bin/sleep 5
EOF

/etc/systemd/system/sddm.service.d/override.confこれにより、「単語」の間に内容を含む埋め込みファイルが作成されますEOF

サブコマンドはedit次のとおりです。

# Create drop-in directory for service
mkdir -p /etc/systemd/system/sddm.service.d

# Create empty temporary file
touch /etc/systemd/system/sddm.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)。

答え4

ファイルを直接攻撃します。

sed -i 's/\[Service]/ a\
ExecStartPre=/bin/sleep 5' /usr/lib/systemd/system/sddm.service

関連情報