두 개의 스크립트 파일, 두 개의 시스템 서비스 및 tar 파일을 설치하는 자작 데비안 패키지가 있습니다. 손으로 만든 관리자 스크립트에는 preinst, post inst, prerm 및 postrm이 있습니다.
현재 겪고 있는 문제는 dpkg --purge <PACKAGE>
프로세스를 실행할 때 무언가에 의해 프로세스가 종료된다는 것입니다(무엇인지 잘 모르겠습니다).
root@host:/data# dpkg --purge <PACKAGE>
(Reading database ... 32393 files and directories currently installed.)
Removing <PACKAGE> (<VERSION) ...
Terminated
root@host:/data# echo $?
143
root@host:/data#
두 번째로 동일한 명령을 실행했을 때 제대로 작동했습니다.
root@host:/data# dpkg --purge <PACKAGE>
(Reading database ... 32393 files and directories currently installed.)
Removing <PACKAGE> (<VERSION>) ...
dpkg: warning: while removing <PACKAGE>, unable to remove directory '/data': Device or resource busy - directory may be a mount point?
Purging configuration files for <PACKAGE> (<VERSION>) ...
dpkg: warning: while removing web-chroot, unable to remove directory '/data': Device or resource busy - directory may be a mount point?
root@host:/data#
노트: /data
실제로 마운트 지점이고 다른 데비안 패키지에 속하지 않으므로 dpkg
제거하려고 시도했지만 실패했습니다. 이는 데비안 구현에서 예상되는 동작이어야 합니다 dpkg
.
내 질문은,dpkg --purge 프로세스가 처음 실행될 때 종료되는 이유는 무엇입니까?무엇이 그것을 죽일 것인가?
다음을 포함한 다양한 로그를 확인해 보았습니다.
/var/log/dpkg.log
/var/log/apt/history.log
/var/log/apt/term.log
/var/lib/dpkg/info/<PACKAGE>.*
(.list
,.prerm
,.postrm
,.preinst
,.postinst
)
그러나 무슨 일이 일어나고 있는지에 대한 유용한 정보를 제공하는 것은 없습니다.
노트:Debian 8 32비트 시스템에 설치된 Debian 패키지
세부 사항:
데비안 패키지는 다음 위치에 파일을 설치합니다:
/~/start-fs.sh
/~/stop-fs.sh
/data/file-system_<VERSION>.tar.gz
/etc/systemd/system/file-system.service
/etc/systemd/system/file-system-helper.service
관리자 스크립트는 다음과 같습니다.
preinst
#!/bin/bash
# Stop services if they are running and disable them
systemctl is-active --quiet file-system && systemctl stop file-system > /dev/null 2>&1 || true
sleep 1
systemctl disable --quiet file-system.service || true
systemctl is-active --quiet file-system-helper && systemctl stop file-system-helper > /dev/null 2>&1 || true
# Remove any previous tars that could share the same name as the tar artifact
rm -f /data/file-system*.tar.gz
exit 0
postinst
#!/bin/bash
error() {
echo "$1"
exit 1
}
# Untar the artifact in the /data directory
tar -xzf /data/file-system*.tar.gz --directory /data || error "Could not untar artifact"
# Remove tar artifact, as it has already been untarred
rm -f /data/file-system*.tar.gz
# Restart systemctl daemon to let it know about new service files
systemctl daemon-reload
# Enable service if it is not running and enable it
systemctl is-active --quiet file-system || systemctl start file-system
systemctl enable --quiet file-system.service
exit 0
prerm
#!/bin/bash
# Stop services if they are running and disable them
systemctl is-active --quiet file-system && systemctl stop file-system.service > /dev/null 2>&1 || true
sleep 3
systemctl disable --quiet file-system.service || true
systemctl is-active --quiet file-system-helper && systemctl stop file-system-helper.service > /dev/null 2>&1 || true
exit 0
postrm
#!/bin/bash
# Remove scripts
rm -f /root/start-fs.sh
rm -f /root/stop-fs.sh
# Remove fs in data dir
rm -rf /data/file-system/
# Remove any possible leftover artifacts (shouldn't be any)
rm -f /data/file-system*.tar.gz
# Remove systemd services
rm -f /etc/systemd/system/file-system-helper.service
rm -f /etc/systemd/system/file-system.service
exit 0
dpkg -s <PACKAGE>
처음 실행 하면 이렇게 됩니다.half-configured
dpkg
수단 에 따라The package is unpacked and configuration has been started, but not yet completed for some reason.
root@host:/data# dpkg -s <PACKAGE>
[...]
Status: purge ok half-configured
[...]
또한 스크립트를 수동으로 실행한 다음 패키지를 설치한 후 수동으로 실행하면 ./prerm
제거가 성공하고 파일이 올바르게 삭제됩니다../postrm
dpkg -i <PACKAGE>
답변1
유지관리자 스크립트에서 dpkg가 수행해야 하는 작업을 다시 구현하려고 시도하고 있지만 이러한 호출이 이루어지는 모든 방식을 고려하지 않은 것 같습니다.
예를 들어 업그레이드 프로세스 중에 prerm 및 postrm도 호출됩니다!
내 조언은 tar의 이상한 춤을 피하고 .deb에서 직접 파일을 제공하고 .deb와 함께 제공되는 모든 파일을 수동으로 삭제하는 것을 중지하는 것입니다. 필요할 때 dpkg가 포장 풀기와 제거를 처리하도록 하세요.
그런 다음 데비안 정책이나 다양한 deb-man 페이지에서 systemd가 호출되는 시점에 대한 유지관리자 스크립트 흐름도를 확인해야 합니다(현재로서는 매우 상세하지는 않지만).