在 Systemd 中启用“链接”单元文件

Tom*_*m17 14 linux systemd

我仍在掌握 systemd 并遇到了一些问题。这不是什么大问题,但我想更多地了解这种情况。我在其他地方找不到任何对此的参考。

首先,我知道服务的自定义单元文件应该放在/etc/systemd/system. 但是,如果单元文件可以位于其他地方,那么管理我们的服务器会很好。

在文档中,我看到您可以像这样“链接”单元文件:

systemctl link /path/to/servicename.service
Run Code Online (Sandbox Code Playgroud)

这将在/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
Run Code Online (Sandbox Code Playgroud)

使用完全相同的单元文件,但复制到/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.
Run Code Online (Sandbox Code Playgroud)

由此看来,在系统启动时调用单元文件中的链接似乎是不可能的。

如果是这种情况,“链接”功能的意义何在?从文档中,它说:

链接文件名

将不在单元文件搜索路径中的单元文件链接到单元文件搜索路径。这需要单元文件的绝对路径。可以通过禁用来撤消此效果。该命令的作用是一个单元文件可用于启动和其他命令,尽管它没有直接安装在单元搜索路径中。

Aus*_*pex 17

手册页具有误导性。

systemctl link /root/myservice.service

systemctl enable /root/myservice.service
Run Code Online (Sandbox Code Playgroud)

第一个使您可以做到systemctl start myservice。第二个使myservice自动启动成为可能(正如@Julien 指出的那样,自动添加了link)。

我想……我一整天都在想办法解决这个问题。

  • 请注意,`systemctl enable` 也将执行`systemctl link`,因此无需键入 2 个命令;-) (2认同)

nic*_*ane 10

从默认路径以外的其他路径启用服务时,您应该使用完整路径。启用还将为您创建链接:

systemctl enable /root/myservice.service
Run Code Online (Sandbox Code Playgroud)

启用后,您可以使用服务名称启动/停止/状态

systemctl start myservice
Run Code Online (Sandbox Code Playgroud)

这里有一些警告: