我正在开发一个配置即代码工具,并想为其创建 systemd 提供程序。
现在,假设用户在其配置中描述了他们想要NetworkManager.service
启用和cups.service
禁用的情况。
systemctl enable NetworkManager.service
我们可以分别使用和来(取消)链接相应的单元文件systemctl disable cups.service
,但现在我们需要停止需要停止的服务并启动需要启动的服务。
我希望有一个命令,可以为我做到这一点 - “停止所有正在运行但需要停止的东西,并启动所有已停止但需要运行的东西”。systemctl daemon-reload
不幸的是,这不是我想要的。
是否内置了此类功能systemctl
,或者我必须单独操作每个服务?
聚苯乙烯这实际上应该是一个单独的问题,但我想会有一些用例,我的用户将从 chrooted/容器化环境中运行我的程序,其中 PID 1 不是 systemd。尝试调用任何单元操作操作都会导致systemctl
退出并显示状态 1 和消息System has not been booted with systemd as init system (PID 1). Can't operate.
。有没有一种方法可以提前检查这种情况,或者我能做的最好的事情就是尝试并捕获错误?
答案1
回答原来的问题:
daemon-reload
只是告诉systemd
重新读取其配置。
注意使能服务意味着该服务作为其他单元的依赖项启动。假设您的默认目标是多用户,您可以尝试systemctl isolate multi-user.target
;根据我的理解,它应该启动所有依赖于的启用单元多用户并阻止所有其他人。
如果这不起作用,一个使用 的输出的简单 shell 脚本systemctl list-units -t service
应该可以解决问题。编辑:list-units
不报告启用/禁用;你可以用systemctl status -t service \*
它代替。
最后,也许你真的想要这个:
systemctl enable --now SERVICE
systemctl disable --now SERVICE
--now
在启用/禁用服务的同时启动/停止服务。当然,也可以systemctl start SERVICE
单独systemctl stop SERVICE
进行。