![시스템 사용자 서비스를 활성화하는 DEB postinst 스크립트를 만드는 방법은 무엇입니까?](https://linux55.com/image/173539/%EC%8B%9C%EC%8A%A4%ED%85%9C%20%EC%82%AC%EC%9A%A9%EC%9E%90%20%EC%84%9C%EB%B9%84%EC%8A%A4%EB%A5%BC%20%ED%99%9C%EC%84%B1%ED%99%94%ED%95%98%EB%8A%94%20DEB%20postinst%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EB%A5%BC%20%EB%A7%8C%EB%93%9C%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
systemd 사용자 서비스를 설치하기 위해 DEB 파일을 생성하고 설치 후 postinst 스크립트를 사용하여 서비스를 활성화해 보았습니다. 이것은 내 postinst 스크립트입니다.
#!/bin/bash
set -e
systemctl --user enable myservice.service
DEB()를 설치하면 dpkg --install mypackage.deb
postinst 스크립트가 실행되고 다음 오류 메시지가 반환됩니다.
버스에 연결할 수 없습니다. 해당 파일이나 디렉터리가 없습니다.
시스템 서비스도 사용할 수 없고, 패키지도 공개되지 않기 때문에 어떤 패키징 표준도 신경쓰지 않습니다. 이 일을 하기 위해 제가 할 수 있는 일이 있나요?
이것이 가능하지 않다면 부팅할 때마다 활성화되도록 init 스크립트에 추가하겠습니다. 그러나 가능하다면 이를 피하고 싶습니다.
답변1
당신이하려는 일이 작동하지 않을 것입니다. 설치를 수행하는 사용자를 위해 systemd 서비스를 설치하는 것은 그다지 유용하지 않습니다. 해당 사용자는 항상 루트이기 때문입니다. 따라서 서비스를 모든 사용자에 대한 시스템 전체 서비스로 설치하는 규칙을 따라야 합니다. 이를 수행하는 표준 방법은 다음과 같습니다.
요즘 대부분의 패키지는 debhelper를 사용합니다. 이는 프로세스를 크게 단순화합니다. 다음 단계에 따라 시작하세요. 보다데비안 위키의 시스템 패키징 가이드더 많은 정보를 알고 싶습니다.
dh_systemd 활성화
debhelper compat 레벨 10( Build-Depends
합계 부분 확인)을 사용하면 dh-systemd가 자동으로 활성화되며 이 부분을 건너뛸 수 있습니다. 이전 debhelper 호환성 수준의 경우 다음 단계에 따라 활성화해야 합니다.debian/control
debian/compat
dh-systemd (>=1.5)
에 추가하세요 .Build-Depends
debian/control
- 라인
--with systemd
에 추가하세요 .dh $@
debian/rules
dh_systemd 사용
debian/
설치할 수 있도록 시스템 장치 파일을 여기에 넣으십시오 . Debhelper는 패키지 설치 중에 이를 자동으로 감지하고 활성화합니다.
postinst
참고: 및 스크립트 postrm
에 아무것도 추가할 필요가 없습니다 . debhelper가 자동으로 이러한 작업을 처리합니다. 또한 수동 방법은 systemctl
실행 파일에 의존하므로 사용자가 패키지를 설치할 때 systemd가 설치된 시스템에서만 작동한다는 점을 명심하십시오 . debhelper 메소드는 systemd가 설치되지 않은 경우에도 systemd 서비스를 활성화합니다. 사용자가 나중에 systemd로 전환하면 서비스가 이미 활성화되어 있습니다. debhelper 접근 방식은 패키지가 이전 Sys-V 스타일 초기화 스크립트와 systemd 단위 파일과 함께 제공되는 경우에도 잘 작동합니다.
미리 이용하세요
특별한 요구 사항이 있는 경우(여러 개의 유닛 파일을 설치하지만 그 중 일부만 활성화하는 등) 의 대상을 재정의 dh_systemd_enable
하고 추가 매개변수를 지정할 수 있습니다. 보다dh_systemd_start
debian/rules
dh_systemd_enable 매뉴얼 페이지그리고dh_systemd_start더 알아보기.
답변2
Martin Conrad가 말한 대로 --user
서비스를 그대로 설치해 보세요.뿌리사용자 여러분, 이것이 원하는 것이 아닐 수도 있습니다.
내 경우에는 이 문제가 있었지만 오디오 시스템에 액세스해야 했기 때문에 사용자를 위한 서비스를 설치해야 했고 시스템이 특정 최종 사용자에 대해 설정되어 있고 해당 최종 사용자가 로그인한 경우에만 작동했습니다. - 내 임베디드 시스템의 경우입니다.)
다음은 사용자별 서비스를 설정하는 데 사용하는 몇 줄의 코드입니다.
# Manually enable "service-name" for USER_NAME
USER_NAME=nobody
mkdir -p /home/${USER_NAME}/.config/systemd/user/default.target.wants
chown -R ${USER_NAME}:${USER_NAME} /home/${USER_NAME}/.config/systemd
rm -f /home/${USER_NAME}/.config/systemd/user/default.target.wants/service-name.service
sudo -H -u ${USER_NAME} sh -c "ln -s /usr/lib/systemd/user/service-name.service /home/${USER_NAME}/.config/systemd/user/default.target.wants/service-name.service"
서비스를 활성화하려는 사용자의 이름을 편집하십시오( USER_NAME=...
).
service-name
사용자 서비스의 이름으로 바꾸십시오 . 예를 들어 사운드를 관리하는 경우 이를 이라고 부를 수 있습니다 sound-manager
.
참고 1:스크립트에서는 사용자가 에서 생성되었다고 가정합니다 /home/<username>
. 다른 사용자를 사용하는 경우 상황에 맞게 이를 조정해야 합니다(예: 계정이 root
아래에 표시되고 /root
Debian/Ubuntu의 Apache2 계정이 아래에 표시되는 /var/www
등).
노트 2:이 모든 일을 어떻게 했나요? ! 사실, 나는 대본 자체를 발명하지 않았습니다. 로 로그인하면 $USER_NAME
다음 명령을 사용하여 서비스를 활성화할 수 있습니다.
systemctl enable --user service-name
그러면 위에 표시된 디렉터리와 링크가 생성됩니다. 상황이 변경되거나 다른 디렉터리에 저장되면 systemctl
수행된 작업을 복제하기 위해 명령을 조정해야 할 수도 있습니다.
노트 3:모든 사용자에 대해 설치할 수 있습니다. 이름 위에 루프를 추가 /home/*
하고 각 이름에 대해 명령을 반복하십시오. 새 사용자가 생성될 때 실행되는 스크립트 세트도 있습니다. 그러한 서비스가 필요하지 않기를 바랍니다. 이러한 서비스는 각 사용자가 스스로 활성화하도록 하는 것이 가장 좋다고 생각합니다.