仕事:openSUSEマシンから起動時にChromiumを起動します。
質問:問題はGUIプログラムを起動したいと思います。
これまで:
Mon Aug 14; 06:45:00; marton;/etc/systemd ; $
Mon Aug 14; 06:45:00; marton;/etc/systemd ; $ ls -l
total 24
-rw-r--r-- 1 root root 529 Mar 15 07:20 bootchart.conf
-rw-rw-r-- 1 root root 138 Aug 14 06:34 chorm_start.service
-rw-r--r-- 1 root root 768 Mar 15 07:20 journald.conf
-rw-r--r-- 1 root root 709 Mar 15 07:20 logind.conf
drwxr-xr-x 1 root root 772 Aug 14 05:16 system
-rw-r--r-- 1 root root 1196 Mar 15 07:20 system.conf
drwxr-xr-x 1 root root 0 Mar 15 07:20 user
-rw-r--r-- 1 root root 992 Mar 15 07:20 user.conf
Mon Aug 14; 06:45:00; marton;/etc/systemd ; $ sudo chmod 664 chorm_start.service
root's password:
Mon Aug 14; 06:45:19; marton;/etc/systemd ; $ ls -l
total 24
-rw-r--r-- 1 root root 529 Mar 15 07:20 bootchart.conf
-rw-rw-r-- 1 root root 138 Aug 14 06:34 chorm_start.service
-rw-r--r-- 1 root root 768 Mar 15 07:20 journald.conf
-rw-r--r-- 1 root root 709 Mar 15 07:20 logind.conf
drwxr-xr-x 1 root root 772 Aug 14 05:16 system
-rw-r--r-- 1 root root 1196 Mar 15 07:20 system.conf
drwxr-xr-x 1 root root 0 Mar 15 07:20 user
-rw-r--r-- 1 root root 992 Mar 15 07:20 user.conf
Mon Aug 14; 06:45:20; marton;/etc/systemd ; $ cat chorm_start.service
[Unit]
Description="Starting chromium on startup"
[Service]
ExecStart=/usr/lib64/chromium/chromium
[Install]
WantedBy=multi-user.target
Mon Aug 14; 06:45:38; marton;/etc/systemd ; $ sudo systemctl status chorm_start
chorm_start.service - "Starting chromium on startup"
Loaded: loaded (/etc/systemd/chorm_start.service; enabled)
Active: failed (Result: exit-code) since Mon 2017-08-14 06:38:44 EEST; 7min ago
Process: 853 ExecStart=/usr/lib64/chromium/chromium (code=exited, status=1/FAILURE)
Main PID: 853 (code=exited, status=1/FAILURE)
Aug 14 06:38:47 date chromium[853]: Unable to init server: Could not connect: Connection refused
Aug 14 06:38:47 date chromium[853]: [853:853:0814/063844.727638:ERROR:browser_main_loop.cc(279)] Gtk: cannot open display:
Mon Aug 14; 06:46:35; marton;/etc/systemd ; $
質問:私は何が間違っていて、どのように解決するのですか?
答え1
今systemdに答えがあります。
systemdを使ってこれを行う方法を尋ねられたからです。 ☺
これがシステム化された人々が人々にそうするように言う方法です。
サービス単位ファイルを正確に間違ったディレクトリに入れました。入ってはいけません/etc/systemd
。入ってはいけません/etc/systemd/system
。それは入るべきです~marton/.config/systemd/user
。
アカウントのサポートの下で実行したいグラフィックプログラムユーザーごとサービスではありませんシステム提供する。 (現在スーパーユーザーとしてWWWブラウザを呼び出しています。これは非常に悪い考えです。この練習を中止してください。今! ) あなたできる次のように設定してください。みんなディレクトリ内のユーザー/etc/systemd/user
ですが、システム内のすべてのユーザーがChromiumをサービスとして起動する必要はありません。したがって、ユーザーアカウントに合わせて特別に設定してください。
ユーザー固有のサービスなので、sans--user
オプションを使用して運営する必要があります。たとえば、systemctl
sudo
systemctl -- ユーザー状態 chrome.service
これは有効化と無効化にも当てはまります。
ユーザー固有のサービス単位にはユーザー固有のサービスがWantedBy=default.target
ないためです。multi-user.target
(そうすべきだと思いますが、実際に使用しているデスクトップによって異なります。この点についてシステム化された人々が何を言っているのかは不明です。 )WantedBy=your-desktop-session.target
gnome-session.target
ユーザーがユーザーごとのサービスをログインセッションごとのサービスのように見せたいと思うsystemdの一部は、graphical-session
サービスユニットが設定とマージされる必要がある完全なメカニズムです。
[単位] PartOf=グラフィック session.target
その他のことは、graphical-session
OpenSuSEが2016年から推進し始めたOpenSuSEの発展の方向によって異なります。 UbuntuとDebianは、GUIログインセッションを開始および終了するための複雑なビハインドシェルスクリプトセットを提供し、起動/停止および環境変数のgraphical-session.target
注入を可能にします。DISPLAY
OpenSuSEにまだこのエントリがない場合は、このセクションを作成する必要があります。
追加読書
- Lennart Petlinget al。 (2016). systemd.special。システムのマニュアルページ。 freedesktop.org.
- マーティンフィート(2016-07-25)。単位: graphic-session.target ユーザー単位を追加。システムエラー#3678。
- マーティンフィート(2016-09-29)。グラフィックセッション。。 systemd.conf. YouTube。
- イアン・レーン(2017-07-30)。GNOMEユーザーセッションでシステム化。 GUADEC 2017。YouTube。
答え2
簡単に言うと(除くジェイドBP):
root
必ず必要な場合以外は使用しないでください。これはブラウザの場合に特にそうです。これは、ブラウザのほとんどのバグが攻撃者が直接rootアクセス権を取得できるためです。システムファイル
~/.config/systemd/user
有効: 例:
systemctl --user enable firefox
~/.config/systemd/user/firefox.service
:
[Unit]
Description=Start Firefox
PartOf=graphical-session.target
[Service]
ExecStart=/usr/bin/firefox
Type=oneshot
[Install]
WantedBy=graphical-session.target
起動時にFirefoxが起動します。
graphical-session.target
うまくいかない場合(ログインマネージャ、ディスプレイマネージャ、またはGoogleが他のアイテムを管理していることを知っているため)、他にsystemctl --user status *.target
何があるかを確認してください。
グラフィックログインが有効になっていない場合graphical-session.target
(以前のバージョンまたは安定システム)に以下を追加するだけです~/.xsessionrc
。
systemctl --no-block --user start graphical-session.target
答え3
私が自分で試した結果、あなたが見つけたように、systemd
グラフィックデスクトップアプリケーションを起動するときに使用するのは間違ったツールです。これを行う簡単な方法は、お気に入りのデスクトップ環境の「アプリケーションの自動実行」機能を使用することです。
違いは、環境変数にsystemd
簡単にアクセスできないDISPLAY
のに対し、「アプリケーションの自動起動」方法はアクセスできることです。
答え4
これは私にとって効果的です。キーは、User
に追加してService
からDISPLAY
始めることですEnvironment
。
[Unit]
Description=launch chromium
[Service]
User=<user>
Environment=DISPLAY=:0
ExecStart=/usr/bin/chromium-browser
[Install]
[email protected]