现在,systemd 给出了答案。

现在,systemd 给出了答案。

任务:在 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 来做到这一点。 ☺

这就是 systemd 的人们告诉人们这样做的方式。

您将服务单元文件放在完全错误的目录中。它不应该进去/etc/systemd。它甚至不应该进去/etc/systemd/system。它应该进去~marton/.config/systemd/user

这是因为您想要在自己的帐户支持下运行的图形程序是每个用户服务不是系统服务。 (您当前正在以超级用户身份调用 WWW 浏览器。这是一个非常糟糕的主意。停止这种做法现在!) 你可以将其配置为全部目录中的用户/etc/systemd/user,但可能并非计算机上的所有用户都需要将 Chromium 作为服务启动。因此,请专门为您的用户帐户配置它。

由于它是每用户服务,因此您应该使用, sans--user选项来操作它。例如:systemctlsudo

systemctl --用户状态 chrome.service

这也适用于启用和禁用它。

作为每用户服务单位,应该是这样WantedBy=default.target,因为没有multi-user.target针对每用户服务。 (虽然我怀疑应该实际上be ,这取决于您使用的桌面。 systemd 的人在这一点上所说的并不是非常清楚。)WantedBy=your-desktop-session.targetgnome-session.target

systemd 人们希望使每用户服务看起来像每登录会话服务的一部分是整个graphical-session机制,您的服务单元必须将其与设置合并:

[单元]
PartOf=图形会话.target

你还需要做什么取决于 OpenSuSE 在整个graphical-session过程中已经取得了多大的进展,systemd 人们在 2016 年开始推动这一过程。Ubuntu 和 Debian 在 GUI 登录会话启动和关闭中提供了一整套混乱的幕后 shell 脚本,这使得启动/停止graphical-session.target和注入DISPLAY环境变量。如果您的 OpenSuSE 还没有这个,您可能需要填写该部分。

进一步阅读

答案2

简而言之(除了杰德BP):

  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图形登录后未激活(您可能有旧的或稳定的系统),您可以通过将以下内容添加到您的~/.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]

相关内容