systemd
允许将一个.path
单元和一个.service
单元组合在一起,这样写入文件即可激活服务。现在考虑每次修改文件后都应启动服务。可以将多个修改合并为一个启动,但服务单元应在每次修改后启动。这不是 systemd 通常的运行方式。如果服务在修改时正在运行,则被视为活动且未激活,但在这种情况下应在完成后立即激活。这些语义可以通过其他方式实现吗?
观察到一些与 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 年的冲突 :)
我用它来logcheck
监控我的树莓派在互联网上的使用情况。从 debian 12 bookworm 开始,大多数日志文件不再位于 /var/log 中,而是聚集在 systemd 的日志中。我想在日志上测试我的规则,但我找不到命令。
我以前使用过如下命令:
egrep -f /etc/logcheck/ignore.d.server/local-rules /var/log/*
或者
logcheck-test -l /var/log/* -r /etc/logcheck/ignore.d.server/local-rules
有人知道如何在 systemd 日志上执行此操作吗?
我的嵌入式 Linux 上出现了一个(我认为)非常特殊的情况,我无法正确解决......
由于在启动时挂载文件系统之前要执行特定(自定义)检查,我使用初始 ramdisk 来检查和挂载所有请求的文件系统,然后在 init 完成时将它们传输到根文件系统(因此不/etc/fstab
使用挂载设备,而是通过驻留在初始 ramdisk 内的脚本挂载它们)。
更具体地说,首先挂载/boot
分区(mmcblk1p1
)(以只读模式);在该分区内,我有一个文件(rootfs.squashfs
),对应于目标根文件系统的 squashfs 映像......因此,经过一些其他操作(与本文的目的无关)后,初始 ramdisk 脚本最终挂载了 squashfs 映像/rootfs
,并在 init 脚本的末尾切换到系统根目录/rootfs
(通过switch-root
命令);
问题出现在系统重启(或关机或断电)时:当系统尝试卸载所有已挂载的文件系统时,卸载/boot
失败(因为设备正忙,这很明显,因为根文件系统是从位于 /boot 中的 squashfs 文件挂载的)。
有没有办法避免/boot
在重启/关机/断电时卸载,从而避免卸载失败?由于它是以只读方式安装的,所以应该没有任何风险,不是吗?还是我遗漏了什么?
附言:我不知道它是否有帮助和/或相关:我的操作系统初始化是通过 进行管理的systemd
。
这是基于systemd 是否可以在重启之前执行命令?的答案。
当前“启动或重新启动”服务的方法是:
systemctl is-active nginx && systemctl reload nginx || systemctl start nginx
我想知道是否有更好的方法来使用目标等。我感觉我仍在尝试将 systemd 工具用作其他 init 工具。
我使用这种方法的情况是手动调整配置后,这可能会起作用,但在压力测试期间会崩溃,因此我需要在对配置文件进行新的调整后启动或重新启动。显然,这里的“解决方案”可能是生产中不可接受的,因为这是在 vm/dev 框上完成的。
这是在安装 Google Chrome(用于无头浏览器功能)后开始的。我得出结论,这与 Chrome 有关。在安装后的最初几个小时里,我正在构建一个在远程浏览器中调用 Chrome 的短时间运行的脚本。
这个问题有两个方面。systemd 是否可以持续运行?如果可以,如何抑制警报?
几天来,我一直在收到 2 个经销商帐户的以下报告(每小时共 4 份)。请注意,处理时间以“天”为单位。
Time: Sat Oct 19 08:44:54 2024 -0400
Account: accountname
Resource: Process Time
Exceeded: 376436 > 1800 (seconds)
Executable: /usr/lib/systemd/systemd
Command Line: (sd-pam)
PID: 35343 (Parent PID:35342)
Killed: No
和
Time: Sat Oct 19 08:44:54 2024 -0400
Account: accountname
Resource: Process Time
Exceeded: 376436 > 1800 (seconds)
Executable: /usr/lib/systemd/systemd
Command Line: /lib/systemd/systemd --user
PID: 35342 (Parent PID:35342)
Killed: No
在 csf.piginore 中添加以下 4 行并重新启动 LFD 后,警报仍然会出现。
pcmd: /usr/lib/systemd/systemd
pexe: /usr/lib/systemd/systemd
cmd: (sd-pam)
cmd: /lib/systemd/systemd --user
**编辑** 为 grawity 的答案添加图像。
调整服务时的一个用例是在重新启动服务之前测试配置文件。
例如。
$ vim /etc/nginx.conf
$ nginx -t && restart_nginx
与 systemd 相同的是,在发出重新启动命令之前仍然必须记住检查。
有没有什么方法可以防止这种极有可能发生的人为错误?比如?也就是说,在重启的停止步骤之前ExecRestartStopPre
执行某些操作?
我有一个处理用户输入的 Web 应用程序,作为其中的一部分,运行一些命令来systemd-run --user --scope ...
限制内存和 CPU 使用率。
该应用程序在正常运行时运行良好,但是当作为 systemd 服务运行时,我得到:
Failed to connect to bus: No medium found
我需要在单位中做什么才能使该服务启用此功能?
正如常见的那样,lxd
提供了两个 systemd 单元:lxd.socket
和lxd.service
。lxd.socket
启动时,lxd.service
只要任何应用程序(例如lxc
)尝试访问 lxd 守护程序,它就会启动。
我想lxd
在启动时启动,而无需运行任何命令。但是,当我尝试启用 时lxd.service
,它会启用lxd.socket
:
# systemctl enable lxd.service
Created symlink /etc/systemd/system/sockets.target.wants/lxd.socket → /usr/lib/systemd/system/lxd.socket.
这里发生了什么?我怎样才能启用lxd.service
?
系统运行的是 Fedora 39。这些是单元文件:
/usr/lib/systemd/system/lxd.service
:
[Unit]
Description=LXD - main daemon
After=network-online.target openvswitch-switch.service lxcfs.service lxd.socket
Requires=network-online.target lxcfs.service lxd.socket
Documentation=man:lxd(1)
[Service]
Environment=LXD_DOCUMENTATION=/usr/share/doc/lxd-doc/html
Environment=LXD_OVMF_PATH=/usr/share/edk2/ovmf
Environment=LXD_UI=/usr/share/lxd-ui/ui
ExecStart=/usr/bin/lxd --group lxd
ExecStartPost=/usr/bin/lxd waitready --timeout=600
KillMode=process
TimeoutStartSec=600s
TimeoutStopSec=30s
Restart=on-failure
LimitNOFILE=1048576
LimitNPROC=infinity
TasksMax=infinity
[Install]
Also=lxd-containers.service lxd.socket
/usr/lib/systemd/system/lxd.socket
:
[Unit]
Description=LXD - unix socket
Documentation=man:lxd(1)
[Socket]
ListenStream=/var/lib/lxd/unix.socket
SocketGroup=lxd
SocketMode=0660
Service=lxd.service
[Install]
WantedBy=sockets.target
我有一个快速虚拟机,但 systemd 服务systemd-zserdbd.service
失败并显示
Dec 01 17:45:32 server-new systemd[1]: Starting systemd-remount-fs.service...
...
Dec 01 17:45:32 server-new (-userdbd)[183]: systemd-userdbd.service: Failed at step NAMESPACE spawning /usr/lib/systemd/systemd-userdbd: Read-only file system
Dec 01 17:45:32 server-new (-userdbd)[185]: systemd-userdbd.service: Failed at step NAMESPACE spawning /usr/lib/systemd/systemd-userdbd: Read-only file system
Dec 01 17:45:32 server-new systemd[1]: Started systemd-journald.service.
Dec 01 17:45:32 server-new (-userdbd)[186]: systemd-userdbd.service: Failed at step NAMESPACE spawning /usr/lib/systemd/systemd-userdbd: Read-only file system
Dec 01 17:45:32 server-new (-userdbd)[187]: systemd-userdbd.service: Failed at step NAMESPACE spawning /usr/lib/systemd/systemd-userdbd: Read-only file system
Dec 01 17:45:32 server-new (-userdbd)[188]: systemd-userdbd.service: Failed at step NAMESPACE spawning /usr/lib/systemd/systemd-userdbd: Read-only file system
...
Dec 01 17:45:32 server-new systemd-fsck[180]: /usr/bin/fsck.xfs: XFS file system.
Dec 01 17:45:32 server-new systemd[1]: Finished systemd-remount-fs.service.
...
Dec 01 17:45:32 server-new systemd[1]: Reached target local-fs-pre.target.
...
Dec 01 17:45:33 server-new systemd[1]: Reached target local-fs.target.
该错误非常明显:systemd-userdbd.service
需要可写的根文件系统,但在文件系统重新挂载为可写之前启动。
systemctl edit systemd-userdbd.service --drop-in=wait-for-rw-root
因此,我想通过with添加必要的依赖项
[Unit]
Wants=local-fs.target
After=systemd-userdbd.socket systemd-remount-fs.service local-fs.target
但这似乎在启动时创建了循环依赖。重新挂载文件系统需要很长时间,直到 systemd 超时。
- 如何确保
systemd-userdbd.service
在根文件系统变得可写后启动而不创建循环依赖? - (一个更普遍的问题)我如何分析造成循环依赖的原因?