我正在尝试在启动时运行 calibre-server 。这是服务内容的示例
[Unit]
Description=calibre Content server
After=network.target
[Service]
Type=simple
User=root
Group=root
ExecStart=/opt/calibre/calibre-server "/path-to-mounted-external-hdd-partition/Calibre Library"
[Install]
WantedBy=multi-user.target
当我检查服务状态时:sudo systemctl status calibre-server.service
我收到以下消息:There is no calibre library at: /path-to-mounted-external-hdd-partition/Calibre Library
然而,当我输入:sudo systemctl start calibre-server.service
它开始完美。
我的假设是分区和文件夹结构在服务最初运行时未安装/可用。所以我尝试用test.sh的内容替换ExecStartExecStart=/test.sh
#!/bin/bash
ls -la /path-to-mounted-external-hdd-partition/ 2> /out.txt >> /out.txt
存储在out.txt中的结果显示(为简洁起见,进行了简化):
.
..
运行服务时外部硬盘的内容似乎是空的。
这是为什么?我该如何解决?
PS我不知道这是否重要,但安装是通过 ubuntu/disks 应用程序完成的,而不是通过/etc/fstab 完成的
聚苯硫醚
systemctl list-units | grep '\.mount'
-.mount loaded active mounted Root Mount
...
media-XXX-Storage.mount loaded active mounted /media/XXX/Storage
其中/media/XXX/Storage正是我所描述的/path-to-mounted-external-hdd-partition
如果您应该在运行服务单元之前安装某个路径,您还可以
RequiresMountsFor=
在该部分中添加该指令[Unit]
。这将检查路径是否可用。因此,在给定的情况下,完整的指令将是RequiresMountsFor="/path-to-mounted-external-hdd-partition
.有关该指令的更多信息,请查看systemd 单元文档。
在安装准备就绪之前,您的 calibre 服务器就已启动。让我们添加正确的排序依赖项(编辑请跳到我的第二个解决方案,或使用@noisefloor 的答案作为我的第一个解决方案的更清晰版本):
如果这不起作用,您可以在开始时添加一个循环来测试其中的文件:
这个答案取决于我根据您的编辑和评论所做的假设。
您使用的安装是外部安装,并且您依赖于 GNOME 的自动安装功能。您没有将其配置为systemd 装载
fstab
,也没有将其配置为 systemd 装载。这一假设主要是因为你提到的ls
目录上显示的是一个空目录,而事实不应该是这样。事实上该目录位于/media/XXX
.自动安装的驱动器在引导期间不可用。
systemctl list-units | grep '\.mount'
您可以通过在测试中运行编辑中的命令而不是ls
命令来确认这一点。结果不会显示挂载点。因此,将它们添加为依赖项不会产生任何效果,因为这些安装点是在您登录用户会话后自动生成的。您可以尝试使用用户服务而不是系统服务进行试验。在这种情况下,您可能会发现Daniel T 的循环方法会取得更大的成功。
在下面创建服务并在传递给命令
~/.config/systemd/user/your-service-name.service
时启用它。--user
systemctl
否则,我建议的更安全的方法是添加一个
fstab
条目(或 systemd .mount 条目)来安装驱动器。然后,正如其他答案所建议的那样,您可以将它用于Requires
orRequiresMountsFor
。诗。这与您的问题没有直接关系,但如果
ls -la /path-to-mounted-external-hdd-partition/
在启动过程中向您显示一个空目录,并且您希望它向您显示磁盘的内容,那是因为该目录存在。安装驱动器后,路径将从本地路径替换为已安装的驱动器。您可以通过完全拔掉驱动器并尝试该
ls
命令来测试这一点,看看是否会导致No such file or directory
错误。