web-dev-qa-db-ja.com

起動時にsystemdでChromiumを起動する

タスク: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 ;  $  

質問:私が間違っていることと問題の解決方法

3
Hartun

そして今、systemdの答え。

Systemdでそれを行う方法を尋ねたので。 ☺

これは、systemdの人々がこれを行うように人々に伝えてきた方法です。

サービスユニットファイルを完全に間違ったディレクトリに配置しています。 /etc/systemdに入らないでください。 /etc/systemd/systemに入れるべきではありません。 ~marton/.config/systemd/userで入力してください。

これは、自分のアカウントのAegisで実行したいグラフィカルプログラムがper-userサービスではなくsystemサービス。 (現在、スーパーユーザーとしてWWWブラウザを起動しています。これは非常に悪い考えです。それを停止してください!)あなたcould/etc/systemd/userディレクトリ内のallユーザー用に設定しますが、そうではない可能性がありますマシン上のすべてのユーザーがサービスとしてChromiumを開始する必要があります。そのため、具体的には、ユーザーアカウント用にのみ構成してください。

これはユーザーごとのサービスなので、systemctl、sans Sudo--userオプションを使用して操作する必要があります。例えば:

systemctl --user status chrome.service

それは有効化と無効化にも当てはまります。

ユーザーごとのサービスにはWantedBy=default.targetがないため、ユーザーごとのサービスユニットとしてはmulti-user.targetである必要があります。 (私はそれが実際にであるべきだと思いますがWantedBy=your-desktop-session.targetは、使用しているデスクトップによってはgnome-session.targetのようなものになります。 systemdの人々が言っ​​ていることは、この点については驚くほど明確ではありません。)

そして、ユーザーごとのサービスをログインセッションごとのサービスのように見せるためのsystemdの人々の束の一部は、サービスユニットが設定に組み込む必要があるgraphical-sessionメカニズム全体です。

[Unit] 
 PartOf = graphical-session.target

他に何をしなければならないかは、OpenSuSEがgraphical-session bodge全体にどれだけ到達したかによって異なります。これらは2016年にシステム化された人々がプッシュし始めました。 graphical-session.targetの開始/停止とDISPLAY環境変数の注入の両方を回避するシャットダウン。 OpenSuSEにまだこれがない場合は、その部分を記入する必要があるかもしれません。

参考文献

6
JdeBP

私はこれを自分で試してみましたが、あなたがsystemdは、グラフィカルデスクトップアプリの起動に関しては、その仕事には不適切なツールであることがわかりました。簡単なアプローチは、好みのデスクトップ環境の「自動起動アプリ」機能を使用することです。

違いは、systemdDISPLAY環境変数に簡単にアクセスできないのに対し、「アプリの自動起動」アプローチはそうすることです。

1
Mark Stosberg

要するに(さらに JdeBP に加えて):

  1. 絶対に必要でない限り、決してrootを使用しないでください。それらの無数のバグのほとんどが直接発生するため、ブラウザにとっては最低限攻撃者へのrootアクセス。

  2. Systemdファイルを~/.config/systemd/userに配置します

  3. 有効化:例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がアクティブでない場合(古いシステムまたはstableシステムがある可能性があります)、~/.xsessionrcに以下を追加して手動で開始できます。

systemctl --no-block --user start graphical-session.target
1
Suuuehgi

これでうまくいきます。重要なのは、UserServiceを追加することと、DISPLAYEnvironmentを開始することです。

[Unit]
Description=launch chromium

[Service]
User=<user>
Environment=DISPLAY=:0
ExecStart=/usr/bin/chromium-browser

[Install]
[email protected]
0
Hemang Chawla