我有一个 jar 文件,需要在所有 Linux 发行版启动时运行。我之前的问题这里,让我对 X 服务器有了一个大概的了解。由于我无法执行启动,因此我开始考虑将 .desktop 文件添加到/etc/xdg/autostart
.这适用于 ubuntu,我目前正在 Linux Mint 的 cinnamon 和 mate 版本中测试它。我对其他发行版做了一个小研究,但他们似乎没有,/etc/xdg/autostart
但/xdg-autostart
我需要在 Linux 的所有发行版中运行我的 jar 文件。我尝试了 crontab 但@reboot
在 ubuntu 14.04 中不起作用。另一个问题是我需要删除卸载 jar 时放置到启动的文件。如果我编辑 rc.local,我将无法恢复编辑。有没有一种常见的方法可以在 Linux 中启动
答案1
遗憾的是,我不相信有一种单一的、通用的方法可以完全实现您想要的目标。每个 nix 都有一个 init 系统,并且有各种不同的 init 系统(SysV、Upstart、systemd 等)。现在,systemd 已经一些支持运行 SysV 守护进程,因此您也许可以编写一个 SysV 脚本并让它同时适用于两者,但我不知道这对于 Upstart 和其他系统来说会如何。我认为有两种可能可以帮助您实现目标的行动方案:
为每个主要的 init 系统编写一个服务(请注意,许多发行版正在切换到 systemd,因此它可能是一个很好的开始)。
放弃在启动时运行它并尝试稍后运行它。
例如,虽然 init 系统仍然相当分散,但 shell 登录几乎是通用的。$HOME/.shellrc
如果尚未运行,您可以在每个运行的 jar 中添加几行。这样做会减少工作量,并且更加普遍适用。
明显的优点1
是它会在用户看到任何内容之前运行 jar。但是,可以2
通过设置自动登录来缓解这种情况(尽管对于安全性来说不是一个好主意)。
请注意,如果这是一个 GUI jar,那么您将遇到相当多的额外麻烦(启动 X 或 Wayland 以便您的 jar 可以运行)至少会在您决定的任何解决方案中添加几行)。
答案2
没有通用的方法可以在所有 GNU/Linux 发行版上创建系统服务,因为它们使用各种 init 系统。曾几何时,他们都或多或少使用相同的东西SysV 风格初始化(除了一些使用更多 BSD 风格系统的系统),它允许编写通用的初始化脚本,在发行版之间几乎不需要修改。
目前,SysV 仍然被许多发行版使用,例如 Debian 和 RHEL / CentOS。然而,较新的初始化系统——系统(Fedora、Arch 等)和暴发户(Ubuntu) 1确实包含向后支持 SysV 样式初始化脚本的机制,因此,如果您正在寻找最容易在大多数系统上使用的方法,那么这仍然是它。
请记住,“linux”不是“Windows 8”或“OSX”操作系统意义上的操作系统。 Linux是在多种平台(例如 Android)上使用的操作系统内核;通俗地讲,“GNU/Linux”是指上面讨论的操作系统发行版的集合,但是这些不是全部都一样。没有认真的意图或愿望来统一这些,就像没有认真的意图或愿望来统一 Windows 和 OSX 一样,例如,有人可能会问“我如何在 OSX 和 Windows 上启动时运行我的 jar 文件? ” -- 你运气不好,你需要为每个人单独打包。事实上,Linux 世界中的软件通常是如何分布的;有单独的包对于每个发行版。
1但Ubuntu(和 Debian)是迁移到systemd,这意味着 upstart 可能会消失,并且大多数主要发行版将有一个通用的 init 系统。