![现在,systemd 给出了答案。](https://linux22.com/image/116079/%E7%8E%B0%E5%9C%A8%EF%BC%8Csystemd%20%E7%BB%99%E5%87%BA%E4%BA%86%E7%AD%94%E6%A1%88%E3%80%82.png)
任务:在 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
选项来操作它。例如:systemctl
sudo
systemctl --用户状态 chrome.service
这也适用于启用和禁用它。
作为每用户服务单位,应该是这样WantedBy=default.target
,因为没有multi-user.target
针对每用户服务。 (虽然我怀疑应该实际上be ,这取决于您使用的桌面。 systemd 的人在这一点上所说的并不是非常清楚。)WantedBy=your-desktop-session.target
gnome-session.target
systemd 人们希望使每用户服务看起来像每登录会话服务的一部分是整个graphical-session
机制,您的服务单元必须将其与设置合并:
[单元] PartOf=图形会话.target
你还需要做什么取决于 OpenSuSE 在整个graphical-session
过程中已经取得了多大的进展,systemd 人们在 2016 年开始推动这一过程。Ubuntu 和 Debian 在 GUI 登录会话启动和关闭中提供了一整套混乱的幕后 shell 脚本,这使得启动/停止graphical-session.target
和注入DISPLAY
环境变量。如果您的 OpenSuSE 还没有这个,您可能需要填写该部分。
进一步阅读
- 伦纳特·珀特林等人。 (2016)。 systemd.特殊。 systemd 手册页。 Freedesktop.org。
- 马丁·皮特 (2016-07-25)。单位:添加graphical-session.target用户单位。系统错误#3678。
- 马丁·皮特 (2016-09-29)。图形会话.target。 systemd.conf。 YouTube。
- 伊恩·莱恩 (2017-07-30)。GNOME 用户会话中的 systemd。 GUADEC 2017。Youtube。
答案2
简而言之(除了杰德BP):
root
如果不是绝对需要,切勿使用。对于浏览器来说尤其如此,因为浏览器中的大多数错误都会导致攻击者直接获得 root 访问权限。将您的 systemd 文件放入
~/.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]