任务:
启动时启动 xfce4-clipman
尝试过:
我在正确的位置创建了一个具有正确权限的 sh 脚本:
martin@martin:/etc/init.d$ ls -l start_clipman.sh
-rwxrwxr-x 1 root root 26 мар 12 09:05 start_clipman.sh
sh文件的内容:
martin@martin:/etc/init.d$ cat start_clipman.sh
#!/bin/bash
xfce4-clipman
martin@martin:/etc/init.d$
我已经跑了
martin@martin:/etc/init.d$ sudo update-rc.d start_clipman.sh
defaultsinsserv: warning: script 'K01mount_disk.sh' missing LSB tags and overrides
insserv: warning: script 'K01start_clipman.sh' missing LSB tags and overrides
insserv: warning: script 'start_clipman.sh' missing LSB tags and overrides
insserv: warning: script 'mount_disk.sh' missing LSB tags and overrides
潜在问题:
当我这样做时:
martin@martin:~$ xfce4-clipman
应用程序正在运行,但是 xfce-clipman 占用了终端,它正在执行,它正在运行,但如果我想使用终端输入其他内容,我必须取消它。
martin@martin:~$ xfce4-clipman
^C
martin@martin:~$
我该怎么办
答案1
xfce4-clipman 需要访问您的 Xorg 显示器(X11 图形系统) - 不仅因为它确实是一个图形应用程序,还因为它是一个剪贴板管理器,X11 也涵盖了这一点。
主要问题:您的 Xorg 显示器在启动时实际上尚不可用。它已推出登录时,在系统启动完成很久之后。因此,不可能在“启动时”启动 xfce4-clipman – 您真正想要的是在登录时也启动该应用程序。
(Linux 旨在支持多用户,他们可以随时登录和注销 - 每个用户都会获得一个全新的 Xorg 副本,登录屏幕本身也会获得一个。因此,服务不能依赖于 Xorg 是否可用。一点儿也不。)
登录时启动应用程序
大多数桌面环境,包括 Xfce,都可以通过*.desktop
文件启动“登录”任务(这实际上是各种 Xfce 组件的启动方式)。
它们位于/etc/xdg/autostart/
全局服务和~/.config/autostart/
个人服务中。创建后,默认情况下会“启用”,但仍可以通过 禁用xfce4-session-settings
。
事实上,xfce4-clipman 甚至会将其自己的自动启动文件安装到 /etc/xdg/autostart – 该文件名为xfce4-clipman-plugin-autostart.desktop
。只要您使用 Xfce4,它就会自动运行(由于该OnlyShowIn=XFCE
行)。
但是如果你的系统缺少该文件,或者你想在非 Xfce 桌面环境中使用 xfce4-clipman,那么你可以创建一个新的。自动启动.desktop
文件通常如下所示:
[桌面条目] 类型=应用程序 名称=剪贴板管理器 执行=xfce4-clipman 终端=false
手动启动非 CLI 程序
许多桌面环境都有一个“运行”对话框AltF2,可让您运行程序而无需占用终端。
做同样事情的各种方法从终端有:
(setsid xfce4-clipman 2>/dev/null &)
(xfce4-clipman &)
nohup xfce4-clipman &
xfce4-clipman & disown
- 等等。
init.d 脚本的其他问题
在系统服务适当的情况下,您应该记住 /etc/init.d 中的文件不仅仅是简单的脚本,它们还会在关机时运行,并且必须接受诸如“stop”或“restart”之类的子命令。当系统调用时/etc/init.d/your_service stop
,initscript 需要实际停止服务——不要重新启动它!
您已将问题标记为systemd,那么为什么不省去很多麻烦,*.service
改而编写一个原生的 systemd 文件呢?虽然“正确的” init.d 脚本可以填满几个屏幕,但 systemd .services 通常不到十几行。
更重要的是:有几十个服务在不同时间点启动。在后期阶段,可以使用早期阶段没有的一些设施。(例如,网络。)
如果你的启动脚本没有明确说明其顺序要求(“必须在 Y 之前但在 Z 之后运行”),操作系统将在不可预测的阶段与其他所有操作并行运行它。如果你非常幸运的是,它会在正确的时刻运行 - 但大多数时候它运行得太早而无法正常工作。
Before=
在本机 systemd 单元文件中,使用和参数指定顺序。 (使用或After=
指定依赖项也是一个好主意。)同时,init.d 脚本(使用 SysVinit 和 systemd)使用标记为 的特殊注释块,其中包含 和 等参数。Requires=
Wants=
### BEGIN INIT INFO
Required-Start:
Should-Start: