我知道如何使systemd服务使用诸如BindsTo,Require和PartOf之类的东西需要另一个服务。 我也读过很多关于类似情况的文章。 然而,我有一个更独特的用例,似乎没有直接的解决scheme,或者至less不是我发现的工作。
我有一个服务,“serviceA”,同时运行几个进程。 它作为特定的User = MyUser运行。 其中一个被启动的东西是一个需要使用sudo的安装脚本。 这个脚本被脚本调用时(不是手动运行时),所以我把脚本移出了一个单独的服务“serviceB”。
我不想在“serviceA”服务中包含对“serviceB”的任何引用,原因有多种。
是否有可能通过serviceB中的某个选项具有serviceA触发器serviceB? 我已经尝试过partOF,BindsTo,Before = etc …但是没有任何东西似乎有效果。 ServiceB不启动。 我假设没有办法触发其他服务,除非它在主要服务中列出。 我也没有看到关于通过journalctl以这种方式启动serviceB失败的输出,也没有看到任何比尝试运行脚本作为主要服务的一部分的错误代码更多的东西。
我目前的解决scheme是使用serviceA的一个插件,它有效地修改了服务,要求ServiceB首先启动。 它工作,但不是我最喜欢的机制。
或者,有什么方法可以解释为什么sudo命令无法在第一时间运行? (我已经尝试了完整的path,sudoers设置,等等…)
serviceA.service:
[Unit] Description= Service A that I don't want to modify [Service] ExecStart=/bin/bash -c 'mybinary' #calls other binaries and scripts. Restart=always User=MyUser Group=Mygroup
serviceB.service:
[Unit] Description= Service B that I don't mind modifying PartOf=serviceA.service Before=serviceA.service [Service] ExecStart=myScript.sh #must be ran as root. makes sudo calls as well. Restart=always
脚本myScript.sh(示例):
#!/bin/bash ln /path/to/symlink /name/of/symlink sudo /bin/modprobe -a somekmod.ko sudo rm /dev/ttyr01 #created by this script as root
请注意,所有这些服务都是通过RPM安装的,作为其他软件包的一部分。 我可以使用一些dynamicvariables,例如%i,并调用服务[email protected]。 不是每个我安装的系统都应该安装serviceB,因为这会导致硬件问题(可能)。
然后在Unit部分中引用:PartOf =%i和After =%i
但是这实际上不适合我的正常使用情况,并可能导致意想不到的后果。
谢谢!