systemd は SIGTERM を使用してプロセスとサブプロセスを終了します。

systemd は SIGTERM を使用してプロセスとサブプロセスを終了します。

こんにちは、私のプロセス(およびその子プロセス)がaを受け取り、送信者がSIGTERM(PID == 1)である場合、systemd非常に奇妙な状況が発生します。私の設定は次のとおりです。

  • /opt/a2つの「シメトリック」パーティションがおよびにインストールされます/mnt/a。 1つはプライマリパーティション、もう1つはセカンダリパーティションです。
  • 特定の条件でいくつかのアーカイブをダウンロードし、bashスクリプトを実行してインストールする実行中のsystemdサービスユニット(で実行可能)/opt/a/bin/my_exe.deb
  • packageで参照されるファイル階層のため、/opt/aスクリプトはインスタンスを起動し、unshareonのバインドマウントを実行し、パッケージのインストールを呼び出します。/mnt/a/opt/adpkg
#!/bin/bash
DEB_PKG="$1"
unshare -m /bin/bash <<-EOF
    mount --bind /mnt/a /opt/a
    dpkg -i --admindir=/opt/a/var/lib/dpkg "\$DEB_PKG"
EOF

さて、実行可能ファイルをインストールする.debパッケージに対してスクリプトが呼び出されたら、aがスクリプトに送信され実行されることを確認しました/opt/a/bin/my_exe。他のsystemdすべてのパッケージでは、エラーなしでインストールが完了します。また、手動で起動すると、すべてが正常です。何らかの理由で認知問題を引き起こすパッケージの特定のステップが気に入らないようですが、SIGTERMmy_exe/opt/a/bin/my_exesystemdpostinst

  • 私はそれがどのようにそれらを傍受するかわかりません。
  • インストールは別のパーティションで行われます。

スクリプトはすべてのパッケージでpostinst同じです。

while IFS=' ' read -r f
do
    if [[ -e "$f" && "$f" == /opt/a/* ]]; then
        chown -h obs.obs $f
    fi
done < "$DPKG_ADMINDIR"/info/$DPKG_MAINTSCRIPT_PACKAGE.list

編集:以下はシステム.serviceファイルです(とても簡単です)。

[Unit]
Description=Extensible and configurable updater manager.

[Service]
ExecStart=/opt/a/bin/my_exe -c /opt/a/etc/config.ini
User=obs
Group=obs
Restart=on-failure
RestartSec=30

[Install]
WantedBy=multi-user.target

EDIT2:さらなる調査は、実行中のサービスの実行可能ファイルがパッケージのインストールに.deb置き換えられたことを示しましたSIGTERM。したがって、systemdは、置き換えられた実行可能ファイルが実行中のプロセスの実行可能ファイルであり、他の実行可能ファイルではないと思うようです。分割。どうやってこれができますか?バインドマウントはプライベートマウントネームスペースで実行され、その中で/opt/a参照する必要があります/mnt/a。私のシェルにバインドマウントが表示されないことを確認しました。

$ findmnt | grep "/opt/a"
|-/opt/a                            /dev/sda6          ext4     rw,relatime,sync,data=ordered

次のように作成されたマウントネームスペース内にバインドマウントが表示された場合unshare

# nsenter -m -t $(pidof update_script.sh) /bin/bash
# findmnt | grep "/opt/a"
|-/opt/a                            /dev/sda6          ext4     rw,relatime,sync,data=ordered
| `-/opt/a                          /dev/sda5          ext4     rw,relatime,sync,data=ordered

関連情報