观察到一些与 systemd 相关的进程从未停止。经调查,它们与基于 Java 的服务相连,可能是由通过 手动启动的服务引起的su
。
$ sudo loginctl user-status username
username (1014)
Since: Tue 2025-01-28 04:03:56 CST; 2 days ago
State: closing
Sessions: 100
Linger: no
Unit: user-1014.slice
├─session-100.scope
│ ├─1037532 bash /some/script
│ ├─1037541 /usr/lib/jvm/jdk/bin/java -parameters
│ ├─1039230 /usr/java/default/bin/java -parameters
│ ├─1039510 /usr/java/default/bin/java -parameters
│ └─1056980 /usr/java/default/bin/java -parameters
└─[email protected]
└─init.scope
├─1007530 /usr/lib/systemd/systemd --user
└─1007534 (sd-pam)
虽然 systemd 进程不停止与systemd --user 和 sd-pam 进程永不停止类似,但这里共享切片似乎更令人感兴趣。
a) 附加到用户切片的服务是否意味着它们可能会与该用户而不是服务帐户共享资源限制?
b) 在用户切片中运行的服务还有其他影响吗?
c) 除了使用适当的启动脚本/systemd 服务之外,还有什么合理的解决方法可以防止这种情况发生?
编辑:只是为了澄清一下,我是在其他用户的行为之后才注意到这一点的。就我个人而言,到目前为止,我已经因为不成为其他用户而与人们发生过至少 10 年的冲突 :)
是的。所有基于 cgroup 的限制(任务、内存、IO、CPU...)都将与所在切片/cgroup 的用户共享。
这意味着没有遵循良好的做法——您从 SSH 手动启动服务,因此 1) 不会监视服务是否崩溃/重启,2) 无论何时重新启动服务器,它都会处于关闭状态,直到手动重新启动,并且3) 必须使用系统管理员需要弄清楚的非标准程序重新启动,4) 根据程序,它可能从启动它的用户那里继承了环境变量或 SELinux 上下文等内容,并且 5) 如果您的发行版启用了 systemd 的“终止属于已注销用户的进程”功能,或者您决定在本地启用它而忘记它会影响的“服务”,它可能会受制于该功能。
确实,使用 systemd 服务。
如果你还没有编写 .service 单元:
该
systemd-run
命令可用于启动一个“临时服务”,所有参数均通过命令行指定——--pipe
如果您以这种方式运行它进行调试,则可以选择将其输出附加到您的终端,但在其他所有方面,它都在类似服务的环境中运行(从 PID1 启动,有自己的“服务” cgroup,而不是共享用户的 cgroup 等)。