web-dev-qa-db-ja.com

デスクトップのロード後にsystemdユニットを起動するように設定するにはどうすればよいですか?

このようなx0vncserver用のsystemdユニットを作成しました

[Unit]
Description=Remote desktop service (VNC)
After=graphical.target


[Service]
Type=forking
User=user
ExecStart=/usr/bin/sh -c '/usr/bin/x0vncserver -display :0 -rfbport 5900 -passwordfile /home/user/.vnc/passwd &'

[Install]
WantedBy=multi-user.target

実行を有効にしましたが、失敗しました。その後、x0vncserverを使用して元のデスクトップをロードしようとしているときに、デスクトップ自体を完全にロードした後にしか実行できないことに気付きました。デスクトップを読み込んだ後に実行するようにシステムユニットを設定する必要がありますが、どうやって?またはそれを設定するための時間指定された方法?デスクトップセッションツールを使用しても可能かもしれませんが、systemd方式のソリューションはありますか?

そして私のdefault.targetは

#systemctl get-default 
 graphical.target 
3
Pavel Sayekat

ある種の追加の回避策を含まない回答の欠如を調べた後、私はこの解決策を自分で思いつきました。結局のところ、解決策はユニットファイルにありました。「After =」の下で systemd.unit manファイルをチェックアウトしました。現在のユニットを開始する前に、特定のターゲット/サービスを実行する必要があります。 Requires = "だけでは、サービスとその依存関係が同時に起動します。これはそのマニュアルからの引用です:

ユニットfoo.serviceが、Requires =で構成されたユニットbar.serviceを必要とし、After =またはBefore =で構成された順序付けがない場合、foo.serviceがアクティブ化されていれば、両方のユニットが同時に開始され、それらの間の遅延はありません。

したがって、xサーバーとx0vncserverが同時に起動すると、初期化されたxサーバーに接続できないため、x0vncserverは失敗します。これを機能させるには、「DM」を「Requires =」と「After =」に具体的に追加する必要がありました。これが完了すると、追加のマジックなしで毎回機能します。 「nodm.service」エントリを、使用している特定のディスプレイマネージャに置き換える必要があります。「Restart」行は、ログアウトしてセッションを再開することにした場合に備えてあり、Xサーバーを終了してから再起動します。 (nodmを使用しているため)すぐにはわかりませんが、標準のDMを使用してログインするときにxサーバーが実行されるため、これも当てはまると思います。ログインが成功した後、新しいユーザーxセッションが置き換えられて終了します。これの唯一の副作用は、VNCセッションが切断されて再起動する必要があることです。 。

これが私のx0vncserver @ .unitファイルです。

[Unit]
Description=Remote desktop service (VNC)
After=syslog.target network.target multi-user.target nodm.service
Requires=nodm.service

[Service]
Type=simple
ExecStart=/usr/bin/x0vncserver -display %i -rfbport 5900 -securitytypes none
Restart=always
RestartSec=3


[Install]
WantedBy=multi-user.target

追加の注記として、私が「-securitytypes」ディレクティブをより安全なものに変更することをお勧めします。これは、私が唯一のユーザーであり、セキュリティの問題に関与していないローカルネットワークでこれを使用しているためです。

4
dustovich

これはすでに systemdサービスファイルでのDISPLAYの設定 で回答されています。

それが機能しない場合は、ほとんどすべてのデスクトップで提供されている「自動起動」機能を使用することをお勧めします。ただし、systemdを使用することをお勧めします。これは、systemdが失敗した場合にアプリを再起動し、autostart機能はアプリを再起動しないためです。

1
Mark Stosberg