我们有一款使用 .Net Core 构建的产品,因此它可以在运行 Windows 或 Linux(Linux 的自定义版本)的设备上运行/部署。在 Windows 中,它作为 Windows 服务运行,在 Linux 中,我们也使用 systemd 将其作为服务进行管理。
为了便于调试,我尝试编写一个脚本,将该产品部署到运行 WSL 的本地开发机器上,这样我们就不需要设备来测试产品了。不幸的是,在 WSL 下,systemd 不可用,所以我尝试使用 init.d 使其工作。
我拥有的 .service 文件与我们在设备上部署时的文件相同。如下所示:
[Unit]
Description=My Service
[Service]
ExecStart=dotnet /opt/mypath/mydll.dll
WorkingDirectory=/opt/mypath/
User=root
Restart=always
SyslogIdentifier=myservice
PrivateTmp=true
[Install]
WantedBy=multi-user.target
为了在 WSL 中部署服务,我运行了以下几行:
sudo cp /opt/myservice.service /etc/init.d/
cd /etc/rc3.d
sudo ln -s ../init.d/myservice.service S95myservice.service
sudo service myservice.service start
问题出现在最后一行,即启动服务。我收到以下错误:
/etc/init.d/myservice.service: 1: [Unit]: not found
/etc/init.d/myservice.service: 2: Agent: not found
/etc/init.d/myservice.service: 4: [Service]: not found
/etc/init.d/myservice.service: 12: [Install]: not found
但是,我确实在 .service 文件中声明了这些标签(Agent 除外,使用 systemd 似乎没有问题?)。此外,奇怪的是,当我运行 时service --status-all
,它显示我的服务正在运行(旁边有一个“+”)。
当我们主要在 Windows 环境中进行开发时,我认为可能是行尾的问题,但我已确保文件的行尾是 Unix 样式,而不是 Windows 样式。
我是否遗漏了需要额外做的事情?
答案1
您尝试将 systemd 单元文件用作 sysvinit 脚本,但这样做行不通。systemd 单元文件是声明性的,而 sysvinit 脚本是包含启动和停止相关服务器的命令的 shell 脚本。因此,shell 在您的单元文件上被调用,而这不是有效的 shell 脚本。
您可能希望安装该initscripts
软件包并查看其部分内容,以了解 sysvinit 脚本应是什么样子。请注意,即使在使用 systemd 的系统上,您也可以使用此类脚本代替 systemd 单元。
如果您的 sysvinit 脚本仅限于 Debian 和 Ubuntu,您可能会发现该start-stop-daemon
命令很有帮助。