我正在尝试在 Vagrant 框上设置 systemd 服务,这需要在启动之前安装 Vagrant 同步文件夹。
Vagrant文件
Vagrant.configure(2) do |config|
config.vm.box = "ubuntu/yakkety64"
config.vm.synced_folder ".", "/usr/local/src"
config.vm.provision "shell", path: "bootstrap/bootstrap"
end
/etc/systemd/system/my-server.service
[Service]
ExecStart=/usr/bin/node /usr/local/src/index.js
Restart=always
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=my-server
User=ubuntu
Group=ubuntu
[Unit]
Requires=remote-fs.target
After=vboxguest.service
After=virtualbox-guest-utils.service
[Install]
WantedBy=remote-fs.target
如果我不启用我的服务器服务,同步文件夹已正确安装。但当我尝试启用我的服务器服务,服务无法找到已挂载的文件。如果我随后登录 Vagrant 框,则文件夹未挂载。似乎服务尝试从该路径加载文件会干扰 Vagrant。
那么,如何在我的服务启动之前等待文件夹挂载完成?
其他解决方案在各个方面都存在不足,需要手动干预才能启动服务,这是不可接受的。
答案1
我刚刚通过添加以下内容解决了此类问题:
[Install]
WantedBy=multi-user.target var-www-example.com.mount'
其中var-www-example.com
对应于:
config.vm.synced_folder ".", "/var/www/example.com"
在里面Vagrantfile
。
因此,Vagrant 为每个同步文件夹挂载点都提供了一个 XXX.mount systemd 单元。你可以使用以下命令找到你的单元:
# systemctl list-units | fgrep .mount
答案2
我遇到过类似的问题,我的一个 systemd 服务需要在服务运行之前有一个 vagrant 同步文件系统才能成功启动。我通过以下方法解决了这个问题:vagrant shell 提供者每次启动时自动重启服务。这是因为配置程序在 vagrant 挂载同步的文件系统后运行。
config.vm.provision "shell", run: "always", inline: "systemctl restart my-server"
我不确定您的服务为何会干扰同步的文件系统。Vagrant 默认将您的 vagrantfile 所在的文件夹同步到 /vagrant。它可能被挂载了两次吗?