我仍在掌握 systemd 并遇到了一些问题。这并不是什么大问题,但我想更多地了解这是怎么回事。我在其他地方找不到任何对此的引用。
首先,我知道服务的自定义单元文件应该放在/etc/systemd/system
.然而,如果单元文件可以位于其他地方,那么对于服务器的管理来说会很好。
在文档中,我看到您可以像这样“链接”单元文件:
systemctl link /path/to/servicename.service
这将在 中创建指向上述内容的链接/etc/systemd/system
。您现在可以启动/停止该服务。从表面上看,这似乎是我们管理服务的好方法。
然而,尝试启用这样的“链接”单元文件会导致失败:
root@test1:/etc/systemd/system# systemctl link /root/myservice.service
Created symlink from /etc/systemd/system/myservice.service to /root/myservice.service.
root@test1:/etc/systemd/system# systemctl status myservice.service
* myservice.service - My Test Service
Loaded: loaded (/root/myservice.service; linked; vendor preset: enabled)
root@test1:/etc/systemd/system# systemctl enable myservice.service
Failed to execute operation: No such file or directory
使用完全相同的单元文件,但复制到/etc/systemd/system
而不是链接到,您将得到:
root@test1:/etc/systemd/system# cp -p /root/myservice.service .
root@test1:/etc/systemd/system# systemctl daemon-reload
root@test1:/etc/systemd/system# systemctl status myservice.service
* myservice.service - My Test Service
Loaded: loaded (/etc/systemd/system/myservice.service; disabled; vendor preset: enabled)
root@test1:/etc/systemd/system# systemctl enable myservice.service
Created symlink from /etc/systemd/system/multi-user.target.wants/myservice.service to /etc/systemd/system/myservice.service.
由此看来,似乎无法在系统启动时调用链接的单元文件。
如果是这种情况,“链接”功能的意义何在?从文档中,它说:
链接文件名
将不在单元文件搜索路径中的单元文件链接到单元文件搜索路径中。这需要单元文件的绝对路径。可以通过禁用来撤销此效果。该命令的作用是单元文件可用于启动和其他命令,尽管它没有直接安装在单元搜索路径中。
答案1
手册页具有误导性。
systemctl link /root/myservice.service
systemctl enable /root/myservice.service
第一个让你有可能做到systemctl start myservice
。第二个使得myservice
自动启动成为可能(正如@Julien 指出的那样,它会自动添加link
)。
我想...我一整天都在努力思考这个问题。
答案2
从默认路径以外的其他路径启用服务时,应使用完整路径。启用还将为您创建链接:
systemctl enable /root/myservice.service
启用后,您可以使用服务名称启动/停止/状态
systemctl start myservice
这里有一些注意事项:
- 您无法启用本身已经是链接的服务文件
- 确保路径位于同一安装的磁盘上。如果不是,systemd 将无法在启动时加载服务单元文件,因为磁盘尚未安装并且无法找到文件。 (看已安装磁盘上的 Systemd 链接单元文件无法加载)
- 由于 systemd 中的错误,您无法从非标准路径中的单元文件启用实例(请参阅https://github.com/systemd/systemd/issues/661)