
私はDebianを頻繁にインストールします。これには完全に自動化されたpreseed.cfgがあります。プロビジョニングが完了したら、TFTPサーバーからpostinstall.shスクリプトをダウンロードして実行し、いくつかの追加のカスタマイズを実行します。
GNOMEからLXQTEに切り替えて、GDMの代わりにSDDMを使用しています。しかし、SDDMは私のハードウェアと比較して早すぎる起動を試みます。この問題を解決するために、systemctl edit sddm
以下を追加しました。
[Service]
ExecStartPre=/bin/sleep 5
これは非常にうまく機能するので、postinstall.shスクリプトに追加してこのプロセスを自動化したいと思います。しかし、systemctl edit
bashスクリプトを介してファイルの内容を渡す方法がわかりません。どうすればいいですか?
答え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