こんにちは、私のプロセス(およびその子プロセス)がaを受け取り、送信者がSIGTERM
(PID == 1)である場合、systemd
非常に奇妙な状況が発生します。私の設定は次のとおりです。
/opt/a
2つの「シメトリック」パーティションがおよびにインストールされます/mnt/a
。 1つはプライマリパーティション、もう1つはセカンダリパーティションです。- 特定の条件でいくつかのアーカイブをダウンロードし、bashスクリプトを実行してインストールする実行中の
systemd
サービスユニット(で実行可能)/opt/a/bin/my_exe
.deb
- packageで参照されるファイル階層のため、
/opt/a
スクリプトはインスタンスを起動し、unshare
onのバインドマウントを実行し、パッケージのインストールを呼び出します。/mnt/a
/opt/a
dpkg
#!/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
すべてのパッケージでは、エラーなしでインストールが完了します。また、手動で起動すると、すべてが正常です。何らかの理由で認知問題を引き起こすパッケージの特定のステップが気に入らないようですが、SIGTERM
my_exe
/opt/a/bin/my_exe
systemd
postinst
- 私はそれがどのようにそれらを傍受するかわかりません。
- インストールは別のパーティションで行われます。
スクリプトはすべてのパッケージで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