我已经在以下位置创建了这个单元文件/lib/systemd/system/menu-core-prices-update.service
:
[Unit]
Description = core-price-update daemon
After network.target = auditd.service
[Service]
Type = forking
ExecStart = /usr/local/bin/start-menu-core-prices-update.sh
ExecStop = /usr/local/bin/stop-menu-core-prices-update.sh
ExecReload = /usr/local/bin/reload-stop-menu-core-prices-update.sh
[Install]
WantedBy = multi-user.target
从命令行我可以运行:
$ /usr/local/bin/start-menu-core-prices-update.sh
并且程序正常启动。但是如果我启动守护进程:
$ sudo systemctl start menu-core-prices-update.service
我收到此错误:
Jul 24 21:10:20 localhost systemd[13655]: menu-core-prices-update.service: Failed at step EXEC spawning /usr/local/bin/start-menu-core-prices-update.sh: Exec format error
-- Subject: Process /usr/local/bin/start-menu-core-prices-update.sh could not be executed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- The process /usr/local/bin/start-menu-core-prices-update.sh could not be executed and failed.
--
-- The error number returned by this process is 8.
Jul 24 21:10:20 localhost systemd[1]: menu-core-prices-update.service: Control process exited, code=exited status=203
Jul 24 21:10:20 localhost systemd[1]: Failed to start core-price-update daemon.
-- Subject: Unit menu-core-prices-update.service has failed
权限:
-rwxr-xr-x 1 root root 87 Jul 24 20:27 /usr/local/bin/start-menu-core-prices-update.sh
答案1
问题#1
我发现这个帖子的标题是:[已解决] 将自定义脚本添加到systemd它与上面的输出显示相同的错误,主要是这一点:
在步骤 EXEC 生成 /usr/local/bin/start-menu-core-prices-update.sh 时失败:Exec 格式错误
此错误通常意味着您的脚本存在以下一个或多个问题:
- 不可执行
- 缺少 shebang (
#!/bin/bash
)
要解决这些问题,请确保您的脚本可执行:
$ chmod a+x /usr/local/bin/start-menu-core-prices-update.sh
并且一定要#!/bin/bash
在顶部添加一个 shebang。
问题#2
看起来您在这一行有一个拼写错误:
After network.target = auditd.service
这可能应该是这样的:
After=network.target auditd.service
问题 #3
我不清楚你为什么使用Type = forking
.当您使用此类型时,您ExecStart=
需要使用调用的方法fork()
。您还应该使用该PIDFile=
选项。
我希望您的 Java 应用程序可以与simple
或一起正常工作oneshot
。请参阅此 U&L 问答,标题为:在 systemd 脚本中分叉了解更多相关信息。