我有一个嵌入式 Linux 系统,当我制作的特定服务正在运行时,它需要很长时间才能关闭。它需要尽快开始运行,这就是为什么它设置了 DefaultDependency=no 选项。
当我跑步时
systemctl stop myService
它按预期工作,服务立即停止。
然而当我跑步时
shutdown now
我可以看到服务持续运行(LED 持续变化) 服务运行的可执行文件具有 SIGTERM 和 SIGINT 的信号处理程序
如果我手动运行可执行文件并按 ctrl+c 发送 SIGINT,它也会很好地停止
不幸的是,我无法从journalctl 获得任何好的日志信息。
有谁知道这是怎么发生的?
关闭不会触发 systemctl 停止所有服务吗?
我是否需要指定其他内容才能使其正常关闭?
编辑:根据要求提供服务
### My service###
[Unit]
Description=My service
DefaultDependencies=no
[Service]
CPUAffinity=3
ExecStart=/path/to/startscript.sh
Type=simple
[Install]
WantedBy=sysinit.target
启动脚本只是确保可执行文件具有可执行权限,因为在手动更新后它可能会丢失此权限。然后像这样执行
nice -n -20 /path/to/exe.elf
可执行文件具有非常高的优先级,它有自己的CPU和高niceness。
答案1
你为什么设置DefaultDependencies=no
?仅在一些不寻常的用例中才需要这样做。
systemd.service(5) 联机帮助页显示:
默认依赖项 除非设置 DefaultDependencies=no,否则将添加以下依赖项:
• 服务单元将具有 sysinit.target 上的 Requires= 和 After= 类型的依赖关系、basic.target 上的 After= 类型的依赖关系以及 shutdown.target 上的 Conflicts= 和 Before= 类型的依赖关系。这些确保正常的服务单元进行基本的系统初始化,并在系统关闭之前干净地终止。只有涉及早期启动或延迟系统关闭的服务才应禁用此选项。
[...]
如果您确实需要/想要设置DefaultDependencies=no
,则需要After=/Before=/Conflicts=
手动显式设置依赖项,包括针对shutdown.target
目标的依赖项
Nice=
编辑:顺便说一句,您知道.service 文件中有该属性吗? (参见 systemd.exec(5) 手册页),无需调用nice
可执行文件