너무 길어요.

너무 길어요.

nfancurve.service로그인할 때마다 사용자 서비스가 실행되기를 원합니다 . 이전에는 명령을 사용하여 서비스를 활성화했지만 systemctl --user enable nfancurve.service새 세션(재부팅 포함)을 시작할 때마다 서비스가 활성화되었음에도 불구하고 실행되지 않았습니다. 로그인 후 다음 명령을 실행하여 이를 확인했습니다.

name@machine:~$ systemctl --user is-active nfancurve.service
inactive
name@machine:~$ systemctl --user is-enabled nfancurve.service
enabled
name@machine:~$ systemctl --user start nfancurve.service
name@machine:~$ systemctl --user is-active nfancurve.service
active

다음은 상태 로그입니다 systemctl --user status nfancurve.service.

● nfancurve.service - Nfancurve service
     Loaded: loaded (/usr/lib/systemd/user/nfancurve.service; enabled; vendor preset: enabled)
     Active: inactive (dead)

완전한 정보를 얻으려면 이 서비스는 다음에서 제공됩니다.이 저장소, AUR에서 설치했습니다. 파일 .service은 다음과 같습니다.

[Unit]
Description=Nfancurve service
After=graphical-session.target
Requires=graphical-session.target

[Service]
ExecStart=/bin/sh /usr/bin/nfancurve -c /etc/nfancurve.conf
KillSignal=SIGINT

[Install]
WantedBy=graphical-session.target

마지막 줄을 다음으로 변경해 보았지만 WantedBy=default.target재부팅하고 로그인한 후에도 서비스가 여전히 시작되지 않습니다. 내 데스크톱 환경은 xfce입니다 graphical-session.target.

로그인할 때마다 자동으로 시작되도록 하려면 어떻게 해야 합니까?

답변1

너무 길어요.

로 변경 .WantedBy=graphical-session.targetWantedBy=default.target

가설

[Install]귀하의 문제가 서비스 파일 섹션 에 있다고 생각됩니다 . 시스템 장치의 경우 multi-user.target설치에 따라 괜찮을 수 있지만 사용자 장치의 경우 동등한 설치는 입니다 default.target. 보다systemd.special(7) 맨페이지더 알아보기.

| system target     | near-equivalent user target |
|-------------------|-----------------------------|
| multi-user.target | default.target              |
| graphical.target  | graphical-session.target    |

관심을 가질 만한 다른 목표는 graphical-session-pre.target또는 입니다 xdg-desktop-autostart.target.

기본.targetMVCE

다음은 Debian 11 시스템에서 방금 시도한 최소한의 예입니다.

서비스 파일:

$ systemctl --user cat simpleuser.service
# /home/stew/.config/systemd/user/simpleuser.service
[Unit]
Description=Simple User Service

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/true

[Install]
WantedBy=default.target

나는 그것을 설치했다:

$ systemctl --user enable simpleuser.service
Created symlink /home/stew/.config/systemd/user/default.target.wants/simpleuser.service → /home/stew/.config/systemd/user/simpleuser.service.

다시 시작하면 서비스가 활성화된 것을 볼 수 있습니다.

