在 Ubuntu 18.04 上,我可以通过以下方式启动或停止某些服务
sudo service cron start/stop
我可以列出一些服务
service --status-all
输出与 下的文件匹配/etc/init.d/
。
我听说有多种管理服务的方法:system V init、systemd、upstart,...我使用哪一种?man service
显示它是系统V init。但听说Linux用systemd代替了init。我应该在 Ubuntu 上使用 systemd 而不是 init 吗?
如何使任意可执行文件(ELF 或 shell 脚本)成为服务?
我是否需要通过 显式守护可执行文件setsid
,例如https://stackoverflow.com/a/19235243/156458?
以下帖子是否适用于我?
谢谢。
答案1
在 Ubuntu 18.04 上,[...]
我听说有多种管理服务的方法:system V init、systemd、upstart,...我使用哪一种?
您正在使用 systemd,这是 Ubuntu 18.04 上附带的 init。 (也在 Ubuntu 16.04、Fedora、openSUSE、Arch Linux、RHEL 7、CentOS 7、CoreOS 上,这也是 Debian 9 上的默认设置。)
确认您正在运行 systemd 的一种好方法是运行命令systemctl
。如果它可用并且在运行时产生输出,那么您正在运行 systemd。
在 Ubuntu 18.04 上,我可以通过以下方式启动或停止某些服务
sudo service cron start/stop
我可以列出一些服务
service --status-all
请注意,service
某些 systemd 发行版中附带的命令主要是为了向后兼容。您应该尝试使用systemctl
以下方式来管理服务。
例如:
$ sudo systemctl start cron
$ sudo systemctl stop cron
$ systemctl status cron
您可以通过简单的操作找到所有单位的状态
$ systemctl
输出与 下的文件匹配
/etc/init.d/
。
情况不一定如此systemctl
,因为 systemd 本机单元存储在/etc/systemd/system/
和中/usr/lib/systemd/system/
。
systemd 确实包含与旧 SysV 初始化脚本的兼容性(通过systemd-sysv-生成器,它创建一个 systemd 本机服务单元,调用 init 脚本中的命令),因此如果您在 下有 init 脚本/etc/init.d/
,它们很可能也会出现在 systemd 中。
我应该在 Ubuntu 上使用 systemd 而不是 init 吗?
这个问题不清楚。
该术语init
一般指系统启动时运行的第一个进程,该进程以 PID 1 运行。systemd 以 PID 1 运行,因此根据定义 systemd是一个 init(因此在它之前是暴发户,还有 SysV init。)
如果您问“我应该使用 systemd 而不是 SysV init 吗?”,那么您就是已经使用 systemd 而不是 SysV init,因为您使用的是 Ubuntu 18.04。 (而且,正如上面所指出的,您现在选择的大多数发行版很可能将 systemd 作为其 init。)
现在,您可能会问“我应该使用 systemd单位代替初始化脚本?”这个问题更相关,因为可以说你在这里有一个选择,两个选项都可以工作。
我的建议是您应该使用 systemd 单元来管理服务,这是本机操作模式。创建 init 脚本只是添加了一个间接层(因为生成器无论如何都会为您创建一个 systemd 单元。)此外,编写 systemd 单元比编写 init 脚本更简单,因为您不必担心正确的守护进程和清理执行前的环境,因为 systemd 会为您完成所有这些工作。
如何使任意可执行文件(ELF 或 shell 脚本)成为服务?
创建一个systemd 服务单元为了它。
请参阅手册页上的示例。最简单的示例展示了创建服务单元是多么容易:
[Unit]
Description=Foo
[Service]
ExecStart=/usr/sbin/foo-daemon
[Install]
WantedBy=multi-user.target
将此单元存储在 下/etc/systemd/system/foo.service
,然后重新加载 systemd 以读取此单元文件:
$ sudo systemctl daemon-reload
使用以下命令启动服务:
$ sudo systemctl start foo.service
并在启动时启用它:
$ sudo systemctl enable foo.service
您可以通过以下方式检查服务的状态:
$ systemctl status foo.service
当然,systemd 可以为您做更多的事情来管理服务,因此典型的 systemd 单元将比这个单元更长(尽管不一定复杂得多)。请浏览下面的 Ubuntu 附带的单元,/usr/lib/systemd/system/*.service
以更好地了解其内容典型的,所期待的。
我是否需要通过 显式守护可执行文件
setsid
,例如https://stackoverflow.com/a/19235243/156458?
不!不要在后台运行,不用担心进程组或会话等。systemd 会为您处理所有这些事情。只需编写在前台运行的代码,systemd 就会处理剩下的事情。
(如果您有一个在后台运行的服务,systemd能使用 来管理它Type=forking
,但是在前台运行时事情会容易得多,所以如果您要启动一项新服务,就这样做。)
以下帖子是否适用于我?
这是关于使用“Spring Boot”Java 框架的应用程序。除非您正在编写 Java 代码并使用该框架,否则它是不相关的。如果您正在编写 Java 代码,请尝试在前台运行您的服务。
问题是关于 upstart,答案是关于 SysV 初始化脚本。虽然 SysV 初始化脚本可以与 systemd 一起使用,但您最好直接编写 systemd 单元,如上所述。
所以,不,我想说这些都不相关。
我建议您尝试了解有关 systemd 服务单元的更多信息。
这个网站也是一个很好的资源,所以当您探索为您的服务编写自己的 systemd 单元时,请随意发布更多有关它的问题。
答案2
我的系统上的本机守护程序服务管理器是什么?
在最多linux init 是所有其他服务和进程产生的地方。
本机守护程序服务管理器可以通过 找到man init
。