유닛 파일은 수동으로 시작할 때 작동합니다. systemctl --user enable
사용자가 로그인한 후에는 서비스가 자동으로 시작되지 않습니다.
유닛 파일
[Unit]
Description = VNC Duplicate Display RDP
After = default.target
[Service]
Type = simple
ExecStart = /opt/tigervnc/usr/bin/x0vncserver -passwordfile /etc/.vncpasswd -display :0
TimeoutSec = 30
RestartSec = 10
Restart = always
[Install]
WantedBy = default.target
장치를 다시 로드하고 다시 활성화했습니다.
$ systemctl --user daemon-reload
$ systemctl --user reenable x0vncserver
상태
사용자 로그인 후 상태
● x0vncserver.service - VNC Duplicate Display RDP
Loaded: loaded (/usr/lib/systemd/user/x0vncserver.service; enabled; vendor preset: enabled)
Active: inactive (dead)
목표 상태
$ systemctl --user --type target
UNIT LOAD ACTIVE SUB DESCRIPTION
basic.target loaded active active Basic System
default.target loaded active active Default
paths.target loaded active active Paths
sockets.target loaded active active Sockets
timers.target loaded active active Timers
LOAD = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB = The low-level unit activation state, values depend on unit type.
5 loaded units listed. Pass --all to see loaded but inactive units, too.
To show all installed unit files use 'systemctl list-unit-files'.
수동 시작
$ systemctl --user start x0vncserver
$ systemctl --user status x0vncserver
● x0vncserver.service - VNC Duplicate Display RDP
Loaded: loaded (/usr/lib/systemd/user/x0vncserver.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2017-08-07 18:27:00 IST; 5s ago
Main PID: 2999 (x0vncserver)
CGroup: /user.slice/user-1004.slice/[email protected]/x0vncserver.service
└─2999 /opt/tigervnc/usr/bin/x0vncserver -passwordfile /etc/.vncpasswd -display :0
Aug 07 18:27:00 Machine systemd[930]: Started VNC Duplicate Display RDP.
Aug 07 18:27:00 Machine x0vncserver[2999]: Mon Aug 7 18:27:00 2017
Aug 07 18:27:00 Machine x0vncserver[2999]: Geometry: Desktop geometry is set to 1920x1080+0+0
Aug 07 18:27:00 Machine x0vncserver[2999]: Main: XTest extension present - version 2.2
Aug 07 18:27:00 Machine x0vncserver[2999]: Main: Listening on port 5900
인용하다
주변을 둘러보며 비슷한 문제가 있는 사용자를 찾았지만 제안된 해결 방법 중 어느 것도 내 문제를 해결하지 못했습니다.
- https://stackoverflow.com/questions/39871883/systemctl-status-shows-inactive-dead
- https://bbs.archlinux.org/viewtopic.php?id=170344
- Systemd 장치가 로드되었지만 비활성(동결)된 이유는 무엇입니까?
- https://github.com/systemd/systemd/issues/4301
- https://github.com/systemd/systemd/issues/2690
- https://superuser.com/questions/955922/enabled-systemd-unit-does-not-start-at-boot
고쳐 쓰다
특정 사용자에게 이런 일이 일어났습니다. systemctl --user enable
적어도 동일한 장치의 다른 사용자 한 명에게는 작동합니다.
답변1
나는 같은 문제가 있었고 그것을 해결한 방법은 다음과 같이 사용하는 것이었습니다.
#!/bin/bash
/usr/bin/x0vncserver -PasswordFile=/home/luserid/.vnc/passwd -display=:0
그렇지 않다면 그럴 것 같습니다 -display=:0
.
답변2
systemd가 VNC 서버를 실행하려면 서버에 두 가지가 필요합니다.
$DISPLAY
$XAUTHORITY
사용자 버스(현재 사용자)에서 실행 중인 경우 일반적으로 자동으로 설정됩니다. 이러한 변수가 안정적으로 설정되면 --display
내 구성에 따라 변경될 수 있으므로 어느 것이 좋은지 명시적으로 설명할 필요가 없다는 것을 알았습니다 . Tigervnc는 다를 수 있지만 지정하지 않으면 $DISPLAY
사용 했으면 좋겠습니다 .--display
그렇다면 서비스를 시작할 때 이러한 설정이 안정적으로 설정되었는지 어떻게 확인합니까?
X 서버가 완전히 가동되어 실행되기 전에 사용자가 로그인하면 즉시 설정되지 않을 수 있습니다. GDM을 사용하여 자동으로 로그인하는 시스템이나 디스플레이 관리자를 통해 로그인하기 전에 SSH 또는 TTY를 통해 로그인하는 경우 이러한 현상이 발생합니다.
데비안 시스템에서 제가 사용하는 솔루션은 Xauthority를 사용할 수 있다고 보장된 후에만 vnc 서버를 실행하는 것입니다. 나는 단위로 감지했습니다 *.path
:
# ~/.config/systemd/user/vnc.path
[Path]
PathExists=%t/gdm/Xauthority
[Install]
WantedBy=default.target
# ~/.config/systemd/user/vnc.service
[Service]
ExecStart=x11vnc -shared -many -nopw
systemctl --user enable vnc.path
당신은 그것을 위해 노력해야 합니다 .
경로 단위는 /run/user/1000/gdm/Xauthority
존재하기를 기다립니다. 이 정보는 사용자가 디스플레이에 액세스할 수 있는 경우에만 존재합니다. 일단 생성되면 경로 단위가 시작 vnc.service
되고 VNC 서버가 시작 $DISPLAY
되고 $XAUTHORITY
자동으로 변수가 설정됩니다.
이 경로는 %t/gdm/Xauthority
Debian의 기본 경로입니다. UID가 1000이 아닌 경우에도 작동하기 때문에 제가 사용하고 싶은 %t
약어입니다 . /run/user/1000
다른 배포판을 사용하는 경우 echo $XAUTHORITY
다른 경로가 필요한지 확인하세요.
참고 사항:
이것systemd
설계관심 대상이 몇 가지 있습니다. default.target
데스크탑 환경 구현과 graphical.target
일부 관계가 있는 기호 링크를 의미합니다(예:).graphical-session.target
gnome-session.target
이론적으로는 WantedBy=graphical-session.target
및를 사용하는 것이 After=graphical-session.target
제가 언급한 것보다 더 간단하고 더 나은 솔루션이지만 *.path
불행히도 구현은 데스크톱 환경에서 수행되어야 하며 아직 모든 데스크톱 환경에서 발생하는 것 같지는 않습니다. graphical-session.target
모든 데스크탑 환경에서 이 문제가 안정적으로 발생하는 것은 아니라는 사실을 발견했기 때문에 *.path
이 솔루션을 권장합니다.