web-dev-qa-db-ja.com

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

私はDebianをたくさんインストールしています。これを行うには、完全に自動化されたpreseed.cfgがあります。プレシードの最後に、TFTPサーバーからpostinstall.shスクリプトをダウンロードして実行し、追加のカスタマイズを行います。

私はGNOMEからLXQTEに切り替えて、GDMの代わりにSDDMを使用しています。ただし、SDDMは私のハードウェアに対してあまりにも早く起動しようとします。これを回避するために、私はsystemctl edit sddmを使用して以下を追加しています:

[Service]
ExecStartPre=/bin/sleep 5

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

4
user5104897

$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ドロップインを直接追加した後。

7
filbranden

スクリプトで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が行っていることとほぼ同じです。

5
GracefulRestart

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_ と同等の方法で)。

1
Neurognostic

私はで与えられた答えを2番目にしたいと思いますが、-teeを使用してこのようにしています

env SYSTEMD_EDITOR=tee  Sudo -E systemctl edit --system [your_unit_name] < [your_content_file]

このようにすると、ファイルからではなくstdinを介してコンテンツをフィードできます。これは、スクリプトからsystemctlを呼び出すときに役立ちます。

1
El Gow