사용자 서비스를 시작하고 사용자가 로그인할 때만 시작되도록 Ubuntu 패키지를 어떻게 설정합니까?

사용자 서비스를 시작하고 사용자가 로그인할 때만 시작되도록 Ubuntu 패키지를 어떻게 설정합니까?

X-Windows 및 DBus에 대한 액세스가 필요한 서비스를 설정하려고 합니다. 처음에는 백그라운드 앱으로 만들어 보았지만 작동하지 않았습니다. "자동 로그인 사용자" 기능을 사용합니다. 이제 자동 로그인 사용자(예 alexis: )로 서비스를 실행해야 한다고 생각합니다. 내 문제는 해당 사용자로 실행되는 서비스(예: 설정 User=alexisGroup=alexis변수) 를 쉽게 만들 수 있다는 것입니다. 환경변수( DISPLAY=:0)도 추가해야 했습니다. 그러나 서비스는 여전히 시스템 서비스로 시작됩니다.

내 아이디어는 사용자가 로그인할 때 시작되는 방식으로 서비스를 만드는 것입니다. 실행하면 많은 systemd 항목이 표시됩니다.

systemctl --user list-units

그러나 이러한 서비스 파일을 생성하고 전체 OS가 아닌 사용자를 위한 서비스를 생성하기 위해 Ubuntu 패키지 생성 도구 체인을 얻는 방법을 잘 모르겠습니다.

프로젝트 폴더 my-daemon.service에 남아 있는 현재 파일은 다음과 같습니다 .debian

# Documentation available at:
# https://www.freedesktop.org/software/systemd/man/systemd.service.html

[Unit]
Description=Daemon

[Service]
Type=simple
WorkingDirectory=~
ProtectHome=false
NoNewPrivileges=true
ExecStart=/usr/sbin/my-daemon
ExecStop=kill "$MAINPID"
Restart=on-failure
RestartSec=1min
User=alexis
Group=alexis
LimitNPROC=1000

[Install]
WantedBy=xsession.target

그래서 아래에 서비스 파일이 설치되는데 /lib/systemd/system제 경우에는 잘못된 것 같습니다. 그렇지 않으면 예상대로 작동하는 것처럼 보이지만... 사용자별 단위가 올바르게 설정되었는지 실제로 100% 확신할 수 없습니다. 주변을 둘러봤지만 사용자 단위에 대한 정보를 많이 찾을 수 없습니다. 일급비밀사항인거같은데...

답변1

@ajgringo619 및 @meuh의 의견을 바탕으로 다음 솔루션을 사용하게 되었습니다.

  1. my-daemon.service 파일을 수동으로 설치

    my-daemon.service프로젝트 debian디렉터리에서 다른 디렉터리(내가 사용하는 디렉터리)로 이동 했습니다 conf.

  2. .install서비스를 사용자 서비스로 설치하기 위해 내 프로젝트 파일에 줄을 추가했습니다.

     conf/my-daemon.service      /usr/lib/systemd/user/.
    

    이것도 보세요아치리눅스 페이지(링크 제공: @meuh)

  3. 서비스 활성화

    설치를 실행할 때 해당 사용자에 대해 dbus가 실행되지 않기 때문에 이 작업을 수행할 수 없습니다 systemctl(즉, 내 계정에서 설치하고 설치 패키지가 존재하지만 비활성인 "newuser"를 생성합니다). 그래서 서비스를 활성화하려면수동소프트 링크를 만듭니다.

    이를 위해서는 약간의 작업이 필요합니다. 먼저 폴더가 있는지 확인하고 소프트 링크를 만든 다음 사용자 소유권을 수정하세요.

     mkdir -p /home/newuser/.config/systemd/user/default.target.wants
     ln -s /usr/lib/systemd/user/my-daemon.service /home/newuser/.config/systemd/user/default.target.wants/.
     chown -R newuser:newuser /home/newuser/.config/systemd
    
  4. 청소하다

    (3)과 반대되는 방법을 원하시면 소프트링크를 제거하시고 해당 폴더를 삭제하셔야 합니다. -f이 옵션이 제거된 경우 해당 옵션을 사용하시고 rmdir에서 사용하시기 바랍니다 --ignore-fail-on-non-empty. 의 경우 rmdir가장 깊은 것부터 하나씩 삭제해야 설치 전과 비슷한 상태가 됩니다.

  5. 자동으로 시작하시겠습니까?

    (3)에서 생성된 링크가 자동으로 시작(활성화)되고, 컴퓨터를 다시 시작하거나 로그아웃했다가 다시 로그인하면 새 사용자와 장치가 자동으로 시작됩니다. 물론 이는 서비스가 제대로 작동한다는 가정 하에 이루어집니다. 당신의~ 고 싶어요올바르게 정의되었습니다.

     [Install]
     WantedBy=default.target
    

    사용자 서비스에서 작동하지 않는 다른 옵션이 있습니다. 예를 들어 User=...또는 옵션을 지정할 수 없습니다 Group=.... 이러한 오류는 해당 저널에 나타날 것입니다

     journalctl --user -u my-daemon
    

    중요: 이는 --user매우 중요합니다. 이전에 서비스를 시스템 서비스로 실행한 경우 --user시스템 서비스의 로그는 볼 수 있지만 사용자 로그의 내용은 볼 수 없습니다.

또 다른 세부 사항은 창을 열어야 하고 창이 작동하려면 환경 변수를 추가해야 한다는 것입니다.

Environment="DISPLAY=:0"

장치 로그에 표시되는 오류를 기반으로 이러한 조정을 수행해야 합니다.

관련 정보