use*_*663 5 suse services init systemd
我的公司设置了一些它开发的软件,在旧版本的 SLES 上使用 init.d 作为服务运行。我们最近开始在 Amazon 的 EC2 中的 SLES 12 实例上设置新环境,并发现 SLES 12 现在使用 systemd 而不是 init.d。然而,init.d 脚本(即 /etc/init.d 中)中定义的服务似乎仍然可以正常启动,因为 systemd 在后台执行一些魔法来处理预先存在的 init.d 脚本,这很棒。
但是,我们不想以 root 用户身份运行我们的服务——而是创建一个新用户来运行我们的服务。问题是,当我们尝试以非 root 用户身份启动我们的服务时,无论 systemd 为运行旧的 init.d 服务做任何准备,都会请求 root 身份验证,我们认为这不是必要的。在较旧的 SLES 环境中(使用实际的 init.d),我们可以毫无问题地以非 root 用户身份启动服务。据我所知,我们的非 root 用户权限和文件所有权在两种环境中都是相同的。
我认为这是 systemd 对旧的 init.d 内容进行后台处理的原因是启动我们服务的脚本在启动/停止服务的实际命令之前立即回显一行文本,但该行不是't output 即我们被要求在 echo 语句之前进行 root 身份验证。隐藏在 systemd 中的某个包/模块需要身份验证,但我现在不记得它的名字了。
请注意,如果可能,我们希望避免为我们的服务创建特定于服务的 .service 文件 - 我们希望坚持使用我们拥有的 init.d 脚本,并以非 root 用户身份运行它。此外,我们希望在不使用 sudo 的情况下运行该服务(我们在旧环境中不需要 sudo)。
对于这个问题缺乏细节表示歉意 - 一旦我回到办公室并可以获取具体细节等,我会用更具体的细节更新它。但这似乎可能是一个常见问题,所以我希望有人可以对此有所了解。
具体来说:我们希望在 SLES 12 上使用 systemd 以非 root 用户身份运行使用旧 init.d 脚本定义的服务。
(更新 1)尝试运行我们的脚本 /etc/init.d/my_service stop 的确切结果是:
/etc/init.d/my_service 停止
重定向到 systemctl stop electrum-gateway-main.service
==== 对 org.freedesktop.systemd1.manage-units 的身份验证 === 需要身份验证才能停止“my_service.service”。
身份验证为:root
密码:
当我们试图停止它时,该服务没有运行,但这与身份验证问题无关。
我在我们的脚本中做了更多的挖掘,脚本在请求身份验证之前到达了以下行:
. /etc/rc.status
Run Code Online (Sandbox Code Playgroud)
所以这就是问题所在。调用/etc/rc.status 是否需要root 权限?
在 systemd(和其他现代 init 系统)中,服务启动严格分为两个步骤:
由于这种间接性,保证服务始终具有相同的环境,无论是谁以及如何启动它们。(以前,用户环境(如区域设置、路径或 SELinux 上下文)泄漏到服务中曾经是一个常见问题。)
(对于 init.d 脚本,发行版的 lsb-functions 文件包含魔术重定向到“systemctl start”,因此它们也接收相同的间接寻址。)
这也意味着你不能“以同一用户”启动服务——你必须在相关的 systemd .service 文件中配置一个特定的用户名(如果没有,你真的应该写一个)。
“启动服务”调用通常具有特权,但您可以编写 polkit 规则,允许每个用户或每个服务(如果 systemd 版本足够新):
/* /etc/polkit-1/rules.d/allow-whatever.rules */
polkit.addRule(function(action, subject) {
if (action.id == "org.freedesktop.systemd1.manage-units") {
var verb = action.lookup("verb");
var unit = action.lookup("unit");
if (subject.user == "manager"
&& unit == "app.service"
&& (verb == "start" || verb == "stop" || verb == "restart"))
{
return polkit.Result.YES;
}
}
});
Run Code Online (Sandbox Code Playgroud)
或者,也可以在 init.d 脚本中选择退出间接访问,但这样您也将完全失去 systemd 的服务跟踪——您的守护进程将看起来像一个普通的用户进程。
| 归档时间: |
|
| 查看次数: |
13159 次 |
| 最近记录: |