ユニットファイルは手動で起動すると動作します。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サーバーを実行するには、サーバーに2つのものが必要です。
$DISPLAY
$XAUTHORITY
ユーザーバス(現在のユーザー)で実行されている場合、通常は自動的に設定されます。これらの変数が確実に設定されると、--display
私の設定によって変更される可能性があるため、どちらが良いかを明示的に説明する必要はありません。 Tigervncは異なる場合がありますが、指定しない場合は$DISPLAY
使用したいと思います。--display
では、サービスの起動時にこれらの設定が確実に設定されているかどうかを確認します。
X サーバーが完全に起動して実行される前にユーザーがログインした場合、すぐに設定されないことがあります。このような現象は、GDM を使用して自動的にログインするシステムまたはディスプレイ マネージャを介してログインする前に SSH または TTY でログインする場合に発生します。
Debianシステムで私が使用するソリューションは、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
このソリューションをお勧めします。