안녕하세요, 내 프로세스(및 그 하위 프로세스)가 a를 수신 SIGTERM
하고 보낸 사람이 (PID == 1)인 경우 systemd
매우 이상한 상황이 발생합니다 . 내 설정은 다음과 같습니다.
/opt/a
두 개의 "시메트릭" 파티션이 및 에 설치됩니다/mnt/a
. 하나는 기본 파티션이고 다른 하나는 보조 파티션입니다.- 특정 조건에서 일부 아카이브를 다운로드하고 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