“服务 {FOO} 启动”与“/etc/init.d/{FOO} 启动”?

“服务 {FOO} 启动”与“/etc/init.d/{FOO} 启动”?

我在 Debian 8 桌面上使用 CrashPlan。我有一个脚本,我必须在开始时停止 CrashPlan 服务,然后在退出之前启动它。我正在使用

/etc/init.d/crashplan start

重新启动,但新的 CrashPlan 进程在终止时退出我的脚本。我切换到

service crashplan start

一切都很好!

奇怪的是,在另一个机器上的 Ubuntu 16.04 下,init.d脚本/命令的行为符合预期。当我的脚本退出时,CrashPlan 继续运行。 好吧,现在 Ubuntu 也给了我同样的问题。

我的 Debian 脚本现在可以运行了。但我的印象是该service命令即将被弃用,因此我对Debian 和 Ubuntu 的当前版本之间的差异init.d感到困惑。service

答案1

在任何使用 systemd 的系统上,直接运行 init.d 脚本并不是启动服务的最佳方式,因为它将绕过通常由 systemd 本身完成的所有设置和簿记。此外,您甚至可能没有初始化脚本,该服务可能仅在单元文件中描述。

对于“旧式”sysvinit,没有太多的簿记工作要做:启动服务与运行脚本大致相同。这并不意味着直接使用 init 脚本是一个好主意,手册页中的描述service告诉您原因:

service在尽可能可预测的环境中运行 System V init 脚本或 upstart 作业,删除大多数环境变量并将当前工作目录设置为 /。

随机 shell 不是一个非常可预测的环境,您可能会激活文件或进程限制。

至于弃用,也许您应该使用systemctl,但在 Debian 上service实际上会尝试做正确的事情并systemctl为您运行。 (假设 ifservice已被弃用,那么直接运行 init 脚本就更是如此。)

(我不是一个足够的 systemd 专家,无法告诉您如果直接运行 init 脚本,到底是什么杀死了服务。这还取决于运行您正在运行的脚本的内容:从 cron、从命令行、从其他东西。 ..)

相关内容