$ systemctl --user status simpleuser.service
● simpleuser.service - Simple User Service
     Loaded: loaded (/home/stew/.config/systemd/user/simpleuser.service; enabled; vendor preset: enable>
     Active: active (exited) since Sun 2020-07-12 10:12:54 CEST; 13min left
    Process: 1127 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
   Main PID: 1127 (code=exited, status=0/SUCCESS)

Jul 12 10:12:54 stewbian systemd[1106]: Starting Simple User Service...
Jul 12 10:12:54 stewbian systemd[1106]: Finished Simple User Service.

하위 상태를 알고 싶다면 다음 과 같은 것을 (exited)사용하면 얻을 수 있습니다 .Type=simpleExecStart=/bin/sleep infinity(running)

그래픽 세션 목표 질문

버그 보고서에서 귀하의 문제를 발견했습니다.깃허브에서.

graphic-session.target 기반으로 설치하는 경우 시작되지 않을 수 있습니다. 나는 이것을 KDE/i3 설정에서 실행하고 기본 Gnome3 설정에서 재현했습니다.

$ systemctl --user status graphical-session.target
● graphical-session.target - Current graphical user session
     Loaded: loaded (/usr/lib/systemd/user/graphical-session.target; static; vendor preset: disabled)
     Active: inactive (dead)
       Docs: man:systemd.special(7)

DE가 의도한 대로 실제로 이를 달성하지 못하는 것 같습니다. 이 경우에는 을 사용하십시오 WantedBy=default.target. 귀하의 스크립트는 GUI 기반인 것처럼 보이지 않으므로 default.target괜찮을 것입니다. 그렇지 않으면 섹션 After=graphical.target에서 사용하는 것을 고려할 수 있습니다 [Unit].

~에 따르면systemd.special(7) 맨페이지, DE(예: ) graphical-session.target여야 합니다 . 이런 식으로 Gnome이 시작되면 graphic-session.target이 발생합니다. dbus 객체를 검사해 보면, 이를 발생시키는 대상과 아무런 관계가 없음을 분명히 알 수 있습니다.BoundBy={gnome,kde,xfce}-session.target

$ busctl introspect --user org.freedesktop.systemd1 \
    /org/freedesktop/systemd1/unit/graphical_2dsession_2etarget \
    org.freedesktop.systemd1.Unit
NAME                             TYPE      SIGNATURE RESULT/VALUE                             FLAGS
.ActiveState                     property  s         "inactive"                               emits-change
.After                           property  as        2 "simpleuser.service" "basic.target"    const
.Before                          property  as        1 "shutdown.target"                      const
.BindsTo                         property  as        0                                        const
.BoundBy                         property  as        0                                        const
.Conflicts                       property  as        1 "shutdown.target"                      const
.ConsistsOf                      property  as        2 "gnome-terminal-server.service" "duns… const
.Description                     property  s         "Current graphical user session"         const
.Documentation                   property  as        1 "man:systemd.special(7)"               const
.LoadState                       property  s         "loaded"                                 const
.Names                           property  as        1 "graphical-session.target"             const
.PartOf                          property  as        0                                        const
.RequiredBy                      property  as        0                                        const
.Requires                        property  as        1 "basic.target"                         const
.SubState                        property  s         "dead"                                   emits-change
.UnitFilePreset                  property  s         "disabled"                               -
.UnitFileState                   property  s         "static"                                 -
.WantedBy                        property  as        0                                        const
.Wants                           property  as        1 "simpleuser.service"                   const

나는 메일링 리스트를 조사한 결과 {gnome,kde,xfce}-session.target이 ​​제안이 불과 4년 전에 gnome, kde 및 xfce에서 이러한 *.target파일을 보내도록 하기 위해 만들어졌다는 것을 발견했습니다. 이런 일은 아직 일어나지 않았습니다. 그러므로 기록이 있어도 불완전하다. 따라서 아직은 사용하면 안 됩니다 graphical-session.target.

답변2

마침내 해결책을 찾았습니다(Stuart와 다른 사람들에게 감사드립니다). 원래 서비스 파일을 변경했습니다.

[Unit]
Description=Nfancurve service
After=graphical-session.target
Requires=graphical-session.target

[Service]
ExecStart=/bin/sh /usr/bin/nfancurve -c /etc/nfancurve.conf
KillSignal=SIGINT

[Install]
WantedBy=graphical-session.target

Requires 행을 제거하고 by( 및 행 포함 ) graphical-session.target의 모든 인스턴스를 대체합니다 . 결과적으로 현재 서비스 파일이 생성됩니다.default.targetAfterWantedBy

[Unit]
Description=Nfancurve service
After=default.target

[Service]
ExecStart=/bin/sh /usr/bin/nfancurve -c /etc/nfancurve.conf
KillSignal=SIGINT

[Install]
WantedBy=default.target

이제 컴퓨터를 시작하고 로그인하면 서비스가 활성화됩니다.

답변3

.service 파일은 다음과 같아야 합니다.

[Unit]
Description=Spark service

[Service]
ExecStart=/path/to/spark/sbin/start-all.sh

[Install]
WantedBy=multi-user.target

이제 .service 파일을 활성화하고 사용하려면 몇 가지 단계를 더 수행하세요.

  1. myfirst.service라는 이름으로 /etc/systemd/system 폴더에 넣습니다.
  2. 스크립트가 실행 가능한지 확인하세요.
chmod u+x /path/to/spark/sbin/start-all.sh
  3. 시작하세요:
sudo systemctl start myfirst
  4. 시작 시 실행되도록 설정합니다.
sudo systemctl enable myfirst
  5. 멈추다:
sudo systemctl stop myfirst

관련 정보